diff options
| author | Paul Robinson <paul.robinson@sony.com> | 2018-11-07 21:39:09 +0000 |
|---|---|---|
| committer | Paul Robinson <paul.robinson@sony.com> | 2018-11-07 21:39:09 +0000 |
| commit | 746c22389c87802b385074137e3e4408bab673b5 (patch) | |
| tree | d03ccae2fd1ea02f3f9eac5d561ba65a69dc4d6c /llvm/lib | |
| parent | 85e71733ed79d25817ff884e01f4f2fc07005e12 (diff) | |
| download | bcm5719-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')
| -rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFContext.cpp | 86 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp | 13 |
2 files changed, 66 insertions, 33 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) diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp index 128bd0651ba..f8370178b62 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -364,15 +364,18 @@ unsigned DWARFVerifier::verifyUnitSection(const DWARFSection &S, bool DWARFVerifier::handleDebugInfo() { const DWARFObject &DObj = DCtx.getDWARFObj(); + unsigned NumErrors = 0; OS << "Verifying .debug_info Unit Header Chain...\n"; - unsigned result = verifyUnitSection(DObj.getInfoSection(), DW_SECT_INFO); + DObj.forEachInfoSections([&](const DWARFSection &S) { + NumErrors += verifyUnitSection(S, DW_SECT_INFO); + }); OS << "Verifying .debug_types Unit Header Chain...\n"; DObj.forEachTypesSections([&](const DWARFSection &S) { - result += verifyUnitSection(S, DW_SECT_TYPES); + NumErrors += verifyUnitSection(S, DW_SECT_TYPES); }); - return result == 0; + return NumErrors == 0; } unsigned DWARFVerifier::verifyDieRanges(const DWARFDie &Die, @@ -551,6 +554,7 @@ unsigned DWARFVerifier::verifyDebugInfoAttribute(const DWARFDie &Die, unsigned DWARFVerifier::verifyDebugInfoForm(const DWARFDie &Die, DWARFAttribute &AttrValue) { const DWARFObject &DObj = DCtx.getDWARFObj(); + auto DieCU = Die.getDwarfUnit(); unsigned NumErrors = 0; const auto Form = AttrValue.Value.getForm(); switch (Form) { @@ -563,7 +567,6 @@ unsigned DWARFVerifier::verifyDebugInfoForm(const DWARFDie &Die, Optional<uint64_t> RefVal = AttrValue.Value.getAsReference(); assert(RefVal); if (RefVal) { - auto DieCU = Die.getDwarfUnit(); auto CUSize = DieCU->getNextUnitOffset() - DieCU->getOffset(); auto CUOffset = AttrValue.Value.getRawUValue(); if (CUOffset >= CUSize) { @@ -588,7 +591,7 @@ unsigned DWARFVerifier::verifyDebugInfoForm(const DWARFDie &Die, Optional<uint64_t> RefVal = AttrValue.Value.getAsReference(); assert(RefVal); if (RefVal) { - if (*RefVal >= DObj.getInfoSection().Data.size()) { + if (*RefVal >= DieCU->getInfoSection().Data.size()) { ++NumErrors; error() << "DW_FORM_ref_addr offset beyond .debug_info " "bounds:\n"; |

