diff options
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp | 74 |
1 files changed, 56 insertions, 18 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp index 48c78af8ff4..a14c646b924 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp @@ -209,8 +209,7 @@ class Dwarf5AccelTableWriter : public AccelTableWriter { Header Header; DenseMap<uint32_t, SmallVector<AttributeEncoding, 2>> Abbreviations; - const DwarfDebug ⅅ - ArrayRef<std::unique_ptr<DwarfCompileUnit>> CompUnits; + std::unique_ptr<AccelTableWriterInfo> WriterInfo; MCSymbol *ContributionStart = Asm->createTempSymbol("names_start"); MCSymbol *ContributionEnd = Asm->createTempSymbol("names_end"); MCSymbol *AbbrevStart = Asm->createTempSymbol("names_abbrev_start"); @@ -231,13 +230,47 @@ class Dwarf5AccelTableWriter : public AccelTableWriter { public: Dwarf5AccelTableWriter(AsmPrinter *Asm, const AccelTableBase &Contents, - const DwarfDebug &DD, - ArrayRef<std::unique_ptr<DwarfCompileUnit>> CompUnits); + std::unique_ptr<AccelTableWriterInfo> WriterInfo); void emit() const; }; + +/// Default emitter info used by DwarfDebug. +class DefaultAccelTableWriterInfo final : public AccelTableWriterInfo { +private: + const DwarfDebug ⅅ + ArrayRef<std::unique_ptr<DwarfCompileUnit>> CompUnits; + +public: + DefaultAccelTableWriterInfo(const DwarfDebug &DD, ArrayRef<std::unique_ptr<DwarfCompileUnit>> CompUnits); + MCSymbol *getLabelForCU(unsigned Idx) const override; + unsigned getNumberOfCUs() const override; + unsigned getUnqiueIDForUnitDie(const DIE *UnitDie) const override; +}; } // namespace +DefaultAccelTableWriterInfo::DefaultAccelTableWriterInfo( + const DwarfDebug &DD, ArrayRef<std::unique_ptr<DwarfCompileUnit>> CompUnits) + : DD(DD), CompUnits(CompUnits) {} + +MCSymbol *DefaultAccelTableWriterInfo::getLabelForCU(unsigned Idx) const { + assert(Idx < CompUnits.size()); + const auto &CU = CompUnits[Idx]; + assert(Idx == CU->getUniqueID()); + const DwarfCompileUnit *MainCU = + DD.useSplitDwarf() ? CU->getSkeleton() : CU.get(); + return MainCU->getLabelBegin(); +} + +unsigned DefaultAccelTableWriterInfo::getNumberOfCUs() const { + return CompUnits.size(); +} + +unsigned +DefaultAccelTableWriterInfo::getUnqiueIDForUnitDie(const DIE *UnitDie) const { + return DD.lookupCU(UnitDie)->getUniqueID(); +} + void AccelTableWriter::emitHashes() const { uint64_t PrevHash = std::numeric_limits<uint64_t>::max(); unsigned BucketIdx = 0; @@ -403,8 +436,8 @@ DenseSet<uint32_t> Dwarf5AccelTableWriter::getUniqueTags() const { SmallVector<Dwarf5AccelTableWriter::AttributeEncoding, 2> Dwarf5AccelTableWriter::getUniformAttributes() const { SmallVector<AttributeEncoding, 2> UA; - if (CompUnits.size() > 1) { - size_t LargestCUIndex = CompUnits.size() - 1; + if (WriterInfo->getNumberOfCUs() > 1) { + size_t LargestCUIndex = WriterInfo->getNumberOfCUs() - 1; dwarf::Form Form = DIEInteger::BestForm(/*IsSigned*/ false, LargestCUIndex); UA.push_back({dwarf::DW_IDX_compile_unit, Form}); } @@ -413,12 +446,10 @@ Dwarf5AccelTableWriter::getUniformAttributes() const { } void Dwarf5AccelTableWriter::emitCUList() const { - for (const auto &CU : enumerate(CompUnits)) { - assert(CU.index() == CU.value()->getUniqueID()); - Asm->OutStreamer->AddComment("Compilation unit " + Twine(CU.index())); - const DwarfCompileUnit *MainCU = - DD.useSplitDwarf() ? CU.value()->getSkeleton() : CU.value().get(); - Asm->emitDwarfSymbolReference(MainCU->getLabelBegin()); + for (unsigned Idx = 0, CUs = WriterInfo->getNumberOfCUs(); Idx < CUs; + ++Idx) { + Asm->OutStreamer->AddComment("Compilation unit " + Twine(Idx)); + Asm->emitDwarfSymbolReference(WriterInfo->getLabelForCU(Idx)); } } @@ -474,7 +505,7 @@ void Dwarf5AccelTableWriter::emitEntry( switch (AttrEnc.Index) { case dwarf::DW_IDX_compile_unit: { const DIE *CUDie = Entry.getDie().getUnitDie(); - DIEInteger ID(DD.lookupCU(CUDie)->getUniqueID()); + DIEInteger ID(WriterInfo->getUnqiueIDForUnitDie(CUDie)); ID.EmitValue(Asm, AttrEnc.Form); break; } @@ -503,12 +534,12 @@ void Dwarf5AccelTableWriter::emitData() const { } Dwarf5AccelTableWriter::Dwarf5AccelTableWriter( - AsmPrinter *Asm, const AccelTableBase &Contents, const DwarfDebug &DD, - ArrayRef<std::unique_ptr<DwarfCompileUnit>> CompUnits) + AsmPrinter *Asm, const AccelTableBase &Contents, + std::unique_ptr<AccelTableWriterInfo> WriterInfo) : AccelTableWriter(Asm, Contents, false), - Header(CompUnits.size(), Contents.getBucketCount(), + Header(WriterInfo->getNumberOfCUs(), Contents.getBucketCount(), Contents.getUniqueNameCount()), - DD(DD), CompUnits(CompUnits) { + WriterInfo(std::move(WriterInfo)) { DenseSet<uint32_t> UniqueTags = getUniqueTags(); SmallVector<AttributeEncoding, 2> UniformAttributes = getUniformAttributes(); @@ -540,8 +571,15 @@ void llvm::emitAppleAccelTableImpl(AsmPrinter *Asm, AccelTableBase &Contents, void llvm::emitDWARF5AccelTable( AsmPrinter *Asm, AccelTable<DWARF5AccelTableData> &Contents, const DwarfDebug &DD, ArrayRef<std::unique_ptr<DwarfCompileUnit>> CUs) { + auto WriterInfo = llvm::make_unique<DefaultAccelTableWriterInfo>(DD, CUs); + emitDWARF5AccelTable(Asm, Contents, std::move(WriterInfo)); +} + +void llvm::emitDWARF5AccelTable( + AsmPrinter *Asm, AccelTable<DWARF5AccelTableData> &Contents, + std::unique_ptr<AccelTableWriterInfo> WriterInfo) { Contents.finalize(Asm, "names"); - Dwarf5AccelTableWriter(Asm, Contents, DD, CUs).emit(); + Dwarf5AccelTableWriter(Asm, Contents, std::move(WriterInfo)).emit(); } void AppleAccelTableOffsetData::emit(AsmPrinter *Asm) const { |