summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2018-07-09 09:08:44 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2018-07-09 09:08:44 +0000
commit5e810a878d15fefb2e52a694467229d43f8d55f6 (patch)
tree66e65fd7609fcb1f586e811c6e888efe4fe38cff
parente5801b02e49b6fc4dd07702652ea70c9ea0275f3 (diff)
downloadbcm5719-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.h23
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp74
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 &DD;
- 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 &DD;
+ 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 {
OpenPOWER on IntegriCloud