[llvm] [BOLT] Fix DWARF4/5 file index handling in debug info functions (PR #151401)

Grigory Pastukhov via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 27 13:40:19 PDT 2025


https://github.com/grigorypas updated https://github.com/llvm/llvm-project/pull/151401

>From bf6a2781fc120b94ac90e3b550f4e6f0040b87c8 Mon Sep 17 00:00:00 2001
From: Grigory Pastukhov <gpastukhov at meta.com>
Date: Wed, 30 Jul 2025 14:44:29 -0700
Subject: [PATCH 1/4] Use getFileNameEntry for retrieving FileNameEntry DWARF
 version agnositc way

---
 bolt/lib/Core/BinaryContext.cpp          | 18 +++++++-----------
 bolt/test/perf2bolt/Inputs/perf_test.lds | 11 +++++------
 2 files changed, 12 insertions(+), 17 deletions(-)

diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index da59a188c6b60..dd0d041692484 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -1568,23 +1568,19 @@ unsigned BinaryContext::addDebugFilenameToUnit(const uint32_t DestCUID,
   DWARFCompileUnit *SrcUnit = DwCtx->getCompileUnitForOffset(SrcCUID);
   const DWARFDebugLine::LineTable *LineTable =
       DwCtx->getLineTableForUnit(SrcUnit);
-  const std::vector<DWARFDebugLine::FileNameEntry> &FileNames =
-      LineTable->Prologue.FileNames;
-  // Dir indexes start at 1, as DWARF file numbers, and a dir index 0
+  const DWARFDebugLine::FileNameEntry &FileNameEntry =
+      LineTable->Prologue.getFileNameEntry(FileIndex);
+  // Dir indexes start at 1 and a dir index 0
   // means empty dir.
-  assert(FileIndex > 0 && FileIndex <= FileNames.size() &&
-         "FileIndex out of range for the compilation unit.");
   StringRef Dir = "";
-  if (FileNames[FileIndex - 1].DirIdx != 0) {
+  if (FileNameEntry.DirIdx != 0) {
     if (std::optional<const char *> DirName = dwarf::toString(
-            LineTable->Prologue
-                .IncludeDirectories[FileNames[FileIndex - 1].DirIdx - 1])) {
+            LineTable->Prologue.IncludeDirectories[FileNameEntry.DirIdx - 1])) {
       Dir = *DirName;
     }
   }
   StringRef FileName = "";
-  if (std::optional<const char *> FName =
-          dwarf::toString(FileNames[FileIndex - 1].Name))
+  if (std::optional<const char *> FName = dwarf::toString(FileNameEntry.Name))
     FileName = *FName;
   assert(FileName != "");
   DWARFCompileUnit *DstUnit = DwCtx->getCompileUnitForOffset(DestCUID);
@@ -1925,7 +1921,7 @@ static void printDebugInfo(raw_ostream &OS, const MCInst &Instruction,
   const DWARFDebugLine::Row &Row = LineTable->Rows[RowRef.RowIndex - 1];
   StringRef FileName = "";
   if (std::optional<const char *> FName =
-          dwarf::toString(LineTable->Prologue.FileNames[Row.File - 1].Name))
+          dwarf::toString(LineTable->Prologue.getFileNameEntry(Row.File).Name))
     FileName = *FName;
   OS << " # debug line " << FileName << ":" << Row.Line;
   if (Row.Column)
diff --git a/bolt/test/perf2bolt/Inputs/perf_test.lds b/bolt/test/perf2bolt/Inputs/perf_test.lds
index 66d925a05bebc..c2704d73a638c 100644
--- a/bolt/test/perf2bolt/Inputs/perf_test.lds
+++ b/bolt/test/perf2bolt/Inputs/perf_test.lds
@@ -1,13 +1,12 @@
 SECTIONS {
-  . = SIZEOF_HEADERS;
+  . = 0x400000 + SIZEOF_HEADERS;
   .interp : { *(.interp) }
   .note.gnu.build-id : { *(.note.gnu.build-id) }
-  . = 0x212e8;
   .dynsym         : { *(.dynsym) }
-  . = 0x31860;
+  . = 0x801000;
   .text : { *(.text*) }
-  . = 0x41c20;
+  . = 0x803000;
   .fini_array : { *(.fini_array) }
-  . = 0x54e18;
+  . = 0x805000;
   .data : { *(.data) }
-}
\ No newline at end of file
+}

>From 18c8d044003b94833fb7797712ea666fc452629a Mon Sep 17 00:00:00 2001
From: Grigory Pastukhov <gpastukhov at meta.com>
Date: Mon, 18 Aug 2025 16:35:14 -0700
Subject: [PATCH 2/4] Drop changes to perf_test.lds

---
 bolt/test/perf2bolt/Inputs/perf_test.lds | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/bolt/test/perf2bolt/Inputs/perf_test.lds b/bolt/test/perf2bolt/Inputs/perf_test.lds
index c2704d73a638c..66d925a05bebc 100644
--- a/bolt/test/perf2bolt/Inputs/perf_test.lds
+++ b/bolt/test/perf2bolt/Inputs/perf_test.lds
@@ -1,12 +1,13 @@
 SECTIONS {
-  . = 0x400000 + SIZEOF_HEADERS;
+  . = SIZEOF_HEADERS;
   .interp : { *(.interp) }
   .note.gnu.build-id : { *(.note.gnu.build-id) }
+  . = 0x212e8;
   .dynsym         : { *(.dynsym) }
-  . = 0x801000;
+  . = 0x31860;
   .text : { *(.text*) }
-  . = 0x803000;
+  . = 0x41c20;
   .fini_array : { *(.fini_array) }
-  . = 0x805000;
+  . = 0x54e18;
   .data : { *(.data) }
-}
+}
\ No newline at end of file

>From 89d18e2eece16f156a8993c8517393edea37b1e8 Mon Sep 17 00:00:00 2001
From: Grigory Pastukhov <gpastukhov at meta.com>
Date: Tue, 19 Aug 2025 20:00:04 -0700
Subject: [PATCH 3/4] Add tests that trigger DWARF4 vs DWARF5 bug explicitly

---
 bolt/test/X86/Inputs/dwarf5-two-cus-foo.cpp |  3 +++
 bolt/test/X86/dwarf5-debug-line-print.test  | 14 ++++++++++++++
 bolt/test/X86/dwarf5-two-cus.test           | 20 ++++++++++++++++++++
 3 files changed, 37 insertions(+)
 create mode 100644 bolt/test/X86/Inputs/dwarf5-two-cus-foo.cpp
 create mode 100644 bolt/test/X86/dwarf5-debug-line-print.test
 create mode 100644 bolt/test/X86/dwarf5-two-cus.test

diff --git a/bolt/test/X86/Inputs/dwarf5-two-cus-foo.cpp b/bolt/test/X86/Inputs/dwarf5-two-cus-foo.cpp
new file mode 100644
index 0000000000000..cfeabf0d5974a
--- /dev/null
+++ b/bolt/test/X86/Inputs/dwarf5-two-cus-foo.cpp
@@ -0,0 +1,3 @@
+#include <cstdio>
+
+extern "C" void foo() { printf("Hello from second CU!\n"); }
diff --git a/bolt/test/X86/dwarf5-debug-line-print.test b/bolt/test/X86/dwarf5-debug-line-print.test
new file mode 100644
index 0000000000000..917249c95e0bd
--- /dev/null
+++ b/bolt/test/X86/dwarf5-debug-line-print.test
@@ -0,0 +1,14 @@
+// Check that BOLT correctly generates debug line comments for DWARF-5.
+
+// REQUIRES: system-linux
+
+// RUN: %clang -g -gdwarf-5 -O0 -xc++ %s -o %t.exe
+// RUN: llvm-bolt %t.exe --update-debug-sections --print-debug-info \
+// RUN:   --print-after-lowering -o %t.bolt | FileCheck %s
+
+// CHECK: pushq   %rbp # debug line {{.*}}dwarf5-debug-line-print.test:11
+
+int main(){
+  int x = 0;
+  return 0;
+}
diff --git a/bolt/test/X86/dwarf5-two-cus.test b/bolt/test/X86/dwarf5-two-cus.test
new file mode 100644
index 0000000000000..6bb7a49b2dd06
--- /dev/null
+++ b/bolt/test/X86/dwarf5-two-cus.test
@@ -0,0 +1,20 @@
+// Check that BOLT correctly handles two CUs with DWARF-5 debug info (does not crash).
+
+// REQUIRES: system-linux
+
+// RUN: %clang -g -gdwarf-5 -O1 -xc++ %s -o %t-main.o -c
+// RUN: %clang -g -gdwarf-5 -O1 -xc++ %S/Inputs/dwarf5-two-cus-foo.cpp -o %t-foo.o -c
+// RUN: %clang %t-main.o %t-foo.o -o %t.exe
+// RUN: llvm-bolt %t.exe --update-debug-sections --force-inline=foo \
+// RUN:   -o %t.bolt | FileCheck %s
+
+// CHECK-NOT: BOLT-ERROR
+// CHECK-NOT: BOLT-WARNING
+// CHECK: BOLT-INFO: inlined {{[0-9]+}} calls at {{[1-9][0-9]*}} call sites
+
+extern "C" void foo();
+
+int main() {
+  foo();
+  return 0;
+}

>From 23270702c6c8a89ae1a840d6c50ac4ba30ee1a16 Mon Sep 17 00:00:00 2001
From: Grigory Pastukhov <gpastukhov at meta.com>
Date: Wed, 27 Aug 2025 12:50:40 -0700
Subject: [PATCH 4/4] Convert tests to assembly

---
 bolt/test/X86/Inputs/dwarf5-two-cus-foo.cpp |   3 -
 bolt/test/X86/dwarf5-debug-line-print.s     | 148 ++++++++++++
 bolt/test/X86/dwarf5-debug-line-print.test  |  14 --
 bolt/test/X86/dwarf5-two-cus.s              | 251 ++++++++++++++++++++
 bolt/test/X86/dwarf5-two-cus.test           |  20 --
 5 files changed, 399 insertions(+), 37 deletions(-)
 delete mode 100644 bolt/test/X86/Inputs/dwarf5-two-cus-foo.cpp
 create mode 100644 bolt/test/X86/dwarf5-debug-line-print.s
 delete mode 100644 bolt/test/X86/dwarf5-debug-line-print.test
 create mode 100644 bolt/test/X86/dwarf5-two-cus.s
 delete mode 100644 bolt/test/X86/dwarf5-two-cus.test

diff --git a/bolt/test/X86/Inputs/dwarf5-two-cus-foo.cpp b/bolt/test/X86/Inputs/dwarf5-two-cus-foo.cpp
deleted file mode 100644
index cfeabf0d5974a..0000000000000
--- a/bolt/test/X86/Inputs/dwarf5-two-cus-foo.cpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#include <cstdio>
-
-extern "C" void foo() { printf("Hello from second CU!\n"); }
diff --git a/bolt/test/X86/dwarf5-debug-line-print.s b/bolt/test/X86/dwarf5-debug-line-print.s
new file mode 100644
index 0000000000000..ff6b16adfb50c
--- /dev/null
+++ b/bolt/test/X86/dwarf5-debug-line-print.s
@@ -0,0 +1,148 @@
+# REQUIRES: system-linux
+
+## Check that BOLT correctly prints generates debug line comments for DWARF-5.
+
+
+# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
+# RUN: %clang %cflags -dwarf-5 %t1.o -o %t.exe -Wl,-q
+# RUN: llvm-bolt %t.exe --update-debug-sections --print-debug-info \
+# RUN:   --print-after-lowering -o %t.bolt | FileCheck %s
+
+# CHECK: xorq    %rdi, %rdi # debug line main.c:2:5
+
+# __attribute__((naked)) void _start() {
+#     __asm__(
+#         "xor %rdi, %rdi\n"   // exit code 0
+#         "mov $60, %rax\n"    // syscall number for exit
+#         "syscall\n"
+#     );
+# }
+
+        .file   "main.c"
+        .text
+        .globl  _start                          # -- Begin function _start
+        .p2align        4
+        .type   _start, at function
+_start:                                 # @_start
+.Lfunc_begin0:
+        .file   0 "/home/gpastukhov/tmp2" "main.c" md5 0x94c0e54a615c2a21415ddb904991abd8
+        .cfi_startproc
+# %bb.0:
+        .loc    0 2 5 prologue_end              # main.c:2:5
+        #APP
+        xorq    %rdi, %rdi
+        movq    $60, %rax
+        syscall
+
+        #NO_APP
+.Ltmp0:
+.Lfunc_end0:
+        .size   _start, .Lfunc_end0-_start
+        .cfi_endproc
+                                        # -- End function
+        .section        .debug_abbrev,"", at progbits
+        .byte   1                               # Abbreviation Code
+        .byte   17                              # DW_TAG_compile_unit
+        .byte   1                               # DW_CHILDREN_yes
+        .byte   37                              # DW_AT_producer
+        .byte   37                              # DW_FORM_strx1
+        .byte   19                              # DW_AT_language
+        .byte   5                               # DW_FORM_data2
+        .byte   3                               # DW_AT_name
+        .byte   37                              # DW_FORM_strx1
+        .byte   114                             # DW_AT_str_offsets_base
+        .byte   23                              # DW_FORM_sec_offset
+        .byte   16                              # DW_AT_stmt_list
+        .byte   23                              # DW_FORM_sec_offset
+        .byte   27                              # DW_AT_comp_dir
+        .byte   37                              # DW_FORM_strx1
+        .byte   17                              # DW_AT_low_pc
+        .byte   27                              # DW_FORM_addrx
+        .byte   18                              # DW_AT_high_pc
+        .byte   6                               # DW_FORM_data4
+        .byte   115                             # DW_AT_addr_base
+        .byte   23                              # DW_FORM_sec_offset
+        .byte   0                               # EOM(1)
+        .byte   0                               # EOM(2)
+        .byte   2                               # Abbreviation Code
+        .byte   46                              # DW_TAG_subprogram
+        .byte   0                               # DW_CHILDREN_no
+        .byte   17                              # DW_AT_low_pc
+        .byte   27                              # DW_FORM_addrx
+        .byte   18                              # DW_AT_high_pc
+        .byte   6                               # DW_FORM_data4
+        .byte   64                              # DW_AT_frame_base
+        .byte   24                              # DW_FORM_exprloc
+        .byte   3                               # DW_AT_name
+        .byte   37                              # DW_FORM_strx1
+        .byte   58                              # DW_AT_decl_file
+        .byte   11                              # DW_FORM_data1
+        .byte   59                              # DW_AT_decl_line
+        .byte   11                              # DW_FORM_data1
+        .byte   63                              # DW_AT_external
+        .byte   25                              # DW_FORM_flag_present
+        .byte   0                               # EOM(1)
+        .byte   0                               # EOM(2)
+        .byte   0                               # EOM(3)
+        .section        .debug_info,"", at progbits
+.Lcu_begin0:
+        .long   .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+        .short  5                               # DWARF version number
+        .byte   1                               # DWARF Unit Type
+        .byte   8                               # Address Size (in bytes)
+        .long   .debug_abbrev                   # Offset Into Abbrev. Section
+        .byte   1                               # Abbrev [1] 0xc:0x23 DW_TAG_compile_unit
+        .byte   0                               # DW_AT_producer
+        .short  29                              # DW_AT_language
+        .byte   1                               # DW_AT_name
+        .long   .Lstr_offsets_base0             # DW_AT_str_offsets_base
+        .long   .Lline_table_start0             # DW_AT_stmt_list
+        .byte   2                               # DW_AT_comp_dir
+        .byte   0                               # DW_AT_low_pc
+        .long   .Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+        .long   .Laddr_table_base0              # DW_AT_addr_base
+        .byte   2                               # Abbrev [2] 0x23:0xb DW_TAG_subprogram
+        .byte   0                               # DW_AT_low_pc
+        .long   .Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+        .byte   1                               # DW_AT_frame_base
+        .byte   87
+        .byte   3                               # DW_AT_name
+        .byte   0                               # DW_AT_decl_file
+        .byte   1                               # DW_AT_decl_line
+                                        # DW_AT_external
+        .byte   0                               # End Of Children Mark
+.Ldebug_info_end0:
+        .section        .debug_str_offsets,"", at progbits
+        .long   20                              # Length of String Offsets Set
+        .short  5
+        .short  0
+.Lstr_offsets_base0:
+        .section        .debug_str,"MS", at progbits,1
+.Linfo_string0:
+        .asciz  "clang version 20.1.8 (CentOS 20.1.8-1.el9)" # string offset=0
+.Linfo_string1:
+        .asciz  "main.c"                        # string offset=43
+.Linfo_string2:
+        .asciz  "/home/gpastukhov/tmp2"         # string offset=50
+.Linfo_string3:
+        .asciz  "_start"                        # string offset=72
+        .section        .debug_str_offsets,"", at progbits
+        .long   .Linfo_string0
+        .long   .Linfo_string1
+        .long   .Linfo_string2
+        .long   .Linfo_string3
+        .section        .debug_addr,"", at progbits
+        .long   .Ldebug_addr_end0-.Ldebug_addr_start0 # Length of contribution
+.Ldebug_addr_start0:
+        .short  5                               # DWARF version number
+        .byte   8                               # Address size
+        .byte   0                               # Segment selector size
+.Laddr_table_base0:
+        .quad   .Lfunc_begin0
+.Ldebug_addr_end0:
+        .ident  "clang version 20.1.8 (CentOS 20.1.8-1.el9)"
+        .section        ".note.GNU-stack","", at progbits
+        .addrsig
+        .section        .debug_line,"", at progbits
+.Lline_table_start0:
diff --git a/bolt/test/X86/dwarf5-debug-line-print.test b/bolt/test/X86/dwarf5-debug-line-print.test
deleted file mode 100644
index 917249c95e0bd..0000000000000
--- a/bolt/test/X86/dwarf5-debug-line-print.test
+++ /dev/null
@@ -1,14 +0,0 @@
-// Check that BOLT correctly generates debug line comments for DWARF-5.
-
-// REQUIRES: system-linux
-
-// RUN: %clang -g -gdwarf-5 -O0 -xc++ %s -o %t.exe
-// RUN: llvm-bolt %t.exe --update-debug-sections --print-debug-info \
-// RUN:   --print-after-lowering -o %t.bolt | FileCheck %s
-
-// CHECK: pushq   %rbp # debug line {{.*}}dwarf5-debug-line-print.test:11
-
-int main(){
-  int x = 0;
-  return 0;
-}
diff --git a/bolt/test/X86/dwarf5-two-cus.s b/bolt/test/X86/dwarf5-two-cus.s
new file mode 100644
index 0000000000000..8b5afb4c6fd05
--- /dev/null
+++ b/bolt/test/X86/dwarf5-two-cus.s
@@ -0,0 +1,251 @@
+## Check that BOLT correctly handles two CUs with DWARF-5 debug info (does not crash), when
+## a function from one CU is forced to be inlined into another.
+
+# REQUIRES: system-linux
+
+# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %s -o %t-main.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 -gdwarf-5 -Wl,-q %t-main.o %thelper.o -o %t.exe
+# RUN: llvm-bolt %t.exe --update-debug-sections --force-inline=_Z3fooi \
+# RUN:   -o %t.bolt | FileCheck %s
+
+# CHECK-NOT: BOLT-ERROR
+# CHECK-NOT: BOLT-WARNING
+# CHECK: BOLT-INFO: inlined {{[0-9]+}} calls at {{[1-9][0-9]*}} call sites
+
+# extern int foo(int);
+# int main(){
+#     foo(10);
+#     return 0;
+# }
+        .file   "main.cpp"
+        .text
+        .globl  main                            # -- Begin function main
+        .p2align        4
+        .type   main, at function
+main:                                   # @main
+.Lfunc_begin0:
+        .file   0 "/home/gpastukhov/tmp2" "main.cpp" md5 0x5c930f5d3a068b09fd18ece59c58bdcf
+        .loc    0 2 0                           # main.cpp:2:0
+        .cfi_startproc
+# %bb.0:
+        pushq   %rax
+        .cfi_def_cfa_offset 16
+.Ltmp0:
+        .loc    0 3 5 prologue_end              # main.cpp:3:5
+        movl    $10, %edi
+        callq   _Z3fooi
+.Ltmp1:
+        .loc    0 4 5                           # main.cpp:4:5
+        xorl    %eax, %eax
+        .loc    0 4 5 epilogue_begin is_stmt 0  # main.cpp:4:5
+        popq    %rcx
+        .cfi_def_cfa_offset 8
+        retq
+.Ltmp2:
+.Lfunc_end0:
+        .size   main, .Lfunc_end0-main
+        .cfi_endproc
+                                        # -- End function
+        .section        .debug_abbrev,"", at progbits
+        .byte   1                               # Abbreviation Code
+        .byte   17                              # DW_TAG_compile_unit
+        .byte   1                               # DW_CHILDREN_yes
+        .byte   37                              # DW_AT_producer
+        .byte   37                              # DW_FORM_strx1
+        .byte   19                              # DW_AT_language
+        .byte   5                               # DW_FORM_data2
+        .byte   3                               # DW_AT_name
+        .byte   37                              # DW_FORM_strx1
+        .byte   114                             # DW_AT_str_offsets_base
+        .byte   23                              # DW_FORM_sec_offset
+        .byte   16                              # DW_AT_stmt_list
+        .byte   23                              # DW_FORM_sec_offset
+        .byte   27                              # DW_AT_comp_dir
+        .byte   37                              # DW_FORM_strx1
+        .byte   17                              # DW_AT_low_pc
+        .byte   27                              # DW_FORM_addrx
+        .byte   18                              # DW_AT_high_pc
+        .byte   6                               # DW_FORM_data4
+        .byte   115                             # DW_AT_addr_base
+        .byte   23                              # DW_FORM_sec_offset
+        .byte   0                               # EOM(1)
+        .byte   0                               # EOM(2)
+        .byte   2                               # Abbreviation Code
+        .byte   46                              # DW_TAG_subprogram
+        .byte   1                               # DW_CHILDREN_yes
+        .byte   17                              # DW_AT_low_pc
+        .byte   27                              # DW_FORM_addrx
+        .byte   18                              # DW_AT_high_pc
+        .byte   6                               # DW_FORM_data4
+        .byte   64                              # DW_AT_frame_base
+        .byte   24                              # DW_FORM_exprloc
+        .byte   122                             # DW_AT_call_all_calls
+        .byte   25                              # DW_FORM_flag_present
+        .byte   3                               # DW_AT_name
+        .byte   37                              # DW_FORM_strx1
+        .byte   58                              # DW_AT_decl_file
+        .byte   11                              # DW_FORM_data1
+        .byte   59                              # DW_AT_decl_line
+        .byte   11                              # DW_FORM_data1
+        .byte   73                              # DW_AT_type
+        .byte   19                              # DW_FORM_ref4
+        .byte   63                              # DW_AT_external
+        .byte   25                              # DW_FORM_flag_present
+        .byte   0                               # EOM(1)
+        .byte   0                               # EOM(2)
+        .byte   3                               # Abbreviation Code
+        .byte   72                              # DW_TAG_call_site
+        .byte   1                               # DW_CHILDREN_yes
+        .byte   127                             # DW_AT_call_origin
+        .byte   19                              # DW_FORM_ref4
+        .byte   125                             # DW_AT_call_return_pc
+        .byte   27                              # DW_FORM_addrx
+        .byte   0                               # EOM(1)
+        .byte   0                               # EOM(2)
+        .byte   4                               # Abbreviation Code
+        .byte   73                              # DW_TAG_call_site_parameter
+        .byte   0                               # DW_CHILDREN_no
+        .byte   2                               # DW_AT_location
+        .byte   24                              # DW_FORM_exprloc
+        .byte   126                             # DW_AT_call_value
+        .byte   24                              # DW_FORM_exprloc
+        .byte   0                               # EOM(1)
+        .byte   0                               # EOM(2)
+        .byte   5                               # Abbreviation Code
+        .byte   46                              # DW_TAG_subprogram
+        .byte   1                               # DW_CHILDREN_yes
+        .byte   110                             # DW_AT_linkage_name
+        .byte   37                              # DW_FORM_strx1
+        .byte   3                               # DW_AT_name
+        .byte   37                              # DW_FORM_strx1
+        .byte   58                              # DW_AT_decl_file
+        .byte   11                              # DW_FORM_data1
+        .byte   59                              # DW_AT_decl_line
+        .byte   11                              # DW_FORM_data1
+        .byte   73                              # DW_AT_type
+        .byte   19                              # DW_FORM_ref4
+        .byte   60                              # DW_AT_declaration
+        .byte   25                              # DW_FORM_flag_present
+        .byte   63                              # DW_AT_external
+        .byte   25                              # DW_FORM_flag_present
+        .byte   0                               # EOM(1)
+        .byte   0                               # EOM(2)
+        .byte   6                               # Abbreviation Code
+        .byte   5                               # DW_TAG_formal_parameter
+        .byte   0                               # DW_CHILDREN_no
+        .byte   73                              # DW_AT_type
+        .byte   19                              # DW_FORM_ref4
+        .byte   0                               # EOM(1)
+        .byte   0                               # EOM(2)
+        .byte   7                               # Abbreviation Code
+        .byte   36                              # DW_TAG_base_type
+        .byte   0                               # DW_CHILDREN_no
+        .byte   3                               # DW_AT_name
+        .byte   37                              # DW_FORM_strx1
+        .byte   62                              # DW_AT_encoding
+        .byte   11                              # DW_FORM_data1
+        .byte   11                              # DW_AT_byte_size
+        .byte   11                              # DW_FORM_data1
+        .byte   0                               # EOM(1)
+        .byte   0                               # EOM(2)
+        .byte   0                               # EOM(3)
+        .section        .debug_info,"", at progbits
+.Lcu_begin0:
+        .long   .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+        .short  5                               # DWARF version number
+        .byte   1                               # DWARF Unit Type
+        .byte   8                               # Address Size (in bytes)
+        .long   .debug_abbrev                   # Offset Into Abbrev. Section
+        .byte   1                               # Abbrev [1] 0xc:0x47 DW_TAG_compile_unit
+        .byte   0                               # DW_AT_producer
+        .short  33                              # DW_AT_language
+        .byte   1                               # DW_AT_name
+        .long   .Lstr_offsets_base0             # DW_AT_str_offsets_base
+        .long   .Lline_table_start0             # DW_AT_stmt_list
+        .byte   2                               # DW_AT_comp_dir
+        .byte   0                               # DW_AT_low_pc
+        .long   .Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+        .long   .Laddr_table_base0              # DW_AT_addr_base
+        .byte   2                               # Abbrev [2] 0x23:0x1c DW_TAG_subprogram
+        .byte   0                               # DW_AT_low_pc
+        .long   .Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+        .byte   1                               # DW_AT_frame_base
+        .byte   87
+                                        # DW_AT_call_all_calls
+        .byte   6                               # DW_AT_name
+        .byte   0                               # DW_AT_decl_file
+        .byte   2                               # DW_AT_decl_line
+        .long   78                              # DW_AT_type
+                                        # DW_AT_external
+        .byte   3                               # Abbrev [3] 0x32:0xc DW_TAG_call_site
+        .long   63                              # DW_AT_call_origin
+        .byte   1                               # DW_AT_call_return_pc
+        .byte   4                               # Abbrev [4] 0x38:0x5 DW_TAG_call_site_parameter
+        .byte   1                               # DW_AT_location
+        .byte   85
+        .byte   1                               # DW_AT_call_value
+        .byte   58
+        .byte   0                               # End Of Children Mark
+        .byte   0                               # End Of Children Mark
+        .byte   5                               # Abbrev [5] 0x3f:0xf DW_TAG_subprogram
+        .byte   3                               # DW_AT_linkage_name
+        .byte   4                               # DW_AT_name
+        .byte   0                               # DW_AT_decl_file
+        .byte   1                               # DW_AT_decl_line
+        .long   78                              # DW_AT_type
+                                        # DW_AT_declaration
+                                        # DW_AT_external
+        .byte   6                               # Abbrev [6] 0x48:0x5 DW_TAG_formal_parameter
+        .long   78                              # DW_AT_type
+        .byte   0                               # End Of Children Mark
+        .byte   7                               # Abbrev [7] 0x4e:0x4 DW_TAG_base_type
+        .byte   5                               # DW_AT_name
+        .byte   5                               # DW_AT_encoding
+        .byte   4                               # DW_AT_byte_size
+        .byte   0                               # End Of Children Mark
+.Ldebug_info_end0:
+        .section        .debug_str_offsets,"", at progbits
+        .long   32                              # Length of String Offsets Set
+        .short  5
+        .short  0
+.Lstr_offsets_base0:
+        .section        .debug_str,"MS", at progbits,1
+.Linfo_string0:
+        .asciz  "clang version 20.1.8 (CentOS 20.1.8-1.el9)" # string offset=0
+.Linfo_string1:
+        .asciz  "main.cpp"                      # string offset=43
+.Linfo_string2:
+        .asciz  "/home/gpastukhov/tmp2"         # string offset=52
+.Linfo_string3:
+        .asciz  "_Z3fooi"                       # string offset=74
+.Linfo_string4:
+        .asciz  "foo"                           # string offset=82
+.Linfo_string5:
+        .asciz  "int"                           # string offset=86
+.Linfo_string6:
+        .asciz  "main"                          # string offset=90
+        .section        .debug_str_offsets,"", at progbits
+        .long   .Linfo_string0
+        .long   .Linfo_string1
+        .long   .Linfo_string2
+        .long   .Linfo_string3
+        .long   .Linfo_string4
+        .long   .Linfo_string5
+        .long   .Linfo_string6
+        .section        .debug_addr,"", at progbits
+        .long   .Ldebug_addr_end0-.Ldebug_addr_start0 # Length of contribution
+.Ldebug_addr_start0:
+        .short  5                               # DWARF version number
+        .byte   8                               # Address size
+        .byte   0                               # Segment selector size
+.Laddr_table_base0:
+        .quad   .Lfunc_begin0
+        .quad   .Ltmp1
+.Ldebug_addr_end0:
+        .ident  "clang version 20.1.8 (CentOS 20.1.8-1.el9)"
+        .section        ".note.GNU-stack","", at progbits
+        .addrsig
+        .section        .debug_line,"", at progbits
+.Lline_table_start0:
diff --git a/bolt/test/X86/dwarf5-two-cus.test b/bolt/test/X86/dwarf5-two-cus.test
deleted file mode 100644
index 6bb7a49b2dd06..0000000000000
--- a/bolt/test/X86/dwarf5-two-cus.test
+++ /dev/null
@@ -1,20 +0,0 @@
-// Check that BOLT correctly handles two CUs with DWARF-5 debug info (does not crash).
-
-// REQUIRES: system-linux
-
-// RUN: %clang -g -gdwarf-5 -O1 -xc++ %s -o %t-main.o -c
-// RUN: %clang -g -gdwarf-5 -O1 -xc++ %S/Inputs/dwarf5-two-cus-foo.cpp -o %t-foo.o -c
-// RUN: %clang %t-main.o %t-foo.o -o %t.exe
-// RUN: llvm-bolt %t.exe --update-debug-sections --force-inline=foo \
-// RUN:   -o %t.bolt | FileCheck %s
-
-// CHECK-NOT: BOLT-ERROR
-// CHECK-NOT: BOLT-WARNING
-// CHECK: BOLT-INFO: inlined {{[0-9]+}} calls at {{[1-9][0-9]*}} call sites
-
-extern "C" void foo();
-
-int main() {
-  foo();
-  return 0;
-}



More information about the llvm-commits mailing list