mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
Revert "Revert "DebugInfo: reduce DIE range verification on object files""
This reverts commit 836c763dadbd9478fa35b1a291a38bf17aa206ba. Default initialize the values that MSAN caught. llvm-svn: 345482
This commit is contained in:
parent
c89ec9f709
commit
28e761aac2
@ -97,6 +97,9 @@ 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;
|
||||
@ -286,8 +289,8 @@ private:
|
||||
|
||||
public:
|
||||
DWARFVerifier(raw_ostream &S, DWARFContext &D,
|
||||
DIDumpOptions DumpOpts = DIDumpOptions::getForSingleDIE())
|
||||
: OS(S), DCtx(D), DumpOpts(std::move(DumpOpts)) {}
|
||||
DIDumpOptions DumpOpts = DIDumpOptions::getForSingleDIE());
|
||||
|
||||
/// Verify the information in any of the following sections, if available:
|
||||
/// .debug_abbrev, debug_abbrev.dwo
|
||||
///
|
||||
|
@ -394,20 +394,42 @@ 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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -745,6 +767,16 @@ void DWARFVerifier::verifyDebugLineRows() {
|
||||
}
|
||||
}
|
||||
|
||||
DWARFVerifier::DWARFVerifier(raw_ostream &S, DWARFContext &D,
|
||||
DIDumpOptions DumpOpts)
|
||||
: OS(S), DCtx(D), DumpOpts(std::move(DumpOpts)), IsObjectFile(false),
|
||||
IsMachOObject(false) {
|
||||
if (const auto *F = DCtx.getDWARFObj().getFile()) {
|
||||
IsObjectFile = F->isRelocatableObject();
|
||||
IsMachOObject = F->isMachO();
|
||||
}
|
||||
}
|
||||
|
||||
bool DWARFVerifier::handleDebugLine() {
|
||||
NumDebugLineErrors = 0;
|
||||
OS << "Verifying .debug_line...\n";
|
||||
|
57
test/tools/llvm-dwarfdump/X86/debug-verify-object.s
Normal file
57
test/tools/llvm-dwarfdump/X86/debug-verify-object.s
Normal file
@ -0,0 +1,57 @@
|
||||
# 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
Block a user