[llvm] [BOLT][DWARF] Fix handling of debug-str-offsets (PR #75100)

Alexander Yermolovich via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 11 15:29:18 PST 2023


https://github.com/ayermolo updated https://github.com/llvm/llvm-project/pull/75100

>From e05baa9a03e9a0f9f5384d49d0e837970a873aff Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Mon, 11 Dec 2023 12:55:52 -0800
Subject: [PATCH 1/3] [BOLT][DWARF] Fix handling of debug-str-offsets

We were not setting size field of .debug-str-offsets correctly. Fixed it, and
added a test.
---
 bolt/include/bolt/Core/DebugData.h            |  2 -
 bolt/lib/Core/DebugData.cpp                   |  6 +-
 bolt/lib/Rewrite/DWARFRewriter.cpp            |  5 +-
 .../X86/dwarf5-two-cu-str-offset-table.test   | 66 +++++++++++++++++++
 4 files changed, 73 insertions(+), 6 deletions(-)
 create mode 100644 bolt/test/X86/dwarf5-two-cu-str-offset-table.test

diff --git a/bolt/include/bolt/Core/DebugData.h b/bolt/include/bolt/Core/DebugData.h
index 23430cc36167c..9f0dd88b115fc 100644
--- a/bolt/include/bolt/Core/DebugData.h
+++ b/bolt/include/bolt/Core/DebugData.h
@@ -459,8 +459,6 @@ class DebugStrOffsetsWriter {
   std::unique_ptr<raw_svector_ostream> StrOffsetsStream;
   std::map<uint32_t, uint32_t> IndexToAddressMap;
   std::unordered_map<uint64_t, uint64_t> ProcessedBaseOffsets;
-  // Section size not including header.
-  uint32_t CurrentSectionSize{0};
   bool StrOffsetSectionWasModified = false;
 };
 
diff --git a/bolt/lib/Core/DebugData.cpp b/bolt/lib/Core/DebugData.cpp
index 9061d4f0e197a..dcf3a36e35e3f 100644
--- a/bolt/lib/Core/DebugData.cpp
+++ b/bolt/lib/Core/DebugData.cpp
@@ -889,8 +889,10 @@ void DebugStrOffsetsWriter::finalizeSection(DWARFUnit &Unit,
   // Handling re-use of str-offsets section.
   if (RetVal == ProcessedBaseOffsets.end() || StrOffsetSectionWasModified) {
     // Writing out the header for each section.
-    support::endian::write(*StrOffsetsStream, CurrentSectionSize + 4,
-                           llvm::endianness::little);
+    support::endian::write(
+        *StrOffsetsStream,
+        static_cast<uint32_t>(IndexToAddressMap.size() * 4 + 4),
+        llvm::endianness::little);
     support::endian::write(*StrOffsetsStream, static_cast<uint16_t>(5),
                            llvm::endianness::little);
     support::endian::write(*StrOffsetsStream, static_cast<uint16_t>(0),
diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp
index 5580d85e3fa77..1cc07c1cc9f76 100644
--- a/bolt/lib/Rewrite/DWARFRewriter.cpp
+++ b/bolt/lib/Rewrite/DWARFRewriter.cpp
@@ -696,8 +696,9 @@ void DWARFRewriter::updateDebugInfo() {
     std::optional<DWARFUnit *> SplitCU;
     std::optional<uint64_t> RangesBase;
     std::optional<uint64_t> DWOId = Unit->getDWOId();
-    StrOffstsWriter->initialize(Unit->getStringOffsetSection(),
-                                Unit->getStringOffsetsTableContribution());
+    if (Unit->getVersion() >= 5)
+      StrOffstsWriter->initialize(Unit->getStringOffsetSection(),
+                                  Unit->getStringOffsetsTableContribution());
     if (DWOId)
       SplitCU = BC.getDWOCU(*DWOId);
     DebugLocWriter *DebugLocWriter = createRangeLocList(*Unit);
diff --git a/bolt/test/X86/dwarf5-two-cu-str-offset-table.test b/bolt/test/X86/dwarf5-two-cu-str-offset-table.test
new file mode 100644
index 0000000000000..92b4db9382d1a
--- /dev/null
+++ b/bolt/test/X86/dwarf5-two-cu-str-offset-table.test
@@ -0,0 +1,66 @@
+# REQUIRES: system-linux
+
+# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5_main.s -o %tmain.o
+# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5_helper.s -o %thelper.o
+# RUN: %clang %cflags -dwarf-5 %tmain.o %thelper.o -o %t.exe -Wl,-q
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-dwarfdump --show-form --verbose --debug-str-offsets %t.exe > %t.txt
+# RUN: llvm-dwarfdump --show-form --verbose --debug-str-offsets %t.bolt >> %t.txt
+# RUN: cat %t.txt | FileCheck --check-prefix=CHECK %s
+
+# This test checks we correclty re-renerate .debug-str-offsets.
+
+# CHECK: .debug_str_offsets contents
+# CHECK-NEXT: 0x00000000: Contribution size = 52, Format = DWARF32, Version = 5
+# CHECK-NEXT: 0x00000008: 00000016 "clang version 15.0.0"
+# CHECK-NEXT: 0x0000000c: 00000049 "main.cpp"
+# CHECK-NEXT: 0x00000010: 0000008d "/testLocListMultiple"
+# CHECK-NEXT: 0x00000014: 00000000 "_Z3usePiS_"
+# CHECK-NEXT: 0x00000018: 0000007d "use"
+# CHECK-NEXT: 0x0000001c: 00000052 "main"
+# CHECK-NEXT: 0x00000020: 00000057 "int"
+# CHECK-NEXT: 0x00000024: 0000005b "x"
+# CHECK-NEXT: 0x00000028: 0000007b "y"
+# CHECK-NEXT: 0x0000002c: 00000076 "argc"
+# CHECK-NEXT: 0x00000030: 0000005d "argv"
+# CHECK-NEXT: 0x00000034: 00000062 "char"
+# CHECK-NEXT: 0x00000038: Contribution size = 48, Format = DWARF32, Version = 5
+# CHECK-NEXT: 0x00000040: 0000002b "clang version 15.0.0)"
+# CHECK-NEXT: 0x00000044: 00000041 "foo.cpp"
+# CHECK-NEXT: 0x00000048: 0000008d "/testLocListMultiple"
+# CHECK-NEXT: 0x0000004c: 0000000f "fooVar"
+# CHECK-NEXT: 0x00000050: 00000057 "int"
+# CHECK-NEXT: 0x00000054: 00000081 "_Z6useFooPi"
+# CHECK-NEXT: 0x00000058: 00000067 "useFoo"
+# CHECK-NEXT: 0x0000005c: 0000005b "x"
+# CHECK-NEXT: 0x00000060: 0000006e "_Z3fooi"
+# CHECK-NEXT: 0x00000064: 0000000b "foo"
+# CHECK-NEXT: 0x00000068: 00000076 "argc"
+
+# Checking post bolt
+# CHECK: .debug_str_offsets contents
+# CHECK-NEXT: 0x00000000: Contribution size = 52, Format = DWARF32, Version = 5
+# CHECK-NEXT: 0x00000008: 00000016 "clang version 15.0.0"
+# CHECK-NEXT: 0x0000000c: 00000049 "main.cpp"
+# CHECK-NEXT: 0x00000010: 0000008d "/testLocListMultiple"
+# CHECK-NEXT: 0x00000014: 00000000 "_Z3usePiS_"
+# CHECK-NEXT: 0x00000018: 0000007d "use"
+# CHECK-NEXT: 0x0000001c: 00000052 "main"
+# CHECK-NEXT: 0x00000020: 00000057 "int"
+# CHECK-NEXT: 0x00000024: 0000005b "x"
+# CHECK-NEXT: 0x00000028: 0000007b "y"
+# CHECK-NEXT: 0x0000002c: 00000076 "argc"
+# CHECK-NEXT: 0x00000030: 0000005d "argv"
+# CHECK-NEXT: 0x00000034: 00000062 "char"
+# CHECK-NEXT: 0x00000038: Contribution size = 48, Format = DWARF32, Version = 5
+# CHECK-NEXT: 0x00000040: 0000002b "clang version 15.0.0)"
+# CHECK-NEXT: 0x00000044: 00000041 "foo.cpp"
+# CHECK-NEXT: 0x00000048: 0000008d "/testLocListMultiple"
+# CHECK-NEXT: 0x0000004c: 0000000f "fooVar"
+# CHECK-NEXT: 0x00000050: 00000057 "int"
+# CHECK-NEXT: 0x00000054: 00000081 "_Z6useFooPi"
+# CHECK-NEXT: 0x00000058: 00000067 "useFoo"
+# CHECK-NEXT: 0x0000005c: 0000005b "x"
+# CHECK-NEXT: 0x00000060: 0000006e "_Z3fooi"
+# CHECK-NEXT: 0x00000064: 0000000b "foo"
+# CHECK-NEXT: 0x00000068: 00000076 "argc"

>From 845fe1ca0a4c0a20874e00f7700a49330ada1207 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Mon, 11 Dec 2023 13:34:47 -0800
Subject: [PATCH 2/3] removed offsets

---
 .../X86/dwarf5-two-cu-str-offset-table.test   | 92 +++++++++----------
 1 file changed, 46 insertions(+), 46 deletions(-)

diff --git a/bolt/test/X86/dwarf5-two-cu-str-offset-table.test b/bolt/test/X86/dwarf5-two-cu-str-offset-table.test
index 92b4db9382d1a..094d794bb1935 100644
--- a/bolt/test/X86/dwarf5-two-cu-str-offset-table.test
+++ b/bolt/test/X86/dwarf5-two-cu-str-offset-table.test
@@ -12,55 +12,55 @@
 
 # CHECK: .debug_str_offsets contents
 # CHECK-NEXT: 0x00000000: Contribution size = 52, Format = DWARF32, Version = 5
-# CHECK-NEXT: 0x00000008: 00000016 "clang version 15.0.0"
-# CHECK-NEXT: 0x0000000c: 00000049 "main.cpp"
-# CHECK-NEXT: 0x00000010: 0000008d "/testLocListMultiple"
-# CHECK-NEXT: 0x00000014: 00000000 "_Z3usePiS_"
-# CHECK-NEXT: 0x00000018: 0000007d "use"
-# CHECK-NEXT: 0x0000001c: 00000052 "main"
-# CHECK-NEXT: 0x00000020: 00000057 "int"
-# CHECK-NEXT: 0x00000024: 0000005b "x"
-# CHECK-NEXT: 0x00000028: 0000007b "y"
-# CHECK-NEXT: 0x0000002c: 00000076 "argc"
-# CHECK-NEXT: 0x00000030: 0000005d "argv"
-# CHECK-NEXT: 0x00000034: 00000062 "char"
+# CHECK-NEXT: "clang version 15.0.0"
+# CHECK-NEXT: "main.cpp"
+# CHECK-NEXT: "/testLocListMultiple"
+# CHECK-NEXT: "_Z3usePiS_"
+# CHECK-NEXT: "use"
+# CHECK-NEXT: "main"
+# CHECK-NEXT: "int"
+# CHECK-NEXT: "x"
+# CHECK-NEXT: "y"
+# CHECK-NEXT: "argc"
+# CHECK-NEXT: "argv"
+# CHECK-NEXT: "char"
 # CHECK-NEXT: 0x00000038: Contribution size = 48, Format = DWARF32, Version = 5
-# CHECK-NEXT: 0x00000040: 0000002b "clang version 15.0.0)"
-# CHECK-NEXT: 0x00000044: 00000041 "foo.cpp"
-# CHECK-NEXT: 0x00000048: 0000008d "/testLocListMultiple"
-# CHECK-NEXT: 0x0000004c: 0000000f "fooVar"
-# CHECK-NEXT: 0x00000050: 00000057 "int"
-# CHECK-NEXT: 0x00000054: 00000081 "_Z6useFooPi"
-# CHECK-NEXT: 0x00000058: 00000067 "useFoo"
-# CHECK-NEXT: 0x0000005c: 0000005b "x"
-# CHECK-NEXT: 0x00000060: 0000006e "_Z3fooi"
-# CHECK-NEXT: 0x00000064: 0000000b "foo"
-# CHECK-NEXT: 0x00000068: 00000076 "argc"
+# CHECK-NEXT: "clang version 15.0.0)"
+# CHECK-NEXT: "foo.cpp"
+# CHECK-NEXT: "/testLocListMultiple"
+# CHECK-NEXT: "fooVar"
+# CHECK-NEXT: "int"
+# CHECK-NEXT: "_Z6useFooPi"
+# CHECK-NEXT: "useFoo"
+# CHECK-NEXT: "x"
+# CHECK-NEXT: "_Z3fooi"
+# CHECK-NEXT: "foo"
+# CHECK-NEXT: "argc"
 
 # Checking post bolt
 # CHECK: .debug_str_offsets contents
 # CHECK-NEXT: 0x00000000: Contribution size = 52, Format = DWARF32, Version = 5
-# CHECK-NEXT: 0x00000008: 00000016 "clang version 15.0.0"
-# CHECK-NEXT: 0x0000000c: 00000049 "main.cpp"
-# CHECK-NEXT: 0x00000010: 0000008d "/testLocListMultiple"
-# CHECK-NEXT: 0x00000014: 00000000 "_Z3usePiS_"
-# CHECK-NEXT: 0x00000018: 0000007d "use"
-# CHECK-NEXT: 0x0000001c: 00000052 "main"
-# CHECK-NEXT: 0x00000020: 00000057 "int"
-# CHECK-NEXT: 0x00000024: 0000005b "x"
-# CHECK-NEXT: 0x00000028: 0000007b "y"
-# CHECK-NEXT: 0x0000002c: 00000076 "argc"
-# CHECK-NEXT: 0x00000030: 0000005d "argv"
-# CHECK-NEXT: 0x00000034: 00000062 "char"
+# CHECK-NEXT: "clang version 15.0.0"
+# CHECK-NEXT: "main.cpp"
+# CHECK-NEXT: "/testLocListMultiple"
+# CHECK-NEXT: "_Z3usePiS_"
+# CHECK-NEXT: "use"
+# CHECK-NEXT: "main"
+# CHECK-NEXT: "int"
+# CHECK-NEXT: "x"
+# CHECK-NEXT: "y"
+# CHECK-NEXT: "argc"
+# CHECK-NEXT: "argv"
+# CHECK-NEXT: "char"
 # CHECK-NEXT: 0x00000038: Contribution size = 48, Format = DWARF32, Version = 5
-# CHECK-NEXT: 0x00000040: 0000002b "clang version 15.0.0)"
-# CHECK-NEXT: 0x00000044: 00000041 "foo.cpp"
-# CHECK-NEXT: 0x00000048: 0000008d "/testLocListMultiple"
-# CHECK-NEXT: 0x0000004c: 0000000f "fooVar"
-# CHECK-NEXT: 0x00000050: 00000057 "int"
-# CHECK-NEXT: 0x00000054: 00000081 "_Z6useFooPi"
-# CHECK-NEXT: 0x00000058: 00000067 "useFoo"
-# CHECK-NEXT: 0x0000005c: 0000005b "x"
-# CHECK-NEXT: 0x00000060: 0000006e "_Z3fooi"
-# CHECK-NEXT: 0x00000064: 0000000b "foo"
-# CHECK-NEXT: 0x00000068: 00000076 "argc"
+# CHECK-NEXT: "clang version 15.0.0)"
+# CHECK-NEXT: "foo.cpp"
+# CHECK-NEXT: "/testLocListMultiple"
+# CHECK-NEXT: "fooVar"
+# CHECK-NEXT: "int"
+# CHECK-NEXT: "_Z6useFooPi"
+# CHECK-NEXT: "useFoo"
+# CHECK-NEXT: "x"
+# CHECK-NEXT: "_Z3fooi"
+# CHECK-NEXT: "foo"
+# CHECK-NEXT: "argc"

>From 737821d07e332f16b867589b3ccc33f9ebab008c Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Mon, 11 Dec 2023 15:28:52 -0800
Subject: [PATCH 3/3] fixed comments in test

---
 bolt/test/X86/dwarf5-two-cu-str-offset-table.test | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/bolt/test/X86/dwarf5-two-cu-str-offset-table.test b/bolt/test/X86/dwarf5-two-cu-str-offset-table.test
index 094d794bb1935..20503951df4e1 100644
--- a/bolt/test/X86/dwarf5-two-cu-str-offset-table.test
+++ b/bolt/test/X86/dwarf5-two-cu-str-offset-table.test
@@ -8,7 +8,7 @@
 # RUN: llvm-dwarfdump --show-form --verbose --debug-str-offsets %t.bolt >> %t.txt
 # RUN: cat %t.txt | FileCheck --check-prefix=CHECK %s
 
-# This test checks we correclty re-renerate .debug-str-offsets.
+## This test checks we correclty re-renerate .debug_str_offsets.
 
 # CHECK: .debug_str_offsets contents
 # CHECK-NEXT: 0x00000000: Contribution size = 52, Format = DWARF32, Version = 5
@@ -37,7 +37,7 @@
 # CHECK-NEXT: "foo"
 # CHECK-NEXT: "argc"
 
-# Checking post bolt
+## Checking post bolt
 # CHECK: .debug_str_offsets contents
 # CHECK-NEXT: 0x00000000: Contribution size = 52, Format = DWARF32, Version = 5
 # CHECK-NEXT: "clang version 15.0.0"



More information about the llvm-commits mailing list