summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
diff options
context:
space:
mode:
authorPaul Robinson <paul.robinson@sony.com>2018-11-07 21:39:09 +0000
committerPaul Robinson <paul.robinson@sony.com>2018-11-07 21:39:09 +0000
commit746c22389c87802b385074137e3e4408bab673b5 (patch)
treed03ccae2fd1ea02f3f9eac5d561ba65a69dc4d6c /llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
parent85e71733ed79d25817ff884e01f4f2fc07005e12 (diff)
downloadbcm5719-llvm-746c22389c87802b385074137e3e4408bab673b5.tar.gz
bcm5719-llvm-746c22389c87802b385074137e3e4408bab673b5.zip
[DWARFv5] Read and dump multiple .debug_info sections.
Type units go in .debug_info comdats, not .debug_types, in v5. Differential Revision: https://reviews.llvm.org/D53907 llvm-svn: 346360
Diffstat (limited to 'llvm/lib/DebugInfo/DWARF/DWARFContext.cpp')
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFContext.cpp86
1 files changed, 58 insertions, 28 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
index 00e37d7b7c5..99cf9b985c0 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
@@ -351,20 +351,22 @@ void DWARFContext::dump(
DObj->getAbbrevDWOSection()))
getDebugAbbrevDWO()->dump(OS);
- auto dumpDebugInfo = [&](unit_iterator_range Units) {
- if (DumpOffset)
- getDIEForOffset(DumpOffset.getValue())
- .dump(OS, 0, DumpOpts.noImplicitRecursion());
+ auto dumpDebugInfo = [&](const char *Name, unit_iterator_range Units) {
+ OS << '\n' << Name << " contents:\n";
+ if (DumpOffset = DumpOffsets[DIDT_ID_DebugInfo])
+ for (const auto &U : Units)
+ U->getDIEForOffset(DumpOffset.getValue())
+ .dump(OS, 0, DumpOpts.noImplicitRecursion());
else
for (const auto &U : Units)
U->dump(OS, DumpOpts);
};
- if (shouldDump(Explicit, ".debug_info", DIDT_ID_DebugInfo,
- DObj->getInfoSection().Data))
- dumpDebugInfo(info_section_units());
- if (shouldDump(ExplicitDWO, ".debug_info.dwo", DIDT_ID_DebugInfo,
- DObj->getInfoDWOSection().Data))
- dumpDebugInfo(dwo_info_section_units());
+ if ((DumpType & DIDT_DebugInfo)) {
+ if (Explicit || getNumCompileUnits())
+ dumpDebugInfo(".debug_info", info_section_units());
+ if (ExplicitDWO || getNumDWOCompileUnits())
+ dumpDebugInfo(".debug_info.dwo", dwo_info_section_units());
+ }
auto dumpDebugType = [&](const char *Name, unit_iterator_range Units) {
OS << '\n' << Name << " contents:\n";
@@ -872,7 +874,9 @@ Expected<const DWARFDebugLine::LineTable *> DWARFContext::getLineTableForUnit(
void DWARFContext::parseNormalUnits() {
if (!NormalUnits.empty())
return;
- NormalUnits.addUnitsForSection(*this, DObj->getInfoSection(), DW_SECT_INFO);
+ DObj->forEachInfoSections([&](const DWARFSection &S) {
+ NormalUnits.addUnitsForSection(*this, S, DW_SECT_INFO);
+ });
NormalUnits.finishedInfoUnits();
DObj->forEachTypesSections([&](const DWARFSection &S) {
NormalUnits.addUnitsForSection(*this, S, DW_SECT_TYPES);
@@ -882,8 +886,9 @@ void DWARFContext::parseNormalUnits() {
void DWARFContext::parseDWOUnits(bool Lazy) {
if (!DWOUnits.empty())
return;
- DWOUnits.addUnitsForDWOSection(*this, DObj->getInfoDWOSection(), DW_SECT_INFO,
- Lazy);
+ DObj->forEachInfoDWOSections([&](const DWARFSection &S) {
+ DWOUnits.addUnitsForDWOSection(*this, S, DW_SECT_INFO, Lazy);
+ });
DWOUnits.finishedInfoUnits();
DObj->forEachTypesDWOSections([&](const DWARFSection &S) {
DWOUnits.addUnitsForDWOSection(*this, S, DW_SECT_TYPES, Lazy);
@@ -1235,20 +1240,20 @@ class DWARFObjInMemory final : public DWARFObject {
const object::ObjectFile *Obj = nullptr;
std::vector<SectionName> SectionNames;
- using TypeSectionMap = MapVector<object::SectionRef, DWARFSectionMap,
+ using InfoSectionMap = MapVector<object::SectionRef, DWARFSectionMap,
std::map<object::SectionRef, unsigned>>;
- TypeSectionMap TypesSections;
- TypeSectionMap TypesDWOSections;
+ InfoSectionMap InfoSections;
+ InfoSectionMap TypesSections;
+ InfoSectionMap InfoDWOSections;
+ InfoSectionMap TypesDWOSections;
- DWARFSectionMap InfoSection;
DWARFSectionMap LocSection;
DWARFSectionMap LocListsSection;
DWARFSectionMap LineSection;
DWARFSectionMap RangeSection;
DWARFSectionMap RnglistsSection;
DWARFSectionMap StringOffsetSection;
- DWARFSectionMap InfoDWOSection;
DWARFSectionMap LineDWOSection;
DWARFSectionMap LocDWOSection;
DWARFSectionMap StringOffsetDWOSection;
@@ -1263,14 +1268,12 @@ class DWARFObjInMemory final : public DWARFObject {
DWARFSectionMap *mapNameToDWARFSection(StringRef Name) {
return StringSwitch<DWARFSectionMap *>(Name)
- .Case("debug_info", &InfoSection)
.Case("debug_loc", &LocSection)
.Case("debug_loclists", &LocListsSection)
.Case("debug_line", &LineSection)
.Case("debug_str_offsets", &StringOffsetSection)
.Case("debug_ranges", &RangeSection)
.Case("debug_rnglists", &RnglistsSection)
- .Case("debug_info.dwo", &InfoDWOSection)
.Case("debug_loc.dwo", &LocDWOSection)
.Case("debug_line.dwo", &LineDWOSection)
.Case("debug_names", &DebugNamesSection)
@@ -1359,6 +1362,16 @@ public:
for (const auto &SecIt : Sections) {
if (StringRef *SectionData = mapSectionToMember(SecIt.first()))
*SectionData = SecIt.second->getBuffer();
+ else if (SecIt.first() == "debug_info")
+ // Find debug_info and debug_types data by section rather than name as
+ // there are multiple, comdat grouped, of these sections.
+ InfoSections[SectionRef()].Data = SecIt.second->getBuffer();
+ else if (SecIt.first() == "debug_info.dwo")
+ InfoDWOSections[SectionRef()].Data = SecIt.second->getBuffer();
+ else if (SecIt.first() == "debug_types")
+ TypesSections[SectionRef()].Data = SecIt.second->getBuffer();
+ else if (SecIt.first() == "debug_types.dwo")
+ TypesDWOSections[SectionRef()].Data = SecIt.second->getBuffer();
}
}
DWARFObjInMemory(const object::ObjectFile &Obj, const LoadedObjectInfo *L,
@@ -1413,9 +1426,13 @@ public:
// FIXME: Use the other dwo range section when we emit it.
RangeDWOSection.Data = Data;
}
+ } else if (Name == "debug_info") {
+ // Find debug_info and debug_types data by section rather than name as
+ // there are multiple, comdat grouped, of these sections.
+ InfoSections[Section].Data = Data;
+ } else if (Name == "debug_info.dwo") {
+ InfoDWOSections[Section].Data = Data;
} else if (Name == "debug_types") {
- // Find debug_types data by section rather than name as there are
- // multiple, comdat grouped, debug_types sections.
TypesSections[Section].Data = Data;
} else if (Name == "debug_types.dwo") {
TypesDWOSections[Section].Data = Data;
@@ -1450,9 +1467,16 @@ public:
DWARFSectionMap *Sec = mapNameToDWARFSection(RelSecName);
RelocAddrMap *Map = Sec ? &Sec->Relocs : nullptr;
if (!Map) {
- // Find debug_types relocs by section rather than name as there are
- // multiple, comdat grouped, debug_types sections.
- if (RelSecName == "debug_types")
+ // Find debug_info and debug_types relocs by section rather than name
+ // as there are multiple, comdat grouped, of these sections.
+ if (RelSecName == "debug_info")
+ Map = &static_cast<DWARFSectionMap &>(InfoSections[*RelocatedSection])
+ .Relocs;
+ else if (RelSecName == "debug_info.dwo")
+ Map = &static_cast<DWARFSectionMap &>(
+ InfoDWOSections[*RelocatedSection])
+ .Relocs;
+ else if (RelSecName == "debug_types")
Map =
&static_cast<DWARFSectionMap &>(TypesSections[*RelocatedSection])
.Relocs;
@@ -1550,8 +1574,10 @@ public:
StringRef getLineStringSection() const override { return LineStringSection; }
// Sections for DWARF5 split dwarf proposal.
- const DWARFSection &getInfoDWOSection() const override {
- return InfoDWOSection;
+ void forEachInfoDWOSections(
+ function_ref<void(const DWARFSection &)> F) const override {
+ for (auto &P : InfoDWOSections)
+ F(P.second);
}
void forEachTypesDWOSections(
function_ref<void(const DWARFSection &)> F) const override {
@@ -1598,7 +1624,11 @@ public:
StringRef getFileName() const override { return FileName; }
uint8_t getAddressSize() const override { return AddressSize; }
- const DWARFSection &getInfoSection() const override { return InfoSection; }
+ void forEachInfoSections(
+ function_ref<void(const DWARFSection &)> F) const override {
+ for (auto &P : InfoSections)
+ F(P.second);
+ }
void forEachTypesSections(
function_ref<void(const DWARFSection &)> F) const override {
for (auto &P : TypesSections)
OpenPOWER on IntegriCloud