@@ -631,9 +631,9 @@ void DWARFRewriter::updateDebugInfo() {
631
631
uint32_t CUIndex = 0 ;
632
632
std::mutex AccessMutex;
633
633
// Needs to be invoked in the same order as CUs are processed.
634
+ llvm::DenseMap<uint64_t , uint64_t > LocListWritersIndexByCU;
634
635
auto createRangeLocListAddressWriters =
635
- [&](DWARFUnit &CU,
636
- llvm::DenseMap<uint64_t , uint64_t > &LocListWritersIndexByCU) {
636
+ [&](DWARFUnit &CU) {
637
637
std::lock_guard<std::mutex> Lock (AccessMutex);
638
638
639
639
const uint16_t DwarfVersion = CU.getVersion ();
@@ -679,18 +679,13 @@ void DWARFRewriter::updateDebugInfo() {
679
679
DWPState State;
680
680
if (opts::WriteDWP)
681
681
initDWPState (State);
682
- auto processSplitCU = [&](DWARFUnit &Unit, DIEBuilder &DIEBlder) {
683
- std::optional<DWARFUnit *> SplitCU;
684
- std::optional<uint64_t > DWOId = Unit.getDWOId ();
685
- if (DWOId)
686
- SplitCU = BC.getDWOCU (*DWOId);
687
- if (!SplitCU)
688
- return ;
689
- DebugAddrWriter &AddressWriter =
690
- *AddressWritersByCU[Unit.getOffset ()].get ();
691
- DIEBuilder DWODIEBuilder (BC, &(*SplitCU)->getContext (), DebugNamesTable,
682
+ auto processSplitCU = [&](DWARFUnit &Unit, DWARFUnit &SplitCU,
683
+ DIEBuilder &DIEBlder,
684
+ DebugRangesSectionWriter &TempRangesSectionWriter,
685
+ DebugAddrWriter &AddressWriter) {
686
+ DIEBuilder DWODIEBuilder (BC, &(SplitCU).getContext (), DebugNamesTable,
692
687
&Unit);
693
- DWODIEBuilder.buildDWOUnit (** SplitCU);
688
+ DWODIEBuilder.buildDWOUnit (SplitCU);
694
689
std::string DWOName = " " ;
695
690
std::optional<std::string> DwarfOutputPath =
696
691
opts::DwarfOutputPath.empty ()
@@ -702,33 +697,31 @@ void DWARFRewriter::updateDebugInfo() {
702
697
*StrOffstsWriter, *StrWriter, Unit, DwarfOutputPath, std::nullopt);
703
698
}
704
699
DebugStrOffsetsWriter DWOStrOffstsWriter (BC);
705
- DebugStrWriter DWOStrWriter ((* SplitCU)-> getContext (), true );
700
+ DebugStrWriter DWOStrWriter ((SplitCU). getContext (), true );
706
701
DWODIEBuilder.updateDWONameCompDirForTypes (
707
- DWOStrOffstsWriter, DWOStrWriter, ** SplitCU, DwarfOutputPath, DWOName);
702
+ DWOStrOffstsWriter, DWOStrWriter, SplitCU, DwarfOutputPath, DWOName);
708
703
DebugLoclistWriter DebugLocDWoWriter (Unit, Unit.getVersion (), true ,
709
704
AddressWriter);
710
- DebugRangesSectionWriter *TempRangesSectionWriter =
711
- Unit.getVersion () >= 5 ? RangeListsWritersByCU[*DWOId].get ()
712
- : LegacyRangesWritersByCU[*DWOId].get ();
713
705
714
- updateUnitDebugInfo (*(* SplitCU) , DWODIEBuilder, DebugLocDWoWriter,
715
- * TempRangesSectionWriter, AddressWriter);
706
+ updateUnitDebugInfo (SplitCU, DWODIEBuilder, DebugLocDWoWriter,
707
+ TempRangesSectionWriter, AddressWriter);
716
708
DebugLocDWoWriter.finalize (DWODIEBuilder,
717
- *DWODIEBuilder.getUnitDIEbyUnit (** SplitCU));
709
+ *DWODIEBuilder.getUnitDIEbyUnit (SplitCU));
718
710
if (Unit.getVersion () >= 5 )
719
- TempRangesSectionWriter-> finalizeSection ();
711
+ TempRangesSectionWriter. finalizeSection ();
720
712
721
- emitDWOBuilder (DWOName, DWODIEBuilder, *this , ** SplitCU, Unit, State,
713
+ emitDWOBuilder (DWOName, DWODIEBuilder, *this , SplitCU, Unit, State,
722
714
DebugLocDWoWriter, DWOStrOffstsWriter, DWOStrWriter,
723
715
GDBIndexSection);
724
716
};
725
- auto processMainBinaryCU = [&](DWARFUnit &Unit, DIEBuilder &DIEBlder,
726
- DebugLocWriter &DebugLocWriter) {
717
+ auto processMainBinaryCU = [&](DWARFUnit &Unit, DIEBuilder &DIEBlder) {
727
718
DebugAddrWriter &AddressWriter =
728
719
*AddressWritersByCU[Unit.getOffset ()].get ();
729
720
DebugRangesSectionWriter &RangesSectionWriter =
730
721
Unit.getVersion () >= 5 ? *RangeListsSectionWriter.get ()
731
722
: *LegacyRangesSectionWriter.get ();
723
+ DebugLocWriter &DebugLocWriter =
724
+ *LocListWritersByCU[LocListWritersIndexByCU[Unit.getOffset ()]].get ();
732
725
std::optional<uint64_t > RangesBase;
733
726
std::optional<DWARFUnit *> SplitCU;
734
727
std::optional<uint64_t > DWOId = Unit.getDWOId ();
@@ -765,15 +758,24 @@ void DWARFRewriter::updateDebugInfo() {
765
758
CUPartitionVector PartVec = partitionCUs (*BC.DwCtx );
766
759
for (std::vector<DWARFUnit *> &Vec : PartVec) {
767
760
DIEBlder.buildCompileUnits (Vec);
768
- llvm::DenseMap<uint64_t , uint64_t > LocListWritersIndexByCU;
769
761
for (DWARFUnit *CU : DIEBlder.getProcessedCUs ()) {
770
- createRangeLocListAddressWriters (*CU, LocListWritersIndexByCU);
771
- processSplitCU (*CU, DIEBlder);
762
+ createRangeLocListAddressWriters (*CU);
763
+ std::optional<DWARFUnit *> SplitCU;
764
+ std::optional<uint64_t > DWOId = CU->getDWOId ();
765
+ if (DWOId)
766
+ SplitCU = BC.getDWOCU (*DWOId);
767
+ if (!SplitCU)
768
+ continue ;
769
+ DebugAddrWriter &AddressWriter =
770
+ *AddressWritersByCU[CU->getOffset ()].get ();
771
+ DebugRangesSectionWriter *TempRangesSectionWriter =
772
+ CU->getVersion () >= 5 ? RangeListsWritersByCU[*DWOId].get ()
773
+ : LegacyRangesWritersByCU[*DWOId].get ();
774
+ processSplitCU (*CU, **SplitCU, DIEBlder, *TempRangesSectionWriter,
775
+ AddressWriter);
772
776
}
773
777
for (DWARFUnit *CU : DIEBlder.getProcessedCUs ()) {
774
- DebugLocWriter *DebugLocWriter =
775
- LocListWritersByCU[LocListWritersIndexByCU[CU->getOffset ()]].get ();
776
- processMainBinaryCU (*CU, DIEBlder, *DebugLocWriter);
778
+ processMainBinaryCU (*CU, DIEBlder);
777
779
}
778
780
finalizeCompileUnits (DIEBlder, *Streamer, OffsetMap,
779
781
DIEBlder.getProcessedCUs (), *FinalAddrWriter);
0 commit comments