summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-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