@@ -582,19 +582,51 @@ static void emitDWOBuilder(const std::string &DWOName,
582
582
Rewriter.writeDWOFiles (CU, OverriddenSections, DWOName, LocWriter);
583
583
}
584
584
585
- void DWARFRewriter::addStringHelper (DIEBuilder &DIEBldr, DIE &Die,
586
- const DWARFUnit &Unit,
587
- DIEValue &DIEAttrInfo, StringRef Str) {
588
- uint32_t NewOffset = StrWriter->addString (Str);
585
+ // / Adds a \p Str to .debug_str section.
586
+ // / Uses \p AttrInfoVal to either update entry in a DIE for legacy DWARF using
587
+ // / \p DebugInfoPatcher, or for DWARF5 update an index in .debug_str_offsets
588
+ // / for this contribution of \p Unit.
589
+ static void addStringHelper (DebugStrOffsetsWriter &StrOffstsWriter,
590
+ DebugStrWriter &StrWriter, DIEBuilder &DIEBldr,
591
+ DIE &Die, const DWARFUnit &Unit,
592
+ DIEValue &DIEAttrInfo, StringRef Str) {
593
+ uint32_t NewOffset = StrWriter.addString (Str);
589
594
if (Unit.getVersion () >= 5 ) {
590
- StrOffstsWriter-> updateAddressMap (DIEAttrInfo.getDIEInteger ().getValue (),
591
- NewOffset);
595
+ StrOffstsWriter. updateAddressMap (DIEAttrInfo.getDIEInteger ().getValue (),
596
+ NewOffset);
592
597
return ;
593
598
}
594
599
DIEBldr.replaceValue (&Die, DIEAttrInfo.getAttribute (), DIEAttrInfo.getForm (),
595
600
DIEInteger (NewOffset));
596
601
}
597
602
603
+ static std::string
604
+ updateDWONameCompDir (DebugStrOffsetsWriter &StrOffstsWriter,
605
+ DebugStrWriter &StrWriter,
606
+ std::unordered_map<std::string, uint32_t > &NameToIndexMap,
607
+ DWARFUnit &Unit, DIEBuilder &DIEBldr, DIE &UnitDIE) {
608
+ DIEValue DWONameAttrInfo = UnitDIE.findAttribute (dwarf::DW_AT_dwo_name);
609
+ if (!DWONameAttrInfo)
610
+ DWONameAttrInfo = UnitDIE.findAttribute (dwarf::DW_AT_GNU_dwo_name);
611
+ assert (DWONameAttrInfo && " DW_AT_dwo_name is not in Skeleton CU." );
612
+ std::string ObjectName;
613
+
614
+ ObjectName = getDWOName (Unit, NameToIndexMap);
615
+ addStringHelper (StrOffstsWriter, StrWriter, DIEBldr, UnitDIE, Unit,
616
+ DWONameAttrInfo, ObjectName.c_str ());
617
+
618
+ DIEValue CompDirAttrInfo = UnitDIE.findAttribute (dwarf::DW_AT_comp_dir);
619
+ assert (CompDirAttrInfo && " DW_AT_comp_dir is not in Skeleton CU." );
620
+
621
+ if (!opts::DwarfOutputPath.empty ()) {
622
+ if (!sys::fs::exists (opts::DwarfOutputPath))
623
+ sys::fs::create_directory (opts::DwarfOutputPath);
624
+ addStringHelper (StrOffstsWriter, StrWriter, DIEBldr, UnitDIE, Unit,
625
+ CompDirAttrInfo, opts::DwarfOutputPath.c_str ());
626
+ }
627
+ return ObjectName;
628
+ }
629
+
598
630
using DWARFUnitVec = std::vector<DWARFUnit *>;
599
631
using CUPartitionVector = std::vector<DWARFUnitVec>;
600
632
// / Partitions CUs in to buckets. Bucket size is controlled by
@@ -692,33 +724,6 @@ void DWARFRewriter::updateDebugInfo() {
692
724
// specified.
693
725
std::unordered_map<std::string, uint32_t > NameToIndexMap;
694
726
695
- auto updateDWONameCompDir = [&](DWARFUnit &Unit, DIEBuilder &DIEBldr,
696
- DIE &UnitDIE) -> std::string {
697
- DIEValue DWONameAttrInfo = UnitDIE.findAttribute (dwarf::DW_AT_dwo_name);
698
- if (!DWONameAttrInfo)
699
- DWONameAttrInfo = UnitDIE.findAttribute (dwarf::DW_AT_GNU_dwo_name);
700
- assert (DWONameAttrInfo && " DW_AT_dwo_name is not in Skeleton CU." );
701
- std::string ObjectName;
702
-
703
- {
704
- std::lock_guard<std::mutex> Lock (AccessMutex);
705
- ObjectName = getDWOName (Unit, NameToIndexMap);
706
- }
707
- addStringHelper (DIEBldr, UnitDIE, Unit, DWONameAttrInfo,
708
- ObjectName.c_str ());
709
-
710
- DIEValue CompDirAttrInfo = UnitDIE.findAttribute (dwarf::DW_AT_comp_dir);
711
- assert (CompDirAttrInfo && " DW_AT_comp_dir is not in Skeleton CU." );
712
-
713
- if (!opts::DwarfOutputPath.empty ()) {
714
- if (!sys::fs::exists (opts::DwarfOutputPath))
715
- sys::fs::create_directory (opts::DwarfOutputPath);
716
- addStringHelper (DIEBldr, UnitDIE, Unit, CompDirAttrInfo,
717
- opts::DwarfOutputPath.c_str ());
718
- }
719
- return ObjectName;
720
- };
721
-
722
727
DWARF5AcceleratorTable DebugNamesTable (opts::CreateDebugNames, BC,
723
728
*StrWriter);
724
729
DWPState State;
@@ -741,8 +746,13 @@ void DWARFRewriter::updateDebugInfo() {
741
746
DIEBuilder DWODIEBuilder (BC, &(*SplitCU)->getContext (), DebugNamesTable,
742
747
Unit);
743
748
DWODIEBuilder.buildDWOUnit (**SplitCU);
744
- std::string DWOName = updateDWONameCompDir (
745
- *Unit, *DIEBlder, *DIEBlder->getUnitDIEbyUnit (*Unit));
749
+ std::string DWOName = " " ;
750
+ {
751
+ std::lock_guard<std::mutex> Lock (AccessMutex);
752
+ DWOName = updateDWONameCompDir (*StrOffstsWriter, *StrWriter,
753
+ NameToIndexMap, *Unit, *DIEBlder,
754
+ *DIEBlder->getUnitDIEbyUnit (*Unit));
755
+ }
746
756
747
757
DebugLoclistWriter DebugLocDWoWriter (*Unit, Unit->getVersion (), true );
748
758
DebugRangesSectionWriter *TempRangesSectionWriter = RangesSectionWriter;
0 commit comments