@@ -209,8 +209,7 @@ class Dwarf5AccelTableWriter : public AccelTableWriter {
209209
210210 Header Header;
211211 DenseMap<uint32_t , SmallVector<AttributeEncoding, 2 >> Abbreviations;
212- const DwarfDebug ⅅ
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
232231public:
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 ⅅ
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+
241274void 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 {
403436SmallVector<Dwarf5AccelTableWriter::AttributeEncoding, 2 >
404437Dwarf5AccelTableWriter::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
415448void 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
505536Dwarf5AccelTableWriter::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,
540571void 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
547585void AppleAccelTableOffsetData::emit (AsmPrinter *Asm) const {
0 commit comments