summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo
diff options
context:
space:
mode:
authorPavel Labath <pavel@labath.sk>2019-11-08 12:18:07 +0100
committerPavel Labath <pavel@labath.sk>2019-11-13 16:26:16 +0100
commit1eea3fa063884e36165d122db32228f307793485 (patch)
tree1b7e40319dbf50c4e2f9bcb4b91dc7d42dcdd664 /llvm/lib/DebugInfo
parente84b7a5fe230e42b8e6fe451369874a773bf1867 (diff)
downloadbcm5719-llvm-1eea3fa063884e36165d122db32228f307793485.tar.gz
bcm5719-llvm-1eea3fa063884e36165d122db32228f307793485.zip
DWARFDebugLoclists: Add an api to get the location lists of a DWARF unit
Summary: This avoid the need to duplicate the location lists searching logic in various users. The "inline location list dumping" code (which is the only user actually updated to handle DWARF v5 location lists) is switched to this method. After adding v4 location list support, I'll switch other users too. Reviewers: dblaikie, probinson, JDevlieghere, aprantl, SouraVX Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D70084
Diffstat (limited to 'llvm/lib/DebugInfo')
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFDie.cpp56
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp18
2 files changed, 34 insertions, 40 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
index 22ae8ebb649..308f731570c 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
@@ -92,49 +92,35 @@ static void dumpLocation(raw_ostream &OS, DWARFFormValue &FormValue,
}
if (FormValue.isFormClass(DWARFFormValue::FC_SectionOffset)) {
+ auto LLDumpOpts = DumpOpts;
+ LLDumpOpts.Verbose = false;
+
uint64_t Offset = *FormValue.getAsSectionOffset();
uint64_t BaseAddr = 0;
if (Optional<object::SectionedAddress> BA = U->getBaseAddress())
BaseAddr = BA->Address;
- auto LLDumpOpts = DumpOpts;
- LLDumpOpts.Verbose = false;
-
- if (!U->isDWOUnit() && !U->getLocSection()->Data.empty()) {
- DWARFDebugLoc DebugLoc;
- DWARFDataExtractor Data(Obj, *U->getLocSection(), Ctx.isLittleEndian(),
- Obj.getAddressSize());
-
- FormValue.dump(OS, DumpOpts);
- OS << ": ";
- if (Expected<DWARFDebugLoc::LocationList> LL =
- DebugLoc.parseOneLocationList(Data, &Offset)) {
- LL->dump(OS, BaseAddr, Ctx.isLittleEndian(), Obj.getAddressSize(), MRI,
- U, LLDumpOpts, Indent);
- } else {
- OS << '\n';
- OS.indent(Indent);
- OS << formatv("error extracting location list: {0}",
- fmt_consume(LL.takeError()));
- }
+ if (const DWARFLocationTable *LT = U->getLocationTable()) {
+ LT->dumpLocationList(&Offset, OS, BaseAddr, MRI, U, LLDumpOpts, Indent);
return;
}
- bool UseLocLists = !U->isDWOUnit();
- auto Data =
- UseLocLists
- ? DWARFDataExtractor(Obj, Obj.getLoclistsSection(),
- Ctx.isLittleEndian(), Obj.getAddressSize())
- : DWARFDataExtractor(U->getLocSectionData(), Ctx.isLittleEndian(),
- Obj.getAddressSize());
-
- if (!Data.getData().empty()) {
- // Old-style location list were used in DWARF v4 (.debug_loc.dwo section).
- // Modern locations list (.debug_loclists) are used starting from v5.
- // Ideally we should take the version from the .debug_loclists section
- // header, but using CU's version for simplicity.
- DWARFDebugLoclists(Data, UseLocLists ? U->getVersion() : 4)
- .dumpLocationList(&Offset, OS, BaseAddr, MRI, U, LLDumpOpts, Indent);
+ DWARFDebugLoc DebugLoc;
+ DWARFDataExtractor Data(Obj, *U->getLocSection(), Ctx.isLittleEndian(),
+ Obj.getAddressSize());
+
+ FormValue.dump(OS, DumpOpts);
+ OS << ": ";
+
+ if (Expected<DWARFDebugLoc::LocationList> LL =
+ DebugLoc.parseOneLocationList(Data, &Offset)) {
+ LL->dump(OS, BaseAddr, Ctx.isLittleEndian(), Obj.getAddressSize(), MRI, U,
+ LLDumpOpts, Indent);
+ } else {
+ OS << '\n';
+ OS.indent(Indent);
+ OS << formatv("error extracting location list: {0}",
+ fmt_consume(LL.takeError()));
}
return;
}
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
index a56402a707a..81c7959f646 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
@@ -179,14 +179,22 @@ DWARFUnit::DWARFUnit(DWARFContext &DC, const DWARFSection &Section,
StringSection(SS), StringOffsetSection(SOS), AddrOffsetSection(AOS),
isLittleEndian(LE), IsDWO(IsDWO), UnitVector(UnitVector) {
clear();
- // For split DWARF we only need to keep track of the location list section's
- // data (no relocations), and if we are reading a package file, we need to
- // adjust the location list data based on the index entries.
if (IsDWO) {
- LocSectionData = LocSection->Data;
+ // If we are reading a package file, we need to adjust the location list
+ // data based on the index entries.
+ StringRef Data = LocSection->Data;
if (auto *IndexEntry = Header.getIndexEntry())
if (const auto *C = IndexEntry->getOffset(DW_SECT_LOC))
- LocSectionData = LocSectionData.substr(C->Offset, C->Length);
+ Data = Data.substr(C->Offset, C->Length);
+ LocTable = std::make_unique<DWARFDebugLoclists>(
+ DWARFDataExtractor(Data, isLittleEndian, getAddressByteSize()),
+ Header.getVersion());
+ } else if (Header.getVersion() >= 5) {
+ LocTable = std::make_unique<DWARFDebugLoclists>(
+ DWARFDataExtractor(Context.getDWARFObj(),
+ Context.getDWARFObj().getLoclistsSection(),
+ isLittleEndian, getAddressByteSize()),
+ Header.getVersion());
}
}
OpenPOWER on IntegriCloud