[llvm] [BOLT][DWARF] Slice .debug_str from the DWP for each CU (PR #159540)

Alexander Yermolovich via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 2 16:49:14 PST 2025


================
@@ -1723,7 +1723,66 @@ StringRef getSectionName(const SectionRef &Section) {
   return Name;
 }
 
-// Extracts an appropriate slice if input is DWP.
+// Exctracts some appropriate slices of .debug_str.dwo from DWP.
+// Updates the .debug_str_offets.dwo for CUs.
+void UpdateStrAndStrOffsets(StringRef StrDWOContent,
+                            StringRef StrOffsetsContent,
+                            SmallVectorImpl<StringRef> &StrDWOOutData,
+                            std::string &StrOffsetsOutData,
+                            unsigned DwarfVersion, bool IsLittleEndian) {
+  const llvm::endianness Endian =
+      IsLittleEndian ? llvm::endianness::little : llvm::endianness::big;
+  // ignore DWARF64
+  const uint64_t HeaderOffset = (DwarfVersion >= 5) ? 8 : 0;
+  const uint64_t NumOffsets = (StrOffsetsContent.size() - HeaderOffset) / 4;
+
+  DataExtractor Extractor(StrOffsetsContent, IsLittleEndian, 0);
+  uint64_t ExtractionOffset = HeaderOffset;
+
+  using StringFragment = DWARFUnitIndex::Entry::SectionContribution;
+  auto getStringLength = [](StringRef Content, uint64_t Offset) -> uint64_t {
+    size_t NullPos = Content.find('\0', Offset);
+    return (NullPos != StringRef::npos) ? (NullPos - Offset + 1) : 0;
+  };
+  auto isContiguous = [](const StringFragment &Fragment,
+                         uint64_t NextOffset) -> bool {
+    return NextOffset == Fragment.getOffset() + Fragment.getLength();
+  };
+  std::optional<StringFragment> CurrentFragment;
+  uint64_t AccumulatedStrLen = 0;
+  for (uint64_t I = 0; I < NumOffsets; ++I) {
+    const uint64_t StrOffset = Extractor.getU32(&ExtractionOffset);
+    const uint64_t StringLength = getStringLength(StrDWOContent, StrOffset);
+    if (!CurrentFragment) {
+      // first init
----------------
ayermolo wrote:

General nit. For comments. Please capitalize and end with .

https://github.com/llvm/llvm-project/pull/159540


More information about the llvm-commits mailing list