@@ -620,9 +620,10 @@ void DWARFRewriter::updateDebugInfo() {
620
620
uint32_t CUIndex = 0 ;
621
621
std::mutex AccessMutex;
622
622
// Needs to be invoked in the same order as CUs are processed.
623
- auto createRangeLocListAddressWriters =
624
- [&](DWARFUnit &CU) -> DebugLocWriter * {
623
+ llvm::DenseMap< uint64_t , uint64_t > LocListWritersIndexByCU;
624
+ auto createRangeLocListAddressWriters = [&](DWARFUnit &CU) {
625
625
std::lock_guard<std::mutex> Lock (AccessMutex);
626
+
626
627
const uint16_t DwarfVersion = CU.getVersion ();
627
628
if (DwarfVersion >= 5 ) {
628
629
auto AddrW = std::make_unique<DebugAddrWriterDwarf5>(
@@ -641,7 +642,6 @@ void DWARFRewriter::updateDebugInfo() {
641
642
RangeListsWritersByCU[*DWOId] = std::move (DWORangeListsSectionWriter);
642
643
}
643
644
AddressWritersByCU[CU.getOffset ()] = std::move (AddrW);
644
-
645
645
} else {
646
646
auto AddrW =
647
647
std::make_unique<DebugAddrWriter>(&BC, CU.getAddressByteSize ());
@@ -657,7 +657,7 @@ void DWARFRewriter::updateDebugInfo() {
657
657
std::move (LegacyRangesSectionWriterByCU);
658
658
}
659
659
}
660
- return LocListWritersByCU[CUIndex++]. get () ;
660
+ LocListWritersIndexByCU[CU. getOffset ()] = CUIndex++ ;
661
661
};
662
662
663
663
DWARF5AcceleratorTable DebugNamesTable (opts::CreateDebugNames, BC,
@@ -666,74 +666,70 @@ void DWARFRewriter::updateDebugInfo() {
666
666
DWPState State;
667
667
if (opts::WriteDWP)
668
668
initDWPState (State);
669
- auto processUnitDIE = [&](DWARFUnit *Unit, DIEBuilder *DIEBlder) {
670
- // Check if the unit is a skeleton and we need special updates for it and
671
- // its matching split/DWO CU.
672
- std::optional<DWARFUnit *> SplitCU;
669
+ auto processSplitCU = [&](DWARFUnit &Unit, DWARFUnit &SplitCU,
670
+ DIEBuilder &DIEBlder,
671
+ DebugRangesSectionWriter &TempRangesSectionWriter,
672
+ DebugAddrWriter &AddressWriter) {
673
+ DIEBuilder DWODIEBuilder (BC, &(SplitCU).getContext (), DebugNamesTable,
674
+ &Unit);
675
+ DWODIEBuilder.buildDWOUnit (SplitCU);
676
+ std::string DWOName = " " ;
677
+ std::optional<std::string> DwarfOutputPath =
678
+ opts::DwarfOutputPath.empty ()
679
+ ? std::nullopt
680
+ : std::optional<std::string>(opts::DwarfOutputPath.c_str ());
681
+ {
682
+ std::lock_guard<std::mutex> Lock (AccessMutex);
683
+ DWOName = DIEBlder.updateDWONameCompDir (
684
+ *StrOffstsWriter, *StrWriter, Unit, DwarfOutputPath, std::nullopt);
685
+ }
686
+ DebugStrOffsetsWriter DWOStrOffstsWriter (BC);
687
+ DebugStrWriter DWOStrWriter ((SplitCU).getContext (), true );
688
+ DWODIEBuilder.updateDWONameCompDirForTypes (
689
+ DWOStrOffstsWriter, DWOStrWriter, SplitCU, DwarfOutputPath, DWOName);
690
+ DebugLoclistWriter DebugLocDWoWriter (Unit, Unit.getVersion (), true ,
691
+ AddressWriter);
692
+
693
+ updateUnitDebugInfo (SplitCU, DWODIEBuilder, DebugLocDWoWriter,
694
+ TempRangesSectionWriter, AddressWriter);
695
+ DebugLocDWoWriter.finalize (DWODIEBuilder,
696
+ *DWODIEBuilder.getUnitDIEbyUnit (SplitCU));
697
+ if (Unit.getVersion () >= 5 )
698
+ TempRangesSectionWriter.finalizeSection ();
699
+
700
+ emitDWOBuilder (DWOName, DWODIEBuilder, *this , SplitCU, Unit, State,
701
+ DebugLocDWoWriter, DWOStrOffstsWriter, DWOStrWriter,
702
+ GDBIndexSection);
703
+ };
704
+ auto processMainBinaryCU = [&](DWARFUnit &Unit, DIEBuilder &DIEBlder) {
705
+ DebugAddrWriter &AddressWriter =
706
+ *AddressWritersByCU[Unit.getOffset ()].get ();
707
+ if (Unit.getVersion () >= 5 )
708
+ RangeListsSectionWriter->setAddressWriter (&AddressWriter);
709
+ DebugRangesSectionWriter &RangesSectionWriter =
710
+ Unit.getVersion () >= 5 ? *RangeListsSectionWriter.get ()
711
+ : *LegacyRangesSectionWriter.get ();
712
+ DebugLocWriter &DebugLocWriter =
713
+ *LocListWritersByCU[LocListWritersIndexByCU[Unit.getOffset ()]].get ();
673
714
std::optional<uint64_t > RangesBase;
674
- std::optional<uint64_t > DWOId = Unit->getDWOId ();
715
+ std::optional<DWARFUnit *> SplitCU;
716
+ std::optional<uint64_t > DWOId = Unit.getDWOId ();
675
717
if (DWOId)
676
718
SplitCU = BC.getDWOCU (*DWOId);
677
- DebugLocWriter *DebugLocWriter = createRangeLocListAddressWriters (*Unit);
678
- DebugRangesSectionWriter *RangesSectionWriter =
679
- Unit->getVersion () >= 5 ? RangeListsSectionWriter.get ()
680
- : LegacyRangesSectionWriter.get ();
681
- DebugAddrWriter *AddressWriter =
682
- AddressWritersByCU[Unit->getOffset ()].get ();
683
- // Skipping CUs that failed to load.
684
- if (SplitCU) {
685
- DIEBuilder DWODIEBuilder (BC, &(*SplitCU)->getContext (), DebugNamesTable,
686
- Unit);
687
- DWODIEBuilder.buildDWOUnit (**SplitCU);
688
- std::string DWOName = " " ;
689
- std::optional<std::string> DwarfOutputPath =
690
- opts::DwarfOutputPath.empty ()
691
- ? std::nullopt
692
- : std::optional<std::string>(opts::DwarfOutputPath.c_str ());
693
- {
694
- std::lock_guard<std::mutex> Lock (AccessMutex);
695
- DWOName = DIEBlder->updateDWONameCompDir (
696
- *StrOffstsWriter, *StrWriter, *Unit, DwarfOutputPath, std::nullopt);
697
- }
698
- DebugStrOffsetsWriter DWOStrOffstsWriter (BC);
699
- DebugStrWriter DWOStrWriter ((*SplitCU)->getContext (), true );
700
- DWODIEBuilder.updateDWONameCompDirForTypes (DWOStrOffstsWriter,
701
- DWOStrWriter, **SplitCU,
702
- DwarfOutputPath, DWOName);
703
- DebugLoclistWriter DebugLocDWoWriter (*Unit, Unit->getVersion (), true ,
704
- *AddressWriter);
705
- DebugRangesSectionWriter *TempRangesSectionWriter = RangesSectionWriter;
706
- if (Unit->getVersion () >= 5 ) {
707
- TempRangesSectionWriter = RangeListsWritersByCU[*DWOId].get ();
708
- } else {
709
- TempRangesSectionWriter = LegacyRangesWritersByCU[*DWOId].get ();
710
- RangesBase = RangesSectionWriter->getSectionOffset ();
711
- }
712
-
713
- updateUnitDebugInfo (*(*SplitCU), DWODIEBuilder, DebugLocDWoWriter,
714
- *TempRangesSectionWriter, *AddressWriter);
715
- DebugLocDWoWriter.finalize (DWODIEBuilder,
716
- *DWODIEBuilder.getUnitDIEbyUnit (**SplitCU));
717
- if (Unit->getVersion () >= 5 )
718
- TempRangesSectionWriter->finalizeSection ();
719
-
720
- emitDWOBuilder (DWOName, DWODIEBuilder, *this , **SplitCU, *Unit, State,
721
- DebugLocDWoWriter, DWOStrOffstsWriter, DWOStrWriter,
722
- GDBIndexSection);
723
- }
724
-
725
- if (Unit->getVersion () >= 5 ) {
726
- RangesBase = RangesSectionWriter->getSectionOffset () +
719
+ if (Unit.getVersion () >= 5 ) {
720
+ RangesBase = RangesSectionWriter.getSectionOffset () +
727
721
getDWARF5RngListLocListHeaderSize ();
728
- RangesSectionWriter->initSection (*Unit);
729
- StrOffstsWriter->finalizeSection (*Unit, *DIEBlder);
722
+ RangesSectionWriter.initSection (Unit);
723
+ StrOffstsWriter->finalizeSection (Unit, DIEBlder);
724
+ } else if (SplitCU) {
725
+ RangesBase = LegacyRangesSectionWriter.get ()->getSectionOffset ();
730
726
}
731
727
732
- updateUnitDebugInfo (* Unit, * DIEBlder, * DebugLocWriter, * RangesSectionWriter,
733
- * AddressWriter, RangesBase);
734
- DebugLocWriter-> finalize (* DIEBlder, *DIEBlder-> getUnitDIEbyUnit (* Unit));
735
- if (Unit-> getVersion () >= 5 )
736
- RangesSectionWriter-> finalizeSection ();
728
+ updateUnitDebugInfo (Unit, DIEBlder, DebugLocWriter, RangesSectionWriter,
729
+ AddressWriter, RangesBase);
730
+ DebugLocWriter. finalize (DIEBlder, *DIEBlder. getUnitDIEbyUnit (Unit));
731
+ if (Unit. getVersion () >= 5 )
732
+ RangesSectionWriter. finalizeSection ();
737
733
};
738
734
739
735
DIEBuilder DIEBlder (BC, BC.DwCtx .get (), DebugNamesTable);
@@ -751,8 +747,24 @@ void DWARFRewriter::updateDebugInfo() {
751
747
CUPartitionVector PartVec = partitionCUs (*BC.DwCtx );
752
748
for (std::vector<DWARFUnit *> &Vec : PartVec) {
753
749
DIEBlder.buildCompileUnits (Vec);
750
+ for (DWARFUnit *CU : DIEBlder.getProcessedCUs ()) {
751
+ createRangeLocListAddressWriters (*CU);
752
+ std::optional<DWARFUnit *> SplitCU;
753
+ std::optional<uint64_t > DWOId = CU->getDWOId ();
754
+ if (DWOId)
755
+ SplitCU = BC.getDWOCU (*DWOId);
756
+ if (!SplitCU)
757
+ continue ;
758
+ DebugAddrWriter &AddressWriter =
759
+ *AddressWritersByCU[CU->getOffset ()].get ();
760
+ DebugRangesSectionWriter *TempRangesSectionWriter =
761
+ CU->getVersion () >= 5 ? RangeListsWritersByCU[*DWOId].get ()
762
+ : LegacyRangesWritersByCU[*DWOId].get ();
763
+ processSplitCU (*CU, **SplitCU, DIEBlder, *TempRangesSectionWriter,
764
+ AddressWriter);
765
+ }
754
766
for (DWARFUnit *CU : DIEBlder.getProcessedCUs ())
755
- processUnitDIE ( CU, & DIEBlder);
767
+ processMainBinaryCU (* CU, DIEBlder);
756
768
finalizeCompileUnits (DIEBlder, *Streamer, OffsetMap,
757
769
DIEBlder.getProcessedCUs (), *FinalAddrWriter);
758
770
}
0 commit comments