Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit f8d4a3a

Browse files
committed
[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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@336529 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent ceac963 commit f8d4a3a

File tree

2 files changed

+77
-20
lines changed

2 files changed

+77
-20
lines changed

include/llvm/CodeGen/AccelTable.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ class AccelTableData {
122122
return order() < Other.order();
123123
}
124124

125-
// Subclasses should implement:
126-
// static uint32_t hash(StringRef Name);
125+
// Subclasses should implement:
126+
// static uint32_t hash(StringRef Name);
127127

128128
#ifndef NDEBUG
129129
virtual void print(raw_ostream &OS) const = 0;
@@ -287,6 +287,25 @@ void emitDWARF5AccelTable(AsmPrinter *Asm,
287287
const DwarfDebug &DD,
288288
ArrayRef<std::unique_ptr<DwarfCompileUnit>> CUs);
289289

290+
/// Abstraction to allow different users (DwarfDebug and dsymutil) to emit
291+
/// Dwarf accelerator tables.
292+
class AccelTableWriterInfo {
293+
public:
294+
virtual ~AccelTableWriterInfo() = default;
295+
virtual MCSymbol* getLabelForCU(unsigned Idx) const = 0;
296+
virtual unsigned getNumberOfCUs() const = 0;
297+
virtual unsigned getUnqiueIDForUnitDie(const DIE* UnitDie) const = 0;
298+
};
299+
300+
void emitDWARF5AccelTable(AsmPrinter *Asm,
301+
AccelTable<DWARF5AccelTableData> &Contents,
302+
const DwarfDebug &DD,
303+
ArrayRef<std::unique_ptr<DwarfCompileUnit>> CUs);
304+
305+
void emitDWARF5AccelTable(
306+
AsmPrinter *Asm, AccelTable<DWARF5AccelTableData> &Contents,
307+
std::unique_ptr<AccelTableWriterInfo> WriterInfo);
308+
290309
/// Accelerator table data implementation for simple Apple accelerator tables
291310
/// with just a DIE reference.
292311
class AppleAccelTableOffsetData : public AppleAccelTableData {

lib/CodeGen/AsmPrinter/AccelTable.cpp

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,7 @@ class Dwarf5AccelTableWriter : public AccelTableWriter {
209209

210210
Header Header;
211211
DenseMap<uint32_t, SmallVector<AttributeEncoding, 2>> Abbreviations;
212-
const DwarfDebug &DD;
213-
ArrayRef<std::unique_ptr<DwarfCompileUnit>> CompUnits;
212+
std::unique_ptr<AccelTableWriterInfo> WriterInfo;
214213
MCSymbol *ContributionStart = Asm->createTempSymbol("names_start");
215214
MCSymbol *ContributionEnd = Asm->createTempSymbol("names_end");
216215
MCSymbol *AbbrevStart = Asm->createTempSymbol("names_abbrev_start");
@@ -231,13 +230,47 @@ class Dwarf5AccelTableWriter : public AccelTableWriter {
231230

232231
public:
233232
Dwarf5AccelTableWriter(AsmPrinter *Asm, const AccelTableBase &Contents,
234-
const DwarfDebug &DD,
235-
ArrayRef<std::unique_ptr<DwarfCompileUnit>> CompUnits);
233+
std::unique_ptr<AccelTableWriterInfo> WriterInfo);
236234

237235
void emit() const;
238236
};
237+
238+
/// Default emitter info used by DwarfDebug.
239+
class DefaultAccelTableWriterInfo final : public AccelTableWriterInfo {
240+
private:
241+
const DwarfDebug &DD;
242+
ArrayRef<std::unique_ptr<DwarfCompileUnit>> CompUnits;
243+
244+
public:
245+
DefaultAccelTableWriterInfo(const DwarfDebug &DD, ArrayRef<std::unique_ptr<DwarfCompileUnit>> CompUnits);
246+
MCSymbol *getLabelForCU(unsigned Idx) const override;
247+
unsigned getNumberOfCUs() const override;
248+
unsigned getUnqiueIDForUnitDie(const DIE *UnitDie) const override;
249+
};
239250
} // namespace
240251

252+
DefaultAccelTableWriterInfo::DefaultAccelTableWriterInfo(
253+
const DwarfDebug &DD, ArrayRef<std::unique_ptr<DwarfCompileUnit>> CompUnits)
254+
: DD(DD), CompUnits(CompUnits) {}
255+
256+
MCSymbol *DefaultAccelTableWriterInfo::getLabelForCU(unsigned Idx) const {
257+
assert(Idx < CompUnits.size());
258+
const auto &CU = CompUnits[Idx];
259+
assert(Idx == CU->getUniqueID());
260+
const DwarfCompileUnit *MainCU =
261+
DD.useSplitDwarf() ? CU->getSkeleton() : CU.get();
262+
return MainCU->getLabelBegin();
263+
}
264+
265+
unsigned DefaultAccelTableWriterInfo::getNumberOfCUs() const {
266+
return CompUnits.size();
267+
}
268+
269+
unsigned
270+
DefaultAccelTableWriterInfo::getUnqiueIDForUnitDie(const DIE *UnitDie) const {
271+
return DD.lookupCU(UnitDie)->getUniqueID();
272+
}
273+
241274
void AccelTableWriter::emitHashes() const {
242275
uint64_t PrevHash = std::numeric_limits<uint64_t>::max();
243276
unsigned BucketIdx = 0;
@@ -403,8 +436,8 @@ DenseSet<uint32_t> Dwarf5AccelTableWriter::getUniqueTags() const {
403436
SmallVector<Dwarf5AccelTableWriter::AttributeEncoding, 2>
404437
Dwarf5AccelTableWriter::getUniformAttributes() const {
405438
SmallVector<AttributeEncoding, 2> UA;
406-
if (CompUnits.size() > 1) {
407-
size_t LargestCUIndex = CompUnits.size() - 1;
439+
if (WriterInfo->getNumberOfCUs() > 1) {
440+
size_t LargestCUIndex = WriterInfo->getNumberOfCUs() - 1;
408441
dwarf::Form Form = DIEInteger::BestForm(/*IsSigned*/ false, LargestCUIndex);
409442
UA.push_back({dwarf::DW_IDX_compile_unit, Form});
410443
}
@@ -413,12 +446,10 @@ Dwarf5AccelTableWriter::getUniformAttributes() const {
413446
}
414447

415448
void Dwarf5AccelTableWriter::emitCUList() const {
416-
for (const auto &CU : enumerate(CompUnits)) {
417-
assert(CU.index() == CU.value()->getUniqueID());
418-
Asm->OutStreamer->AddComment("Compilation unit " + Twine(CU.index()));
419-
const DwarfCompileUnit *MainCU =
420-
DD.useSplitDwarf() ? CU.value()->getSkeleton() : CU.value().get();
421-
Asm->emitDwarfSymbolReference(MainCU->getLabelBegin());
449+
for (unsigned Idx = 0, CUs = WriterInfo->getNumberOfCUs(); Idx < CUs;
450+
++Idx) {
451+
Asm->OutStreamer->AddComment("Compilation unit " + Twine(Idx));
452+
Asm->emitDwarfSymbolReference(WriterInfo->getLabelForCU(Idx));
422453
}
423454
}
424455

@@ -474,7 +505,7 @@ void Dwarf5AccelTableWriter::emitEntry(
474505
switch (AttrEnc.Index) {
475506
case dwarf::DW_IDX_compile_unit: {
476507
const DIE *CUDie = Entry.getDie().getUnitDie();
477-
DIEInteger ID(DD.lookupCU(CUDie)->getUniqueID());
508+
DIEInteger ID(WriterInfo->getUnqiueIDForUnitDie(CUDie));
478509
ID.EmitValue(Asm, AttrEnc.Form);
479510
break;
480511
}
@@ -503,12 +534,12 @@ void Dwarf5AccelTableWriter::emitData() const {
503534
}
504535

505536
Dwarf5AccelTableWriter::Dwarf5AccelTableWriter(
506-
AsmPrinter *Asm, const AccelTableBase &Contents, const DwarfDebug &DD,
507-
ArrayRef<std::unique_ptr<DwarfCompileUnit>> CompUnits)
537+
AsmPrinter *Asm, const AccelTableBase &Contents,
538+
std::unique_ptr<AccelTableWriterInfo> WriterInfo)
508539
: AccelTableWriter(Asm, Contents, false),
509-
Header(CompUnits.size(), Contents.getBucketCount(),
540+
Header(WriterInfo->getNumberOfCUs(), Contents.getBucketCount(),
510541
Contents.getUniqueNameCount()),
511-
DD(DD), CompUnits(CompUnits) {
542+
WriterInfo(std::move(WriterInfo)) {
512543
DenseSet<uint32_t> UniqueTags = getUniqueTags();
513544
SmallVector<AttributeEncoding, 2> UniformAttributes = getUniformAttributes();
514545

@@ -540,8 +571,15 @@ void llvm::emitAppleAccelTableImpl(AsmPrinter *Asm, AccelTableBase &Contents,
540571
void llvm::emitDWARF5AccelTable(
541572
AsmPrinter *Asm, AccelTable<DWARF5AccelTableData> &Contents,
542573
const DwarfDebug &DD, ArrayRef<std::unique_ptr<DwarfCompileUnit>> CUs) {
574+
auto WriterInfo = llvm::make_unique<DefaultAccelTableWriterInfo>(DD, CUs);
575+
emitDWARF5AccelTable(Asm, Contents, std::move(WriterInfo));
576+
}
577+
578+
void llvm::emitDWARF5AccelTable(
579+
AsmPrinter *Asm, AccelTable<DWARF5AccelTableData> &Contents,
580+
std::unique_ptr<AccelTableWriterInfo> WriterInfo) {
543581
Contents.finalize(Asm, "names");
544-
Dwarf5AccelTableWriter(Asm, Contents, DD, CUs).emit();
582+
Dwarf5AccelTableWriter(Asm, Contents, std::move(WriterInfo)).emit();
545583
}
546584

547585
void AppleAccelTableOffsetData::emit(AsmPrinter *Asm) const {

0 commit comments

Comments
 (0)