forked from OSchip/llvm-project
[DWARF] Added verification check for die ranges. If highPC is an address, then it should be greater than lowPC for each range.
Differential Revision: https://reviews.llvm.org/D35733 llvm-svn: 308928
This commit is contained in:
parent
d7065e5df5
commit
e0ba415740
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
@ -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();
|
||||
|
|
|
@ -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:
|
Loading…
Reference in New Issue