diff options
author | Jonas Devlieghere <jonas@devlieghere.com> | 2018-07-09 09:08:44 +0000 |
---|---|---|
committer | Jonas Devlieghere <jonas@devlieghere.com> | 2018-07-09 09:08:44 +0000 |
commit | 5e810a878d15fefb2e52a694467229d43f8d55f6 (patch) | |
tree | 66e65fd7609fcb1f586e811c6e888efe4fe38cff | |
parent | e5801b02e49b6fc4dd07702652ea70c9ea0275f3 (diff) | |
download | bcm5719-llvm-5e810a878d15fefb2e52a694467229d43f8d55f6.tar.gz bcm5719-llvm-5e810a878d15fefb2e52a694467229d43f8d55f6.zip |
[AccelTable] Provide abstraction for emitting DWARF5 accelerator tables.
When emitting the DWARF accelerator tables from dsymutil, we don't have
a DwarfDebug instance and we use a custom class to represent Dwarf
compile units. This patch adds an interface AccelTableWriterInfo to
abstract these from the Dwarf5AccelTableWriter, so we can have a custom
implementation for this in dsymutil.
Differential revision: https://reviews.llvm.org/D49031
llvm-svn: 336529
-rw-r--r-- | llvm/include/llvm/CodeGen/AccelTable.h | 23 | ||||
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp | 74 |
2 files changed, 77 insertions, 20 deletions
diff --git a/llvm/include/llvm/CodeGen/AccelTable.h b/llvm/include/llvm/CodeGen/AccelTable.h index d5088b3ce14..1c70c4db8e2 100644 --- a/llvm/include/llvm/CodeGen/AccelTable.h +++ b/llvm/include/llvm/CodeGen/AccelTable.h @@ -122,8 +122,8 @@ public: return order() < Other.order(); } - // Subclasses should implement: - // static uint32_t hash(StringRef Name); + // Subclasses should implement: + // static uint32_t hash(StringRef Name); #ifndef NDEBUG virtual void print(raw_ostream &OS) const = 0; @@ -287,6 +287,25 @@ void emitDWARF5AccelTable(AsmPrinter *Asm, const DwarfDebug &DD, ArrayRef<std::unique_ptr<DwarfCompileUnit>> CUs); +/// Abstraction to allow different users (DwarfDebug and dsymutil) to emit +/// Dwarf accelerator tables. +class AccelTableWriterInfo { +public: + virtual ~AccelTableWriterInfo() = default; + virtual MCSymbol* getLabelForCU(unsigned Idx) const = 0; + virtual unsigned getNumberOfCUs() const = 0; + virtual unsigned getUnqiueIDForUnitDie(const DIE* UnitDie) const = 0; +}; + +void emitDWARF5AccelTable(AsmPrinter *Asm, + AccelTable<DWARF5AccelTableData> &Contents, + const DwarfDebug &DD, + ArrayRef<std::unique_ptr<DwarfCompileUnit>> CUs); + +void emitDWARF5AccelTable( + AsmPrinter *Asm, AccelTable<DWARF5AccelTableData> &Contents, + std::unique_ptr<AccelTableWriterInfo> WriterInfo); + /// Accelerator table data implementation for simple Apple accelerator tables /// with just a DIE reference. class AppleAccelTableOffsetData : public AppleAccelTableData { 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 { |