From 8bce5a053d52e268317b89b597857a7148c338f7 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Wed, 17 Feb 2016 07:00:24 +0000 Subject: llvm-dwp: Support for type units when merging DWPs into larger DWPs llvm-svn: 261072 --- llvm/tools/llvm-dwp/llvm-dwp.cpp | 56 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) (limited to 'llvm/tools/llvm-dwp/llvm-dwp.cpp') diff --git a/llvm/tools/llvm-dwp/llvm-dwp.cpp b/llvm/tools/llvm-dwp/llvm-dwp.cpp index 47fbe1c7db4..02fcc151c05 100644 --- a/llvm/tools/llvm-dwp/llvm-dwp.cpp +++ b/llvm/tools/llvm-dwp/llvm-dwp.cpp @@ -139,6 +139,41 @@ struct UnitIndexEntry { DWARFUnitIndex::Entry::SectionContribution Contributions[8]; }; +static void addAllTypesFromDWP(MCStreamer &Out, + std::vector &TypeIndexEntries, + const DWARFUnitIndex &TUIndex, + MCSection *OutputTypes, StringRef Types, + const UnitIndexEntry &TUEntry, + uint32_t &TypesOffset) { + Out.SwitchSection(OutputTypes); + for (const DWARFUnitIndex::Entry &E : TUIndex.getRows()) { + auto *I = E.getOffsets(); + if (!I) + continue; + if (any_of(TypeIndexEntries, [&](const UnitIndexEntry &OldEntry) { + return OldEntry.Signature == E.getSignature(); + })) + continue; + auto Entry = TUEntry; + Entry.Signature = E.getSignature(); + // Zero out the debug_info contribution + Entry.Contributions[0] = {}; + for (auto Kind : TUIndex.getColumnKinds()) { + auto &C = Entry.Contributions[Kind - DW_SECT_INFO]; + C.Offset += I->Offset; + C.Length = I->Length; + ++I; + } + auto &C = Entry.Contributions[DW_SECT_TYPES - DW_SECT_INFO]; + Out.EmitBytes(Types.substr( + C.Offset - TUEntry.Contributions[DW_SECT_TYPES - DW_SECT_INFO].Offset, + C.Length)); + C.Offset = TypesOffset; + TypesOffset += C.Length; + TypeIndexEntries.push_back(Entry); + } +} + static void addAllTypes(MCStreamer &Out, std::vector &TypeIndexEntries, MCSection *OutputTypes, StringRef Types, @@ -241,6 +276,7 @@ static std::error_code write(MCStreamer &Out, ArrayRef Inputs) { MCSection *const StrOffsetSection = MCOFI.getDwarfStrOffDWOSection(); MCSection *const TypesSection = MCOFI.getDwarfTypesDWOSection(); MCSection *const CUIndexSection = MCOFI.getDwarfCUIndexSection(); + MCSection *const TUIndexSection = MCOFI.getDwarfTUIndexSection(); const StringMap> KnownSections = { {"debug_info.dwo", {MCOFI.getDwarfInfoDWOSection(), DW_SECT_INFO}}, {"debug_types.dwo", {MCOFI.getDwarfTypesDWOSection(), DW_SECT_TYPES}}, @@ -249,8 +285,8 @@ static std::error_code write(MCStreamer &Out, ArrayRef Inputs) { {"debug_loc.dwo", {MCOFI.getDwarfLocDWOSection(), DW_SECT_LOC}}, {"debug_line.dwo", {MCOFI.getDwarfLineDWOSection(), DW_SECT_LINE}}, {"debug_abbrev.dwo", {MCOFI.getDwarfAbbrevDWOSection(), DW_SECT_ABBREV}}, - {"debug_cu_index", - {MCOFI.getDwarfCUIndexSection(), static_cast(0)}}}; + {"debug_cu_index", {CUIndexSection, static_cast(0)}}, + {"debug_tu_index", {TUIndexSection, static_cast(0)}}}; std::vector IndexEntries; std::vector TypeIndexEntries; @@ -273,6 +309,7 @@ static std::error_code write(MCStreamer &Out, ArrayRef Inputs) { StringRef InfoSection; StringRef AbbrevSection; StringRef CurCUIndexSection; + StringRef CurTUIndexSection; for (const auto &Section : ErrOrObj->getBinary()->sections()) { StringRef Name; @@ -317,6 +354,8 @@ static std::error_code write(MCStreamer &Out, ArrayRef Inputs) { CurTypesSection = Contents; else if (OutSection == CUIndexSection) CurCUIndexSection = Contents; + else if (OutSection == TUIndexSection) + CurTUIndexSection = Contents; else { Out.SwitchSection(OutSection); Out.EmitBytes(Contents); @@ -346,6 +385,19 @@ static std::error_code write(MCStreamer &Out, ArrayRef Inputs) { } IndexEntries.push_back(NewEntry); } + + if (!CurTypesSection.empty()) { + if (CurTUIndexSection.empty()) + return make_error_code(std::errc::invalid_argument); + DWARFUnitIndex TUIndex(DW_SECT_TYPES); + DataExtractor TUIndexData(CurTUIndexSection, + ErrOrObj->getBinary()->isLittleEndian(), 0); + if (!TUIndex.parse(TUIndexData)) + return make_error_code(std::errc::invalid_argument); + addAllTypesFromDWP(Out, TypeIndexEntries, TUIndex, TypesSection, + CurTypesSection, CurEntry, + ContributionOffsets[DW_SECT_TYPES - DW_SECT_INFO]); + } } else { CurEntry.Signature = getCUSignature(AbbrevSection, InfoSection); addAllTypes(Out, TypeIndexEntries, TypesSection, CurTypesSection, -- cgit v1.2.3