[llvm] r342712 - [dwarfdump] Verify compatibility of attribute TAGs.
Jonas Devlieghere via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 21 00:49:30 PDT 2018
Author: jdevlieghere
Date: Fri Sep 21 00:49:29 2018
New Revision: 342712
URL: http://llvm.org/viewvc/llvm-project?rev=342712&view=rev
Log:
[dwarfdump] Verify compatibility of attribute TAGs.
Verify that DW_AT_specification and DW_AT_abstract_origin reference a
DIE with a compatible tag.
Differential revision: https://reviews.llvm.org/D38719
Added:
llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_compatible_tags.s
Modified:
llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h
llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp
llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h?rev=342712&r1=342711&r2=342712&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h Fri Sep 21 00:49:29 2018
@@ -134,6 +134,10 @@ public:
void addUnitsForDWOSection(DWARFContext &C, const DWARFSection &DWOSection,
DWARFSectionKind SectionKind, bool Lazy = false);
+ /// Add an existing DWARFUnit to this UnitVector. This is used by the DWARF
+ /// verifier to process unit separately.
+ DWARFUnit *addUnit(std::unique_ptr<DWARFUnit> Unit);
+
/// Returns number of all units held by this instance.
unsigned getNumUnits() const { return size(); }
/// Returns number of units from all .debug_info[.dwo] sections.
Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp?rev=342712&r1=342711&r2=342712&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp (original)
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp Fri Sep 21 00:49:29 2018
@@ -112,6 +112,15 @@ void DWARFUnitVector::addUnitsImpl(
}
}
+DWARFUnit *DWARFUnitVector::addUnit(std::unique_ptr<DWARFUnit> Unit) {
+ auto I = std::upper_bound(begin(), end(), Unit,
+ [](const std::unique_ptr<DWARFUnit> &LHS,
+ const std::unique_ptr<DWARFUnit> &RHS) {
+ return LHS->getOffset() < RHS->getOffset();
+ });
+ return this->insert(I, std::move(Unit))->get();
+}
+
DWARFUnit *DWARFUnitVector::getUnitForOffset(uint32_t Offset) const {
auto end = begin() + getNumInfoUnits();
auto *CU =
Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp?rev=342712&r1=342711&r2=342712&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp (original)
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp Fri Sep 21 00:49:29 2018
@@ -261,7 +261,8 @@ unsigned DWARFVerifier::verifyUnitSectio
bool isUnitDWARF64 = false;
bool isHeaderChainValid = true;
bool hasDIE = DebugInfoData.isValidOffset(Offset);
- DWARFUnitVector UnitVector{};
+ DWARFUnitVector TypeUnitVector;
+ DWARFUnitVector CompileUnitVector;
while (hasDIE) {
OffsetStart = Offset;
if (!verifyUnitHeader(DebugInfoData, &Offset, UnitIdx, UnitType,
@@ -272,15 +273,15 @@ unsigned DWARFVerifier::verifyUnitSectio
} else {
DWARFUnitHeader Header;
Header.extract(DCtx, DebugInfoData, &OffsetStart, SectionKind);
- std::unique_ptr<DWARFUnit> Unit;
+ DWARFUnit *Unit;
switch (UnitType) {
case dwarf::DW_UT_type:
case dwarf::DW_UT_split_type: {
- Unit.reset(new DWARFTypeUnit(
+ Unit = TypeUnitVector.addUnit(llvm::make_unique<DWARFTypeUnit>(
DCtx, S, Header, DCtx.getDebugAbbrev(), &DObj.getRangeSection(),
DObj.getStringSection(), DObj.getStringOffsetSection(),
&DObj.getAppleObjCSection(), DObj.getLineSection(),
- DCtx.isLittleEndian(), false, UnitVector));
+ DCtx.isLittleEndian(), false, TypeUnitVector));
break;
}
case dwarf::DW_UT_skeleton:
@@ -289,11 +290,11 @@ unsigned DWARFVerifier::verifyUnitSectio
case dwarf::DW_UT_partial:
// UnitType = 0 means that we are verifying a compile unit in DWARF v4.
case 0: {
- Unit.reset(new DWARFCompileUnit(
+ Unit = CompileUnitVector.addUnit(llvm::make_unique<DWARFCompileUnit>(
DCtx, S, Header, DCtx.getDebugAbbrev(), &DObj.getRangeSection(),
DObj.getStringSection(), DObj.getStringOffsetSection(),
&DObj.getAppleObjCSection(), DObj.getLineSection(),
- DCtx.isLittleEndian(), false, UnitVector));
+ DCtx.isLittleEndian(), false, CompileUnitVector));
break;
}
default: { llvm_unreachable("Invalid UnitType."); }
@@ -444,7 +445,24 @@ unsigned DWARFVerifier::verifyDebugInfoA
}
break;
}
-
+ case DW_AT_specification:
+ case DW_AT_abstract_origin: {
+ if (auto ReferencedDie = Die.getAttributeValueAsReferencedDie(Attr)) {
+ auto DieTag = Die.getTag();
+ auto RefTag = ReferencedDie.getTag();
+ if (DieTag == RefTag)
+ break;
+ if (DieTag == DW_TAG_inlined_subroutine && RefTag == DW_TAG_subprogram)
+ break;
+ if (DieTag == DW_TAG_variable && RefTag == DW_TAG_member)
+ break;
+ ReportError("DIE with tag " + TagString(DieTag) + " has " +
+ AttributeString(Attr) +
+ " that points to DIE with "
+ "incompatible tag " +
+ TagString(RefTag));
+ }
+ }
default:
break;
}
Added: llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_compatible_tags.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_compatible_tags.s?rev=342712&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_compatible_tags.s (added)
+++ llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_compatible_tags.s Fri Sep 21 00:49:29 2018
@@ -0,0 +1,386 @@
+# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o - \
+# RUN: | not llvm-dwarfdump -v -verify - \
+# RUN: | FileCheck %s
+
+# Source:
+#
+# void f1() {}
+# __attribute__((always_inline)) void f2() {
+# f1();
+# }
+# int main() {
+# f2();
+# }
+#
+# Compile with:
+#
+# $ clang -g inlined.c -O0 -S -o inlined.s
+#
+# Manually patch the DW_AT_abstract_origin to point to the
+# DW_TAG_base_type and DW_TAG_compile_unit respectively.
+
+# CHECK: error: DIE with tag DW_TAG_subprogram has DW_AT_abstract_origin that points to DIE with incompatible tag DW_TAG_base_type
+# CHECK: DW_TAG_subprogram
+
+# CHECK: error: DIE with tag DW_TAG_inlined_subroutine has DW_AT_abstract_origin that points to DIE with incompatible tag DW_TAG_compile_unit
+# CHECK: DW_TAG_inlined_subroutine
+
+ .section __TEXT,__text,regular,pure_instructions
+ .macosx_version_min 10, 13
+ .globl _f1 ## -- Begin function f1
+ .p2align 4, 0x90
+_f1: ## @f1
+Lfunc_begin0:
+ .file 1 "inlined.c"
+ .loc 1 1 0 ## inlined.c:1:0
+ .cfi_startproc
+## BB#0: ## %entry
+ pushq %rbp
+ .cfi_def_cfa_offset 16
+ .cfi_offset %rbp, -16
+ movq %rsp, %rbp
+ .cfi_def_cfa_register %rbp
+Ltmp0:
+ .loc 1 1 12 prologue_end ## inlined.c:1:12
+ popq %rbp
+ retq
+Ltmp1:
+Lfunc_end0:
+ .cfi_endproc
+ ## -- End function
+ .globl _f2 ## -- Begin function f2
+ .p2align 4, 0x90
+_f2: ## @f2
+Lfunc_begin1:
+ .loc 1 3 0 ## inlined.c:3:0
+ .cfi_startproc
+## BB#0: ## %entry
+ pushq %rbp
+ .cfi_def_cfa_offset 16
+ .cfi_offset %rbp, -16
+ movq %rsp, %rbp
+ .cfi_def_cfa_register %rbp
+Ltmp2:
+ .loc 1 4 3 prologue_end ## inlined.c:4:3
+ callq _f1
+ .loc 1 5 1 ## inlined.c:5:1
+ popq %rbp
+ retq
+Ltmp3:
+Lfunc_end1:
+ .cfi_endproc
+ ## -- End function
+ .globl _main ## -- Begin function main
+ .p2align 4, 0x90
+_main: ## @main
+Lfunc_begin2:
+ .loc 1 7 0 ## inlined.c:7:0
+ .cfi_startproc
+## BB#0: ## %entry
+ pushq %rbp
+ .cfi_def_cfa_offset 16
+ .cfi_offset %rbp, -16
+ movq %rsp, %rbp
+ .cfi_def_cfa_register %rbp
+Ltmp4:
+ .loc 1 4 3 prologue_end ## inlined.c:4:3
+ callq _f1
+ xorl %eax, %eax
+Ltmp5:
+ .loc 1 9 1 ## inlined.c:9:1
+ popq %rbp
+ retq
+Ltmp6:
+Lfunc_end2:
+ .cfi_endproc
+ ## -- End function
+ .section __DWARF,__debug_str,regular,debug
+Linfo_string:
+ .asciz "clang version 6.0.0 (trunk 315286) (llvm/trunk 315291)" ## string offset=0
+ .asciz "inlined.c" ## string offset=55
+ .asciz "/private/tmp" ## string offset=65
+ .asciz "f1" ## string offset=78
+ .asciz "f2" ## string offset=81
+ .asciz "main" ## string offset=84
+ .asciz "int" ## string offset=89
+ .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 23 ## DW_FORM_sec_offset
+ .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 6 ## DW_FORM_data4
+ .byte 0 ## EOM(1)
+ .byte 0 ## EOM(2)
+ .byte 2 ## Abbreviation Code
+ .byte 46 ## DW_TAG_subprogram
+ .byte 0 ## DW_CHILDREN_no
+ .byte 17 ## DW_AT_low_pc
+ .byte 1 ## DW_FORM_addr
+ .byte 18 ## DW_AT_high_pc
+ .byte 6 ## DW_FORM_data4
+ .byte 64 ## DW_AT_frame_base
+ .byte 24 ## DW_FORM_exprloc
+ .byte 3 ## DW_AT_name
+ .byte 14 ## DW_FORM_strp
+ .byte 58 ## DW_AT_decl_file
+ .byte 11 ## DW_FORM_data1
+ .byte 59 ## DW_AT_decl_line
+ .byte 11 ## DW_FORM_data1
+ .byte 63 ## DW_AT_external
+ .byte 25 ## DW_FORM_flag_present
+ .byte 0 ## EOM(1)
+ .byte 0 ## EOM(2)
+ .byte 3 ## Abbreviation Code
+ .byte 46 ## DW_TAG_subprogram
+ .byte 0 ## DW_CHILDREN_no
+ .byte 17 ## DW_AT_low_pc
+ .byte 1 ## DW_FORM_addr
+ .byte 18 ## DW_AT_high_pc
+ .byte 6 ## DW_FORM_data4
+ .byte 64 ## DW_AT_frame_base
+ .byte 24 ## DW_FORM_exprloc
+ .byte 49 ## DW_AT_abstract_origin
+ .byte 19 ## DW_FORM_ref4
+ .byte 0 ## EOM(1)
+ .byte 0 ## EOM(2)
+ .byte 4 ## Abbreviation Code
+ .byte 46 ## DW_TAG_subprogram
+ .byte 0 ## DW_CHILDREN_no
+ .byte 3 ## DW_AT_name
+ .byte 14 ## DW_FORM_strp
+ .byte 58 ## DW_AT_decl_file
+ .byte 11 ## DW_FORM_data1
+ .byte 59 ## DW_AT_decl_line
+ .byte 11 ## DW_FORM_data1
+ .byte 63 ## DW_AT_external
+ .byte 25 ## DW_FORM_flag_present
+ .byte 32 ## DW_AT_inline
+ .byte 11 ## DW_FORM_data1
+ .byte 0 ## EOM(1)
+ .byte 0 ## EOM(2)
+ .byte 5 ## Abbreviation Code
+ .byte 46 ## DW_TAG_subprogram
+ .byte 1 ## DW_CHILDREN_yes
+ .byte 17 ## DW_AT_low_pc
+ .byte 1 ## DW_FORM_addr
+ .byte 18 ## DW_AT_high_pc
+ .byte 6 ## DW_FORM_data4
+ .byte 64 ## DW_AT_frame_base
+ .byte 24 ## DW_FORM_exprloc
+ .byte 3 ## DW_AT_name
+ .byte 14 ## DW_FORM_strp
+ .byte 58 ## DW_AT_decl_file
+ .byte 11 ## DW_FORM_data1
+ .byte 59 ## DW_AT_decl_line
+ .byte 11 ## DW_FORM_data1
+ .byte 73 ## DW_AT_type
+ .byte 19 ## DW_FORM_ref4
+ .byte 63 ## DW_AT_external
+ .byte 25 ## DW_FORM_flag_present
+ .byte 0 ## EOM(1)
+ .byte 0 ## EOM(2)
+ .byte 6 ## Abbreviation Code
+ .byte 29 ## DW_TAG_inlined_subroutine
+ .byte 0 ## DW_CHILDREN_no
+ .byte 49 ## DW_AT_abstract_origin
+ .byte 19 ## DW_FORM_ref4
+ .byte 17 ## DW_AT_low_pc
+ .byte 1 ## DW_FORM_addr
+ .byte 18 ## DW_AT_high_pc
+ .byte 6 ## DW_FORM_data4
+ .byte 88 ## DW_AT_call_file
+ .byte 11 ## DW_FORM_data1
+ .byte 89 ## DW_AT_call_line
+ .byte 11 ## DW_FORM_data1
+ .byte 0 ## EOM(1)
+ .byte 0 ## EOM(2)
+ .byte 7 ## Abbreviation Code
+ .byte 36 ## DW_TAG_base_type
+ .byte 0 ## DW_CHILDREN_no
+ .byte 3 ## DW_AT_name
+ .byte 14 ## DW_FORM_strp
+ .byte 62 ## DW_AT_encoding
+ .byte 11 ## DW_FORM_data1
+ .byte 11 ## DW_AT_byte_size
+ .byte 11 ## DW_FORM_data1
+ .byte 0 ## EOM(1)
+ .byte 0 ## EOM(2)
+ .byte 0 ## EOM(3)
+ .section __DWARF,__debug_info,regular,debug
+Lsection_info:
+Lcu_begin0:
+ .long 139 ## Length of Unit
+ .short 4 ## 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:0x84 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 65 ## DW_AT_comp_dir
+ .quad Lfunc_begin0 ## DW_AT_low_pc
+Lset2 = Lfunc_end2-Lfunc_begin0 ## DW_AT_high_pc
+ .long Lset2
+ .byte 2 ## Abbrev [2] 0x2a:0x15 DW_TAG_subprogram
+ .quad Lfunc_begin0 ## DW_AT_low_pc
+Lset3 = Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc
+ .long Lset3
+ .byte 1 ## DW_AT_frame_base
+ .byte 86
+ .long 78 ## DW_AT_name
+ .byte 1 ## DW_AT_decl_file
+ .byte 1 ## DW_AT_decl_line
+ ## DW_AT_external
+ .byte 3 ## Abbrev [3] 0x3f:0x13 DW_TAG_subprogram
+ .quad Lfunc_begin1 ## DW_AT_low_pc
+Lset4 = Lfunc_end1-Lfunc_begin1 ## DW_AT_high_pc
+ .long Lset4
+ .byte 1 ## DW_AT_frame_base
+ .byte 86
+ .long 135 ## DW_AT_abstract_origin
+ .byte 4 ## Abbrev [4] 0x52:0x8 DW_TAG_subprogram
+ .long 81 ## DW_AT_name
+ .byte 1 ## DW_AT_decl_file
+ .byte 2 ## DW_AT_decl_line
+ ## DW_AT_external
+ .byte 1 ## DW_AT_inline
+ .byte 5 ## Abbrev [5] 0x5a:0x2d DW_TAG_subprogram
+ .quad Lfunc_begin2 ## DW_AT_low_pc
+Lset5 = Lfunc_end2-Lfunc_begin2 ## DW_AT_high_pc
+ .long Lset5
+ .byte 1 ## DW_AT_frame_base
+ .byte 86
+ .long 84 ## DW_AT_name
+ .byte 1 ## DW_AT_decl_file
+ .byte 6 ## DW_AT_decl_line
+ .long 135 ## DW_AT_type
+ ## DW_AT_external
+ .byte 6 ## Abbrev [6] 0x73:0x13 DW_TAG_inlined_subroutine
+ .long 11 ## DW_AT_abstract_origin
+ .quad Ltmp4 ## DW_AT_low_pc
+Lset6 = Ltmp5-Ltmp4 ## DW_AT_high_pc
+ .long Lset6
+ .byte 1 ## DW_AT_call_file
+ .byte 8 ## DW_AT_call_line
+ .byte 0 ## End Of Children Mark
+ .byte 7 ## Abbrev [7] 0x87:0x7 DW_TAG_base_type
+ .long 89 ## DW_AT_name
+ .byte 5 ## DW_AT_encoding
+ .byte 4 ## DW_AT_byte_size
+ .byte 0 ## End Of Children Mark
+ .section __DWARF,__debug_ranges,regular,debug
+Ldebug_range:
+ .section __DWARF,__debug_macinfo,regular,debug
+Ldebug_macinfo:
+Lcu_macro_begin0:
+ .byte 0 ## End Of Macro List Mark
+ .section __DWARF,__apple_names,regular,debug
+Lnames_begin:
+ .long 1212240712 ## Header Magic
+ .short 1 ## Header Version
+ .short 0 ## Header Hash Function
+ .long 3 ## Header Bucket Count
+ .long 3 ## Header Hash Count
+ .long 12 ## Header Data Length
+ .long 0 ## HeaderData Die Offset Base
+ .long 1 ## HeaderData Atom Count
+ .short 1 ## DW_ATOM_die_offset
+ .short 6 ## DW_FORM_data4
+ .long -1 ## Bucket 0
+ .long 0 ## Bucket 1
+ .long 2 ## Bucket 2
+ .long 5863324 ## Hash in Bucket 1
+ .long 2090499946 ## Hash in Bucket 1
+ .long 5863325 ## Hash in Bucket 2
+ .long LNames1-Lnames_begin ## Offset in Bucket 1
+ .long LNames0-Lnames_begin ## Offset in Bucket 1
+ .long LNames2-Lnames_begin ## Offset in Bucket 2
+LNames1:
+ .long 78 ## f1
+ .long 1 ## Num DIEs
+ .long 42
+ .long 0
+LNames0:
+ .long 84 ## main
+ .long 1 ## Num DIEs
+ .long 90
+ .long 0
+LNames2:
+ .long 81 ## f2
+ .long 2 ## Num DIEs
+ .long 63
+ .long 115
+ .long 0
+ .section __DWARF,__apple_objc,regular,debug
+Lobjc_begin:
+ .long 1212240712 ## Header Magic
+ .short 1 ## Header Version
+ .short 0 ## Header Hash Function
+ .long 1 ## Header Bucket Count
+ .long 0 ## Header Hash Count
+ .long 12 ## Header Data Length
+ .long 0 ## HeaderData Die Offset Base
+ .long 1 ## HeaderData Atom Count
+ .short 1 ## DW_ATOM_die_offset
+ .short 6 ## DW_FORM_data4
+ .long -1 ## Bucket 0
+ .section __DWARF,__apple_namespac,regular,debug
+Lnamespac_begin:
+ .long 1212240712 ## Header Magic
+ .short 1 ## Header Version
+ .short 0 ## Header Hash Function
+ .long 1 ## Header Bucket Count
+ .long 0 ## Header Hash Count
+ .long 12 ## Header Data Length
+ .long 0 ## HeaderData Die Offset Base
+ .long 1 ## HeaderData Atom Count
+ .short 1 ## DW_ATOM_die_offset
+ .short 6 ## DW_FORM_data4
+ .long -1 ## Bucket 0
+ .section __DWARF,__apple_types,regular,debug
+Ltypes_begin:
+ .long 1212240712 ## Header Magic
+ .short 1 ## Header Version
+ .short 0 ## Header Hash Function
+ .long 1 ## Header Bucket Count
+ .long 1 ## Header Hash Count
+ .long 20 ## Header Data Length
+ .long 0 ## HeaderData Die Offset Base
+ .long 3 ## HeaderData Atom Count
+ .short 1 ## DW_ATOM_die_offset
+ .short 6 ## DW_FORM_data4
+ .short 3 ## DW_ATOM_die_tag
+ .short 5 ## DW_FORM_data2
+ .short 4 ## DW_ATOM_type_flags
+ .short 11 ## DW_FORM_data1
+ .long 0 ## Bucket 0
+ .long 193495088 ## Hash in Bucket 0
+ .long Ltypes0-Ltypes_begin ## Offset in Bucket 0
+Ltypes0:
+ .long 89 ## int
+ .long 1 ## Num DIEs
+ .long 135
+ .short 36
+ .byte 0
+ .long 0
+
+.subsections_via_symbols
+ .section __DWARF,__debug_line,regular,debug
+Lsection_line:
+Lline_table_start0:
More information about the llvm-commits
mailing list