Skip to content

Commit

Permalink
[DWARF] Added verification check for die ranges. If highPC is an addr…
Browse files Browse the repository at this point in the history
…ess, then it should be greater than lowPC for each range.

Differential Revision: https://reviews.llvm.org/D35733

llvm-svn: 308928
  • Loading branch information
Spyridoula Gravani committed Jul 24, 2017
1 parent d7065e5 commit e0ba415
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 0 deletions.
9 changes: 9 additions & 0 deletions llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,15 @@ class DWARFVerifier {


bool verifyUnitContents(DWARFUnit Unit);

/// Verify that all Die ranges are valid.
///
/// This function currently checks for:
/// - cases in which lowPC >= highPC
///
/// \returns Number of errors that occured during verification.
unsigned verifyDieRanges(const DWARFDie &Die);

/// Verifies the attribute's DWARF attribute and its value.
///
/// This function currently checks for:
Expand Down
13 changes: 13 additions & 0 deletions llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ bool DWARFVerifier::verifyUnitContents(DWARFUnit Unit) {
auto Die = Unit.getDIEAtIndex(I);
if (Die.getTag() == DW_TAG_null)
continue;
NumUnitErrors += verifyDieRanges(Die);
for (auto AttrValue : Die.attributes()) {
NumUnitErrors += verifyDebugInfoAttribute(Die, AttrValue);
NumUnitErrors += verifyDebugInfoForm(Die, AttrValue);
Expand Down Expand Up @@ -209,6 +210,18 @@ bool DWARFVerifier::handleDebugInfo() {
return (isHeaderChainValid && NumDebugInfoErrors == 0);
}

unsigned DWARFVerifier::verifyDieRanges(const DWARFDie &Die) {
unsigned NumErrors = 0;
for (auto Range : Die.getAddressRanges()) {
if (Range.LowPC >= Range.HighPC) {
++NumErrors;
OS << format("error: Invalid address range [0x%08x - 0x%08x].\n",
Range.LowPC, Range.HighPC);
}
}
return NumErrors;
}

unsigned DWARFVerifier::verifyDebugInfoAttribute(const DWARFDie &Die,
DWARFAttribute &AttrValue) {
const DWARFObject &DObj = DCtx.getDWARFObj();
Expand Down
82 changes: 82 additions & 0 deletions llvm/test/tools/llvm-dwarfdump/X86/verify_die_ranges.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o - \
# RUN: | not llvm-dwarfdump -verify - \
# RUN: | FileCheck %s

# CHECK: Verifying .debug_info Unit Header Chain...
# CHECK-NEXT: error: Invalid address range [0x00000007 - 0x00000006].

.section __TEXT,__text,regular,pure_instructions
.macosx_version_min 10, 12
.globl _foo ## -- Begin function foo
.p2align 4, 0x90
_foo: ## @foo
Lfunc_begin0:
.file 1 "basic.c"
.loc 1 1 0 ## basic.c:1:0
.cfi_startproc
## BB#0: ## %entry
pushq %rbp
Lcfi0:
.cfi_def_cfa_offset 16
Lcfi1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Lcfi2:
.cfi_def_cfa_register %rbp
Ltmp0:
.loc 1 1 17 prologue_end ## basic.c:1:17
popq %rbp
retq
Ltmp1:
Lfunc_end0:
.cfi_endproc
## -- End function
.section __DWARF,__debug_str,regular,debug
Linfo_string:
.asciz "clang version 6.0.0 (trunk 308773) (llvm/trunk 308774)" ## string offset=0
.asciz "basic.c" ## string offset=55
.asciz "/Users/sgravani/Development/tests" ## string offset=63
.asciz "foo" ## string offset=97
.section __DWARF,__debug_abbrev,regular,debug
Lsection_abbrev:
.byte 1 ## Abbreviation Code
.byte 17 ## DW_TAG_compile_unit
.byte 1 ## DW_CHILDREN_yes
.byte 37 ## DW_AT_producer
.byte 14 ## DW_FORM_strp
.byte 19 ## DW_AT_language
.byte 5 ## DW_FORM_data2
.byte 3 ## DW_AT_name
.byte 14 ## DW_FORM_strp
.byte 16 ## DW_AT_stmt_list
.byte 6 ## DW_FORM_data4
.byte 27 ## DW_AT_comp_dir
.byte 14 ## DW_FORM_strp
.byte 17 ## DW_AT_low_pc
.byte 1 ## DW_FORM_addr
.byte 18 ## DW_AT_high_pc
.byte 1 ## DW_FORM_addr
.byte 0 ## EOM(1)
.byte 0 ## EOM(2)
.section __DWARF,__debug_info,regular,debug
Lsection_info:
Lcu_begin0:
.long 43 ## Length of Unit
.short 3 ## DWARF version number
Lset0 = Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section
.long Lset0
.byte 8 ## Address Size (in bytes)
.byte 1 ## Abbrev [1] 0xb:0x3f DW_TAG_compile_unit
.long 0 ## DW_AT_producer
.short 12 ## DW_AT_language
.long 55 ## DW_AT_name
Lset1 = Lline_table_start0-Lsection_line ## DW_AT_stmt_list
.long Lset1
.long 63 ## DW_AT_comp_dir
.quad Lfunc_end0 + 1 ## DW_AT_low_pc -- error: Invalid address range [0x00000007 - 0x00000006].
.quad Lfunc_end0 ## DW_AT_high_pc
.byte 0 ## End Of Children Mark
.subsections_via_symbols
.section __DWARF,__debug_line,regular,debug
Lsection_line:
Lline_table_start0:

0 comments on commit e0ba415

Please sign in to comment.