From 50d2683a005f3a46ddfae52ca2745a89d4831195 Mon Sep 17 00:00:00 2001 From: Vlad Tsyrklevich Date: Sat, 27 Oct 2018 17:39:13 +0000 Subject: [PATCH] Revert "DebugInfo: reduce DIE range verification on object files" This reverts commits r345441 and r345444, they were causing msan buildbot failures. llvm-svn: 345457 --- .../llvm/DebugInfo/DWARF/DWARFVerifier.h | 7 +-- llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp | 57 +++++-------------- .../llvm-dwarfdump/X86/debug-verify-object.s | 57 ------------------- 3 files changed, 15 insertions(+), 106 deletions(-) delete mode 100644 llvm/test/tools/llvm-dwarfdump/X86/debug-verify-object.s diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h index e47fbea5646e..3ad65cf51b1b 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h @@ -97,9 +97,6 @@ private: /// lies between to valid DIEs. std::map> ReferenceToDIEOffsets; uint32_t NumDebugLineErrors = 0; - // Used to relax some checks that do not currently work portably - bool IsObjectFile; - bool IsMachOObject; raw_ostream &error() const; raw_ostream &warn() const; @@ -289,8 +286,8 @@ private: public: DWARFVerifier(raw_ostream &S, DWARFContext &D, - DIDumpOptions DumpOpts = DIDumpOptions::getForSingleDIE()); - + DIDumpOptions DumpOpts = DIDumpOptions::getForSingleDIE()) + : OS(S), DCtx(D), DumpOpts(std::move(DumpOpts)) {} /// Verify the information in any of the following sections, if available: /// .debug_abbrev, debug_abbrev.dwo /// diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp index 1f089a7030d0..d30600accd0f 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -394,42 +394,20 @@ unsigned DWARFVerifier::verifyDieRanges(const DWARFDie &Die, // Build RI for this DIE and check that ranges within this DIE do not // overlap. DieRangeInfo RI(Die); + for (auto Range : Ranges) { + if (!Range.valid()) { + ++NumErrors; + error() << "Invalid address range " << Range << "\n"; + continue; + } - // TODO support object files better - // - // Some object file formats (i.e. non-MachO) support COMDAT. ELF in - // particular does so by placing each function into a section. The DWARF data - // for the function at that point uses a section relative DW_FORM_addrp for - // the DW_AT_low_pc and a DW_FORM_data4 for the offset as the DW_AT_high_pc. - // In such a case, when the Die is the CU, the ranges will overlap, and we - // will flag valid conflicting ranges as invalid. - // - // For such targets, we should read the ranges from the CU and partition them - // by the section id. The ranges within a particular section should be - // disjoint, although the ranges across sections may overlap. We would map - // the child die to the entity that it references and the section with which - // it is associated. The child would then be checked against the range - // information for the associated section. - // - // For now, simply elide the range verification for the CU DIEs if we are - // processing an object file. - - if (!IsObjectFile || IsMachOObject || Die.getTag() == DW_TAG_subprogram) { - for (auto Range : Ranges) { - if (!Range.valid()) { - ++NumErrors; - error() << "Invalid address range " << Range << "\n"; - continue; - } - - // Verify that ranges don't intersect. - const auto IntersectingRange = RI.insert(Range); - if (IntersectingRange != RI.Ranges.end()) { - ++NumErrors; - error() << "DIE has overlapping address ranges: " << Range << " and " - << *IntersectingRange << "\n"; - break; - } + // Verify that ranges don't intersect. + const auto IntersectingRange = RI.insert(Range); + if (IntersectingRange != RI.Ranges.end()) { + ++NumErrors; + error() << "DIE has overlapping address ranges: " << Range << " and " + << *IntersectingRange << "\n"; + break; } } @@ -767,15 +745,6 @@ void DWARFVerifier::verifyDebugLineRows() { } } -DWARFVerifier::DWARFVerifier(raw_ostream &S, DWARFContext &D, - DIDumpOptions DumpOpts) - : OS(S), DCtx(D), DumpOpts(std::move(DumpOpts)) { - if (const auto *F = DCtx.getDWARFObj().getFile()) { - IsObjectFile = F->isRelocatableObject(); - IsMachOObject = F->isMachO(); - } -} - bool DWARFVerifier::handleDebugLine() { NumDebugLineErrors = 0; OS << "Verifying .debug_line...\n"; diff --git a/llvm/test/tools/llvm-dwarfdump/X86/debug-verify-object.s b/llvm/test/tools/llvm-dwarfdump/X86/debug-verify-object.s deleted file mode 100644 index be79c95c0b15..000000000000 --- a/llvm/test/tools/llvm-dwarfdump/X86/debug-verify-object.s +++ /dev/null @@ -1,57 +0,0 @@ -# RUN: llvm-mc -triple x86_64-unknown-linux-gnu -filetype obj -o - %s | llvm-dwarfdump --verify - - - .text - - .section .text.f,"ax",@progbits - .globl f - .type f,@function -f: -.Lfunc_begin0: - pushq $32 - popq %rax - retq -.Lfunc_end0: - .size f, .Lfunc_end0-f - - .section .text.g,"ax",@progbits - .globl g - .type g,@function -g: -.Lfunc_begin1: - pushq $64 - popq %rax - retq -.Lfunc_end1: - .size g, .Lfunc_end1-g - - .section .debug_abbrev,"",@progbits - .byte 1 # Abbreviation Code - .byte 17 # DW_TAG_compile_unit - .byte 0 # DW_CHILDREN_no - .byte 17 # DW_AT_low_pc - .byte 1 # DW_FORM_addr - .byte 85 # DW_AT_ranges - .byte 23 # DW_FORM_sec_offset - .byte 0 # EOM(1) - .byte 0 # EOM(2) - .byte 0 # EOM(3) - - .section .debug_info,"",@progbits -.Lcu_begin0: - .long 20 # Length of Unit - .short 4 # DWARF version number - .long .debug_abbrev # Offset Into Abbrev. Section - .byte 8 # Address Size (in bytes) - .byte 1 # Abbrev [1] 0xb:0x1f DW_TAG_compile_unit - .quad 0 # DW_AT_low_pc - .long .Ldebug_ranges0 # DW_AT_ranges - - .section .debug_ranges,"",@progbits -.Ldebug_ranges0: - .quad .Lfunc_begin0 - .quad .Lfunc_end0 - .quad .Lfunc_begin1 - .quad .Lfunc_end1 - .quad 0 - .quad 0 -