[llvm] eafe0cf - DWARFDebugLoclists: stricter base address handling
Pavel Labath via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 14 01:02:51 PST 2019
Author: Pavel Labath
Date: 2019-11-14T10:01:48+01:00
New Revision: eafe0cf5fa8255257bac3923237e62382610e6d6
URL: https://github.com/llvm/llvm-project/commit/eafe0cf5fa8255257bac3923237e62382610e6d6
DIFF: https://github.com/llvm/llvm-project/commit/eafe0cf5fa8255257bac3923237e62382610e6d6.diff
LOG: DWARFDebugLoclists: stricter base address handling
Summary:
This removes the use of zero as a base address in section-based dumping.
Although this will often be true for (unlinked) object files with a
single compile unit, it is not true in general. This means that
section-based dumping will not be able to resolve entries referencing
the base address (DW_LLE_offset_pair) -- it wasn't able to do that
correctly before either, but now it will be more explicit about it. One
exception to that is if the location list contains an explicit
DW_LLE_base_address entry -- in this case the dumper will pick it up,
and resolve subsequent entries normally.
The patch also removes the fallback to zero in the "inline" dumping in
case the compile unit does not contain a base address.
Reviewers: dblaikie, probinson, JDevlieghere, aprantl, SouraVX
Subscribers: hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D70115
Added:
Modified:
llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h
llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
llvm/test/DebugInfo/X86/dwarfdump-debug-loclists.test
llvm/test/tools/llvm-dwarfdump/X86/debug_loclists.s
llvm/test/tools/llvm-dwarfdump/X86/debug_loclists_multiple.s
Removed:
################################################################################
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h
index 356757b5724d..7391061d3d0a 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h
@@ -58,7 +58,8 @@ class DWARFLocationTable {
/// iff it has successfully reched the end of the list. This means that one
/// can attempt to parse another list after the current one (\p Offset will be
/// updated to point past the end of the current list).
- bool dumpLocationList(uint64_t *Offset, raw_ostream &OS, uint64_t BaseAddr,
+ bool dumpLocationList(uint64_t *Offset, raw_ostream &OS,
+ Optional<object::SectionedAddress> BaseAddr,
const MCRegisterInfo *MRI, DWARFUnit *U,
DIDumpOptions DumpOpts, unsigned Indent) const;
@@ -133,8 +134,7 @@ class DWARFDebugLoclists final : public DWARFLocationTable {
/// Dump all location lists within the given range.
void dumpRange(uint64_t StartOffset, uint64_t Size, raw_ostream &OS,
- uint64_t BaseAddr, const MCRegisterInfo *MRI,
- DIDumpOptions DumpOpts);
+ const MCRegisterInfo *MRI, DIDumpOptions DumpOpts);
protected:
void dumpRawEntry(const DWARFLocationEntry &Entry, raw_ostream &OS,
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
index 7ca319baa8e4..5a1668442fcf 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
@@ -306,14 +306,13 @@ static void dumpLoclistsSection(raw_ostream &OS, DIDumpOptions DumpOpts,
if (DumpOffset) {
if (DumpOffset >= Offset && DumpOffset < EndOffset) {
Offset = *DumpOffset;
- Loc.dumpLocationList(&Offset, OS, /*BaseAddr=*/0, MRI, nullptr,
+ Loc.dumpLocationList(&Offset, OS, /*BaseAddr=*/None, MRI, nullptr,
DumpOpts, /*Indent=*/0);
OS << "\n";
return;
}
} else {
- Loc.dumpRange(Offset, EndOffset - Offset, OS, /*BaseAddr=*/0, MRI,
- DumpOpts);
+ Loc.dumpRange(Offset, EndOffset - Offset, OS, MRI, DumpOpts);
}
Offset = EndOffset;
}
@@ -409,12 +408,11 @@ void DWARFContext::dump(
if (*Off) {
uint64_t Offset = **Off;
Loc.dumpLocationList(&Offset, OS,
- /*BaseAddr=*/0, getRegisterInfo(), nullptr, DumpOpts,
- /*Indent=*/0);
+ /*BaseAddr=*/None, getRegisterInfo(), nullptr,
+ DumpOpts, /*Indent=*/0);
OS << "\n";
} else {
- Loc.dumpRange(0, Data.getData().size(), OS, /*BaseAddr=*/0,
- getRegisterInfo(), DumpOpts);
+ Loc.dumpRange(0, Data.getData().size(), OS, getRegisterInfo(), DumpOpts);
}
}
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
index 8bb9fc5837d3..f84de263a782 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
@@ -102,13 +102,12 @@ static void dumpExpression(raw_ostream &OS, ArrayRef<uint8_t> Data,
}
bool DWARFLocationTable::dumpLocationList(uint64_t *Offset, raw_ostream &OS,
- uint64_t BaseAddr,
+ Optional<SectionedAddress> BaseAddr,
const MCRegisterInfo *MRI,
DWARFUnit *U, DIDumpOptions DumpOpts,
unsigned Indent) const {
DWARFLocationInterpreter Interp(
- SectionedAddress{BaseAddr, SectionedAddress::UndefSection},
- [U](uint32_t Index) -> Optional<SectionedAddress> {
+ BaseAddr, [U](uint32_t Index) -> Optional<SectionedAddress> {
if (U)
return U->getAddrOffsetSectionItem(Index);
return None;
@@ -342,8 +341,7 @@ void DWARFDebugLoclists::dumpRawEntry(const DWARFLocationEntry &Entry,
}
void DWARFDebugLoclists::dumpRange(uint64_t StartOffset, uint64_t Size,
- raw_ostream &OS, uint64_t BaseAddr,
- const MCRegisterInfo *MRI,
+ raw_ostream &OS, const MCRegisterInfo *MRI,
DIDumpOptions DumpOpts) {
if (!Data.isValidOffsetForDataOfSize(StartOffset, Size)) {
OS << "Invalid dump range\n";
@@ -356,7 +354,7 @@ void DWARFDebugLoclists::dumpRange(uint64_t StartOffset, uint64_t Size,
OS << Separator;
Separator = "\n";
- CanContinue = dumpLocationList(&Offset, OS, BaseAddr, MRI, nullptr,
+ CanContinue = dumpLocationList(&Offset, OS, /*BaseAddr=*/None, MRI, nullptr,
DumpOpts, /*Indent=*/12);
OS << '\n';
}
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
index 308f731570cd..abe63f2716a2 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
@@ -96,12 +96,10 @@ static void dumpLocation(raw_ostream &OS, DWARFFormValue &FormValue,
LLDumpOpts.Verbose = false;
uint64_t Offset = *FormValue.getAsSectionOffset();
- uint64_t BaseAddr = 0;
- if (Optional<object::SectionedAddress> BA = U->getBaseAddress())
- BaseAddr = BA->Address;
if (const DWARFLocationTable *LT = U->getLocationTable()) {
- LT->dumpLocationList(&Offset, OS, BaseAddr, MRI, U, LLDumpOpts, Indent);
+ LT->dumpLocationList(&Offset, OS, U->getBaseAddress(), MRI, U, LLDumpOpts,
+ Indent);
return;
}
@@ -114,6 +112,9 @@ static void dumpLocation(raw_ostream &OS, DWARFFormValue &FormValue,
if (Expected<DWARFDebugLoc::LocationList> LL =
DebugLoc.parseOneLocationList(Data, &Offset)) {
+ uint64_t BaseAddr = 0;
+ if (Optional<object::SectionedAddress> BA = U->getBaseAddress())
+ BaseAddr = BA->Address;
LL->dump(OS, BaseAddr, Ctx.isLittleEndian(), Obj.getAddressSize(), MRI, U,
LLDumpOpts, Indent);
} else {
diff --git a/llvm/test/DebugInfo/X86/dwarfdump-debug-loclists.test b/llvm/test/DebugInfo/X86/dwarfdump-debug-loclists.test
index a427e03c2317..5b6b6b8d5ccc 100644
--- a/llvm/test/DebugInfo/X86/dwarfdump-debug-loclists.test
+++ b/llvm/test/DebugInfo/X86/dwarfdump-debug-loclists.test
@@ -11,8 +11,7 @@
# CHECK: .debug_loclists contents:
# CHECK-NEXT: 0x00000000: locations list header: length = 0x0000002c, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
# CHECK-NEXT: 0x0000000c:
-# CHECK-NEXT: DW_LLE_offset_pair (0x0000000000000000, 0x0000000000000010)
-# CHECK-NEXT: => [0x0000000000000000, 0x0000000000000010): DW_OP_breg5 RDI+0
+# CHECK-NEXT: DW_LLE_offset_pair (0x0000000000000000, 0x0000000000000010): DW_OP_breg5 RDI+0
# CHECK-NEXT: DW_LLE_base_address (0x0000000000000500)
# CHECK-NEXT: DW_LLE_offset_pair (0x0000000000000030, 0x0000000000000040)
# CHECK-NEXT: => [0x0000000000000530, 0x0000000000000540): DW_OP_breg6 RBP-8, DW_OP_deref
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists.s b/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists.s
index 59c0a967013a..7e97fe902376 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists.s
+++ b/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists.s
@@ -70,6 +70,10 @@ f: # @f
.byte 23 # DW_FORM_sec_offset
.ascii "\214\001" # DW_AT_loclists_base
.byte 23 # DW_FORM_sec_offset
+ .byte 17 # DW_AT_low_pc
+ .byte 27 # DW_FORM_addrx
+ .byte 18 # DW_AT_high_pc
+ .byte 6 # DW_FORM_data4
.byte 0 # EOM(1)
.byte 0 # EOM(2)
.byte 2 # Abbreviation Code
@@ -100,6 +104,8 @@ f: # @f
.byte 1 # Abbrev [1] 0xc:0x3c DW_TAG_compile_unit
.long .Laddr_table_base0 # DW_AT_addr_base
.long .Lloclists_table_base0 # DW_AT_loclists_base
+ .byte 0 # DW_AT_low_pc
+ .long .Lfend-.Lf0 # DW_AT_high_pc
.byte 2 # Abbrev [2] 0x27:0x1c DW_TAG_subprogram
.byte 0 # DW_AT_low_pc
.long .Lfend-.Lf0 # DW_AT_high_pc
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists_multiple.s b/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists_multiple.s
index 4e2999dd9c67..a0188a6a981b 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists_multiple.s
+++ b/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists_multiple.s
@@ -5,9 +5,9 @@
# CHECK: .debug_loclists contents:
# CHECK: 0x00000000: locations list header:
# CHECK: 0x0000000c:
-# CHECK: [0x0000000000000001, 0x0000000000000002): DW_OP_consts +7, DW_OP_stack_value
+# CHECK: DW_LLE_offset_pair (0x0000000000000001, 0x0000000000000002): DW_OP_consts +7, DW_OP_stack_value
# CHECK: 0x00000014: locations list header:
-# CHECK: [0x0000000000000005, 0x0000000000000007): DW_OP_consts +12, DW_OP_stack_value
+# CHECK: DW_LLE_offset_pair (0x0000000000000005, 0x0000000000000007): DW_OP_consts +12, DW_OP_stack_value
.section .debug_loclists,"", at progbits
.long .Ldebug_loclist_table_end0-.Ldebug_loclist_table_start0 # Length
More information about the llvm-commits
mailing list