forked from OSchip/llvm-project
Revert "DebugInfo: reduce DIE range verification on object files"
This reverts commits r345441 and r345444, they were causing msan buildbot failures. llvm-svn: 345457
This commit is contained in:
parent
fc7654a67b
commit
50d2683a00
|
@ -97,9 +97,6 @@ private:
|
|||
/// lies between to valid DIEs.
|
||||
std::map<uint64_t, std::set<uint32_t>> 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
|
||||
///
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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
|
||||
|
Loading…
Reference in New Issue