[llvm] [BOLT][DWARF] Fix debug info update issue with dwarf4 dwp (PR #155619)

Jinjie Huang via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 4 03:19:55 PDT 2025


https://github.com/Jinjie-Huang updated https://github.com/llvm/llvm-project/pull/155619

>From 93d81b553f6782b4bcb67bf6ab61cd7f34bb0a59 Mon Sep 17 00:00:00 2001
From: huangjinjie <huangjinjie at bytedance.com>
Date: Wed, 27 Aug 2025 20:58:34 +0800
Subject: [PATCH 1/6] fix dwarf4 dwp crash

---
 bolt/lib/Rewrite/DWARFRewriter.cpp | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp
index 0c1a1bac6c72e..6eefa5155298b 100644
--- a/bolt/lib/Rewrite/DWARFRewriter.cpp
+++ b/bolt/lib/Rewrite/DWARFRewriter.cpp
@@ -504,9 +504,7 @@ static void emitDWOBuilder(const std::string &DWOName,
     }
     emitUnit(DWODIEBuilder, *Streamer, SplitCU);
   } else {
-    for (std::unique_ptr<llvm::DWARFUnit> &CU :
-         SplitCU.getContext().dwo_compile_units())
-      emitUnit(DWODIEBuilder, *Streamer, *CU);
+    emitUnit(DWODIEBuilder, *Streamer, SplitCU);
 
     // emit debug_types sections for dwarf4
     for (DWARFUnit *CU : DWODIEBuilder.getDWARF4TUVector())

>From 95ac6f4786d901e73856303510475dc6bcf97b12 Mon Sep 17 00:00:00 2001
From: huangjinjie <huangjinjie at bytedance.com>
Date: Tue, 2 Sep 2025 20:47:43 +0800
Subject: [PATCH 2/6] add test

---
 bolt/test/X86/dwarf4-dwp.test | 41 +++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)
 create mode 100644 bolt/test/X86/dwarf4-dwp.test

diff --git a/bolt/test/X86/dwarf4-dwp.test b/bolt/test/X86/dwarf4-dwp.test
new file mode 100644
index 0000000000000..6c619ed55233b
--- /dev/null
+++ b/bolt/test/X86/dwarf4-dwp.test
@@ -0,0 +1,41 @@
+# REQUIRES: system-linux
+
+# RUN: rm -rf %t && mkdir -p %t && cd %t
+# RUN: split-file %s %t
+# RUN: %clangxx -g -gdwarf-4 -gsplit-dwarf %t/main.cpp %t/callee.cpp -o main.exe
+# RUN: llvm-dwp -e %t/main.exe -o %t/main.exe.dwp
+# RUN: llvm-bolt %t/main.exe -o %t/main.exe.bolt -update-debug-sections  2>&1 | FileCheck %s
+
+# CHECK-NOT: Assertion
+
+
+#--- main.cpp
+int hotFunction(int x);
+
+int main(int argc, char **argv) {
+    int sum = 0;
+    for (int i = 0; i < 50000000; ++i) { // 让运行时间更久
+        sum += hotFunction(i);
+    }
+    if (sum)
+        return 0;
+    else
+        return 1;
+}
+
+#--- callee.cpp
+int hotFunction(int x) {
+    if ((x & 1) == 0) {
+        x = x * 3 + 1;
+        if (x % 5 == 0) {
+            x += 7;
+        }
+    } else {
+        x = x * x;
+        if (x % 3 == 0) {
+            x -= 4;
+        }
+    }
+    return x;
+}
+

>From 168fa8993d91fdafedd5ad9dd20abaa5543f1466 Mon Sep 17 00:00:00 2001
From: huangjinjie <huangjinjie at bytedance.com>
Date: Wed, 3 Sep 2025 20:41:27 +0800
Subject: [PATCH 3/6] modify test, use assembly with split-file

---
 bolt/test/X86/dwarf4-dwp.s    | 450 ++++++++++++++++++++++++++++++++++
 bolt/test/X86/dwarf4-dwp.test |  41 ----
 2 files changed, 450 insertions(+), 41 deletions(-)
 create mode 100755 bolt/test/X86/dwarf4-dwp.s
 delete mode 100644 bolt/test/X86/dwarf4-dwp.test

diff --git a/bolt/test/X86/dwarf4-dwp.s b/bolt/test/X86/dwarf4-dwp.s
new file mode 100755
index 0000000000000..d3168af692280
--- /dev/null
+++ b/bolt/test/X86/dwarf4-dwp.s
@@ -0,0 +1,450 @@
+# RUN: rm -rf %t && mkdir -p %t && cd %t
+# RUN: split-file %s %t
+# RUN: %clangxx -g -gdwarf-4 -gsplit-dwarf %t/main.s %t/callee.s -o main.exe
+# RUN: llvm-dwp -e %t/main.exe -o %t/main.exe.dwp
+# RUN: llvm-bolt %t/main.exe -o %t/main.exe.bolt -update-debug-sections  2>&1 | FileCheck %s
+
+# CHECK-NOT: Assertion
+
+#--- main.cpp
+int callee(int x);
+int main() { return callee(0); }
+#--- callee.cpp
+int callee(int x) { return x; }
+#--- gen
+clang++ -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-main.dwo -S main.cpp -v -o -
+echo '#--- callee.s'
+clang++ -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-callee.dwo -S callee.cpp -o -
+#--- main.s
+	.file	"main.cpp"
+	.text
+	.globl	main                            # -- Begin function main
+	.p2align	4
+	.type	main, at function
+main:                                   # @main
+.Lfunc_begin0:
+	.file	1 "." "main.cpp"
+	.loc	1 2 0                           # main.cpp:2:0
+	.cfi_startproc
+# %bb.0:                                # %entry
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$16, %rsp
+	movl	$0, -4(%rbp)
+.Ltmp0:
+	.loc	1 2 21 prologue_end             # main.cpp:2:21
+	xorl	%edi, %edi
+	callq	_Z6calleei at PLT
+	.loc	1 2 14 epilogue_begin is_stmt 0 # main.cpp:2:14
+	addq	$16, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Ltmp1:
+.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	0                               # DW_CHILDREN_no
+	.byte	16                              # DW_AT_stmt_list
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	27                              # DW_AT_comp_dir
+	.byte	14                              # DW_FORM_strp
+	.ascii	"\264B"                         # DW_AT_GNU_pubnames
+	.byte	25                              # DW_FORM_flag_present
+	.ascii	"\260B"                         # DW_AT_GNU_dwo_name
+	.byte	14                              # DW_FORM_strp
+	.ascii	"\261B"                         # DW_AT_GNU_dwo_id
+	.byte	7                               # DW_FORM_data8
+	.byte	17                              # DW_AT_low_pc
+	.byte	1                               # DW_FORM_addr
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.ascii	"\263B"                         # DW_AT_GNU_addr_base
+	.byte	23                              # DW_FORM_sec_offset
+	.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	4                               # DWARF version number
+	.long	.debug_abbrev                   # Offset Into Abbrev. Section
+	.byte	8                               # Address Size (in bytes)
+	.byte	1                               # Abbrev [1] 0xb:0x25 DW_TAG_compile_unit
+	.long	.Lline_table_start0             # DW_AT_stmt_list
+	.long	.Lskel_string0                  # DW_AT_comp_dir
+                                        # DW_AT_GNU_pubnames
+	.long	.Lskel_string1                  # DW_AT_GNU_dwo_name
+	.quad	1465063543908291764             # DW_AT_GNU_dwo_id
+	.quad	.Lfunc_begin0                   # DW_AT_low_pc
+	.long	.Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+	.long	.Laddr_table_base0              # DW_AT_GNU_addr_base
+.Ldebug_info_end0:
+	.section	.debug_str,"MS", at progbits,1
+.Lskel_string0:
+	.asciz	"."                             # string offset=0
+.Lskel_string1:
+	.asciz	"main.exe-main.dwo"             # string offset=2
+	.section	.debug_str.dwo,"eMS", at progbits,1
+.Linfo_string0:
+	.asciz	"main"                          # string offset=0
+.Linfo_string1:
+	.asciz	"int"                           # string offset=5
+.Linfo_string2:
+	.byte	0                               # string offset=9
+.Linfo_string3:
+	.asciz	"main.cpp"                      # string offset=10
+.Linfo_string4:
+	.asciz	"main.exe-main.dwo"             # string offset=19
+	.section	.debug_str_offsets.dwo,"e", at progbits
+	.long	0
+	.long	5
+	.long	9
+	.long	10
+	.long	19
+	.section	.debug_info.dwo,"e", at progbits
+	.long	.Ldebug_info_dwo_end0-.Ldebug_info_dwo_start0 # Length of Unit
+.Ldebug_info_dwo_start0:
+	.short	4                               # DWARF version number
+	.long	0                               # Offset Into Abbrev. Section
+	.byte	8                               # Address Size (in bytes)
+	.byte	1                               # Abbrev [1] 0xb:0x22 DW_TAG_compile_unit
+	.byte	2                               # DW_AT_producer
+	.short	33                              # DW_AT_language
+	.byte	3                               # DW_AT_name
+	.byte	4                               # DW_AT_GNU_dwo_name
+	.quad	1465063543908291764             # DW_AT_GNU_dwo_id
+	.byte	2                               # Abbrev [2] 0x19:0xf 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	86
+	.byte	0                               # DW_AT_name
+	.byte	1                               # DW_AT_decl_file
+	.byte	2                               # DW_AT_decl_line
+	.long	40                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	3                               # Abbrev [3] 0x28:0x4 DW_TAG_base_type
+	.byte	1                               # DW_AT_name
+	.byte	5                               # DW_AT_encoding
+	.byte	4                               # DW_AT_byte_size
+	.byte	0                               # End Of Children Mark
+.Ldebug_info_dwo_end0:
+	.section	.debug_abbrev.dwo,"e", at progbits
+	.byte	1                               # Abbreviation Code
+	.byte	17                              # DW_TAG_compile_unit
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	37                              # DW_AT_producer
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	19                              # DW_AT_language
+	.byte	5                               # DW_FORM_data2
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.ascii	"\260B"                         # DW_AT_GNU_dwo_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.ascii	"\261B"                         # DW_AT_GNU_dwo_id
+	.byte	7                               # DW_FORM_data8
+	.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
+	.ascii	"\201>"                         # DW_FORM_GNU_addr_index
+	.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
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.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	36                              # DW_TAG_base_type
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.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_addr,"", at progbits
+.Laddr_table_base0:
+	.quad	.Lfunc_begin0
+	.section	.debug_gnu_pubnames,"", at progbits
+	.long	.LpubNames_end0-.LpubNames_start0 # Length of Public Names Info
+.LpubNames_start0:
+	.short	2                               # DWARF Version
+	.long	.Lcu_begin0                     # Offset of Compilation Unit Info
+	.long	48                              # Compilation Unit Length
+	.long	25                              # DIE offset
+	.byte	48                              # Attributes: FUNCTION, EXTERNAL
+	.asciz	"main"                          # External Name
+	.long	0                               # End Mark
+.LpubNames_end0:
+	.section	.debug_gnu_pubtypes,"", at progbits
+	.long	.LpubTypes_end0-.LpubTypes_start0 # Length of Public Types Info
+.LpubTypes_start0:
+	.short	2                               # DWARF Version
+	.long	.Lcu_begin0                     # Offset of Compilation Unit Info
+	.long	48                              # Compilation Unit Length
+	.long	40                              # DIE offset
+	.byte	144                             # Attributes: TYPE, STATIC
+	.asciz	"int"                           # External Name
+	.long	0                               # End Mark
+.LpubTypes_end0:
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z6calleei
+	.section	.debug_line,"", at progbits
+.Lline_table_start0:
+#--- callee.s
+	.file	"callee.cpp"
+	.text
+	.globl	_Z6calleei                      # -- Begin function _Z6calleei
+	.p2align	4
+	.type	_Z6calleei, at function
+_Z6calleei:                             # @_Z6calleei
+.Lfunc_begin0:
+	.file	1 "." "callee.cpp"
+	.loc	1 1 0                           # callee.cpp:1:0
+	.cfi_startproc
+# %bb.0:                                # %entry
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+.Ltmp0:
+	.loc	1 1 28 prologue_end             # callee.cpp:1:28
+	movl	-4(%rbp), %eax
+	.loc	1 1 21 epilogue_begin is_stmt 0 # callee.cpp:1:21
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Ltmp1:
+.Lfunc_end0:
+	.size	_Z6calleei, .Lfunc_end0-_Z6calleei
+	.cfi_endproc
+                                        # -- End function
+	.section	.debug_abbrev,"", at progbits
+	.byte	1                               # Abbreviation Code
+	.byte	17                              # DW_TAG_compile_unit
+	.byte	0                               # DW_CHILDREN_no
+	.byte	16                              # DW_AT_stmt_list
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	27                              # DW_AT_comp_dir
+	.byte	14                              # DW_FORM_strp
+	.ascii	"\264B"                         # DW_AT_GNU_pubnames
+	.byte	25                              # DW_FORM_flag_present
+	.ascii	"\260B"                         # DW_AT_GNU_dwo_name
+	.byte	14                              # DW_FORM_strp
+	.ascii	"\261B"                         # DW_AT_GNU_dwo_id
+	.byte	7                               # DW_FORM_data8
+	.byte	17                              # DW_AT_low_pc
+	.byte	1                               # DW_FORM_addr
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.ascii	"\263B"                         # DW_AT_GNU_addr_base
+	.byte	23                              # DW_FORM_sec_offset
+	.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	4                               # DWARF version number
+	.long	.debug_abbrev                   # Offset Into Abbrev. Section
+	.byte	8                               # Address Size (in bytes)
+	.byte	1                               # Abbrev [1] 0xb:0x25 DW_TAG_compile_unit
+	.long	.Lline_table_start0             # DW_AT_stmt_list
+	.long	.Lskel_string0                  # DW_AT_comp_dir
+                                        # DW_AT_GNU_pubnames
+	.long	.Lskel_string1                  # DW_AT_GNU_dwo_name
+	.quad	-8413212350243343807            # DW_AT_GNU_dwo_id
+	.quad	.Lfunc_begin0                   # DW_AT_low_pc
+	.long	.Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+	.long	.Laddr_table_base0              # DW_AT_GNU_addr_base
+.Ldebug_info_end0:
+	.section	.debug_str,"MS", at progbits,1
+.Lskel_string0:
+	.asciz	"."                             # string offset=0
+.Lskel_string1:
+	.asciz	"main.exe-callee.dwo"           # string offset=2
+	.section	.debug_str.dwo,"eMS", at progbits,1
+.Linfo_string0:
+	.asciz	"_Z6calleei"                    # string offset=0
+.Linfo_string1:
+	.asciz	"callee"                        # string offset=11
+.Linfo_string2:
+	.asciz	"int"                           # string offset=18
+.Linfo_string3:
+	.asciz	"x"                             # string offset=22
+.Linfo_string4:
+	.byte	0                               # string offset=24
+.Linfo_string5:
+	.asciz	"callee.cpp"                    # string offset=25
+.Linfo_string6:
+	.asciz	"main.exe-callee.dwo"           # string offset=36
+	.section	.debug_str_offsets.dwo,"e", at progbits
+	.long	0
+	.long	11
+	.long	18
+	.long	22
+	.long	24
+	.long	25
+	.long	36
+	.section	.debug_info.dwo,"e", at progbits
+	.long	.Ldebug_info_dwo_end0-.Ldebug_info_dwo_start0 # Length of Unit
+.Ldebug_info_dwo_start0:
+	.short	4                               # DWARF version number
+	.long	0                               # Offset Into Abbrev. Section
+	.byte	8                               # Address Size (in bytes)
+	.byte	1                               # Abbrev [1] 0xb:0x2f DW_TAG_compile_unit
+	.byte	4                               # DW_AT_producer
+	.short	33                              # DW_AT_language
+	.byte	5                               # DW_AT_name
+	.byte	6                               # DW_AT_GNU_dwo_name
+	.quad	-8413212350243343807            # DW_AT_GNU_dwo_id
+	.byte	2                               # Abbrev [2] 0x19: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	86
+	.byte	0                               # DW_AT_linkage_name
+	.byte	1                               # DW_AT_name
+	.byte	1                               # DW_AT_decl_file
+	.byte	1                               # DW_AT_decl_line
+	.long	53                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	3                               # Abbrev [3] 0x29:0xb DW_TAG_formal_parameter
+	.byte	2                               # DW_AT_location
+	.byte	145
+	.byte	124
+	.byte	3                               # DW_AT_name
+	.byte	1                               # DW_AT_decl_file
+	.byte	1                               # DW_AT_decl_line
+	.long	53                              # DW_AT_type
+	.byte	0                               # End Of Children Mark
+	.byte	4                               # Abbrev [4] 0x35:0x4 DW_TAG_base_type
+	.byte	2                               # DW_AT_name
+	.byte	5                               # DW_AT_encoding
+	.byte	4                               # DW_AT_byte_size
+	.byte	0                               # End Of Children Mark
+.Ldebug_info_dwo_end0:
+	.section	.debug_abbrev.dwo,"e", at progbits
+	.byte	1                               # Abbreviation Code
+	.byte	17                              # DW_TAG_compile_unit
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	37                              # DW_AT_producer
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	19                              # DW_AT_language
+	.byte	5                               # DW_FORM_data2
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.ascii	"\260B"                         # DW_AT_GNU_dwo_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.ascii	"\261B"                         # DW_AT_GNU_dwo_id
+	.byte	7                               # DW_FORM_data8
+	.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
+	.ascii	"\201>"                         # DW_FORM_GNU_addr_index
+	.byte	18                              # DW_AT_high_pc
+	.byte	6                               # DW_FORM_data4
+	.byte	64                              # DW_AT_frame_base
+	.byte	24                              # DW_FORM_exprloc
+	.byte	110                             # DW_AT_linkage_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.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	5                               # DW_TAG_formal_parameter
+	.byte	0                               # DW_CHILDREN_no
+	.byte	2                               # DW_AT_location
+	.byte	24                              # DW_FORM_exprloc
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.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	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	4                               # Abbreviation Code
+	.byte	36                              # DW_TAG_base_type
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.ascii	"\202>"                         # DW_FORM_GNU_str_index
+	.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_addr,"", at progbits
+.Laddr_table_base0:
+	.quad	.Lfunc_begin0
+	.section	.debug_gnu_pubnames,"", at progbits
+	.long	.LpubNames_end0-.LpubNames_start0 # Length of Public Names Info
+.LpubNames_start0:
+	.short	2                               # DWARF Version
+	.long	.Lcu_begin0                     # Offset of Compilation Unit Info
+	.long	48                              # Compilation Unit Length
+	.long	25                              # DIE offset
+	.byte	48                              # Attributes: FUNCTION, EXTERNAL
+	.asciz	"callee"                        # External Name
+	.long	0                               # End Mark
+.LpubNames_end0:
+	.section	.debug_gnu_pubtypes,"", at progbits
+	.long	.LpubTypes_end0-.LpubTypes_start0 # Length of Public Types Info
+.LpubTypes_start0:
+	.short	2                               # DWARF Version
+	.long	.Lcu_begin0                     # Offset of Compilation Unit Info
+	.long	48                              # Compilation Unit Length
+	.long	53                              # DIE offset
+	.byte	144                             # Attributes: TYPE, STATIC
+	.asciz	"int"                           # External Name
+	.long	0                               # End Mark
+.LpubTypes_end0:
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.section	.debug_line,"", at progbits
+.Lline_table_start0:
diff --git a/bolt/test/X86/dwarf4-dwp.test b/bolt/test/X86/dwarf4-dwp.test
deleted file mode 100644
index 6c619ed55233b..0000000000000
--- a/bolt/test/X86/dwarf4-dwp.test
+++ /dev/null
@@ -1,41 +0,0 @@
-# REQUIRES: system-linux
-
-# RUN: rm -rf %t && mkdir -p %t && cd %t
-# RUN: split-file %s %t
-# RUN: %clangxx -g -gdwarf-4 -gsplit-dwarf %t/main.cpp %t/callee.cpp -o main.exe
-# RUN: llvm-dwp -e %t/main.exe -o %t/main.exe.dwp
-# RUN: llvm-bolt %t/main.exe -o %t/main.exe.bolt -update-debug-sections  2>&1 | FileCheck %s
-
-# CHECK-NOT: Assertion
-
-
-#--- main.cpp
-int hotFunction(int x);
-
-int main(int argc, char **argv) {
-    int sum = 0;
-    for (int i = 0; i < 50000000; ++i) { // 让运行时间更久
-        sum += hotFunction(i);
-    }
-    if (sum)
-        return 0;
-    else
-        return 1;
-}
-
-#--- callee.cpp
-int hotFunction(int x) {
-    if ((x & 1) == 0) {
-        x = x * 3 + 1;
-        if (x % 5 == 0) {
-            x += 7;
-        }
-    } else {
-        x = x * x;
-        if (x % 3 == 0) {
-            x -= 4;
-        }
-    }
-    return x;
-}
-

>From 2884b59baadbff0bdbd71684068e1eefb5fc7c2b Mon Sep 17 00:00:00 2001
From: huangjinjie <huangjinjie at bytedance.com>
Date: Wed, 3 Sep 2025 21:15:02 +0800
Subject: [PATCH 4/6] add arm test

---
 bolt/test/AArch64/dwarf4-dwp-aarch64.s        | 451 ++++++++++++++++++
 .../X86/{dwarf4-dwp.s => dwarf4-dwp-x86.s}    |   2 +-
 2 files changed, 452 insertions(+), 1 deletion(-)
 create mode 100755 bolt/test/AArch64/dwarf4-dwp-aarch64.s
 rename bolt/test/X86/{dwarf4-dwp.s => dwarf4-dwp-x86.s} (99%)

diff --git a/bolt/test/AArch64/dwarf4-dwp-aarch64.s b/bolt/test/AArch64/dwarf4-dwp-aarch64.s
new file mode 100755
index 0000000000000..e03ccae2e525a
--- /dev/null
+++ b/bolt/test/AArch64/dwarf4-dwp-aarch64.s
@@ -0,0 +1,451 @@
+# RUN: rm -rf %t && mkdir -p %t && cd %t
+# RUN: split-file %s %t
+# RUN: %clangxx  --target=aarch64-unknown-linux -g -gdwarf-4 -gsplit-dwarf %t/main.s %t/callee.s -o main.exe
+# RUN: llvm-dwp -e %t/main.exe -o %t/main.exe.dwp
+# RUN: llvm-bolt %t/main.exe -o %t/main.exe.bolt -update-debug-sections  2>&1 | FileCheck %s
+
+# CHECK-NOT: Assertion
+
+#--- main.cpp
+int callee(int x);
+int main() { return callee(0); }
+#--- callee.cpp
+int callee(int x) { return x; }
+#--- gen
+clang++ --target=aarch64-unknown-linux -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-main.dwo -S main.cpp -o -
+echo '#--- callee.s'
+clang++ --target=aarch64-unknown-linux -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-callee.dwo -S callee.cpp -o -
+#--- main.s
+	.file	"main.cpp"
+	.text
+	.globl	main                            // -- Begin function main
+	.p2align	2
+	.type	main, at function
+main:                                   // @main
+.Lfunc_begin0:
+	.file	1 "." "main.cpp"
+	.loc	1 2 0                           // main.cpp:2:0
+	.cfi_startproc
+// %bb.0:                               // %entry
+	sub	sp, sp, #32
+	.cfi_def_cfa_offset 32
+	stp	x29, x30, [sp, #16]             // 16-byte Folded Spill
+	add	x29, sp, #16
+	.cfi_def_cfa w29, 16
+	.cfi_offset w30, -8
+	.cfi_offset w29, -16
+	mov	w0, wzr
+	stur	wzr, [x29, #-4]
+.Ltmp0:
+	.loc	1 2 21 prologue_end             // main.cpp:2:21
+	bl	_Z6calleei
+	.cfi_def_cfa wsp, 32
+	.loc	1 2 14 epilogue_begin is_stmt 0 // main.cpp:2:14
+	ldp	x29, x30, [sp, #16]             // 16-byte Folded Reload
+	add	sp, sp, #32
+	.cfi_def_cfa_offset 0
+	.cfi_restore w30
+	.cfi_restore w29
+	ret
+.Ltmp1:
+.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	0                               // DW_CHILDREN_no
+	.byte	16                              // DW_AT_stmt_list
+	.byte	23                              // DW_FORM_sec_offset
+	.byte	27                              // DW_AT_comp_dir
+	.byte	14                              // DW_FORM_strp
+	.ascii	"\264B"                         // DW_AT_GNU_pubnames
+	.byte	25                              // DW_FORM_flag_present
+	.ascii	"\260B"                         // DW_AT_GNU_dwo_name
+	.byte	14                              // DW_FORM_strp
+	.ascii	"\261B"                         // DW_AT_GNU_dwo_id
+	.byte	7                               // DW_FORM_data8
+	.byte	17                              // DW_AT_low_pc
+	.byte	1                               // DW_FORM_addr
+	.byte	18                              // DW_AT_high_pc
+	.byte	6                               // DW_FORM_data4
+	.ascii	"\263B"                         // DW_AT_GNU_addr_base
+	.byte	23                              // DW_FORM_sec_offset
+	.byte	0                               // EOM(1)
+	.byte	0                               // EOM(2)
+	.byte	0                               // EOM(3)
+	.section	.debug_info,"", at progbits
+.Lcu_begin0:
+	.word	.Ldebug_info_end0-.Ldebug_info_start0 // Length of Unit
+.Ldebug_info_start0:
+	.hword	4                               // DWARF version number
+	.word	.debug_abbrev                   // Offset Into Abbrev. Section
+	.byte	8                               // Address Size (in bytes)
+	.byte	1                               // Abbrev [1] 0xb:0x25 DW_TAG_compile_unit
+	.word	.Lline_table_start0             // DW_AT_stmt_list
+	.word	.Lskel_string0                  // DW_AT_comp_dir
+                                        // DW_AT_GNU_pubnames
+	.word	.Lskel_string1                  // DW_AT_GNU_dwo_name
+	.xword	1465063543908291764             // DW_AT_GNU_dwo_id
+	.xword	.Lfunc_begin0                   // DW_AT_low_pc
+	.word	.Lfunc_end0-.Lfunc_begin0       // DW_AT_high_pc
+	.word	.Laddr_table_base0              // DW_AT_GNU_addr_base
+.Ldebug_info_end0:
+	.section	.debug_str,"MS", at progbits,1
+.Lskel_string0:
+	.asciz	"."                             // string offset=0
+.Lskel_string1:
+	.asciz	"main.exe-main.dwo"             // string offset=2
+	.section	.debug_str.dwo,"eMS", at progbits,1
+.Linfo_string0:
+	.asciz	"main"                          // string offset=0
+.Linfo_string1:
+	.asciz	"int"                           // string offset=5
+.Linfo_string2:
+	.byte	0                               // string offset=9
+.Linfo_string3:
+	.asciz	"main.cpp"                      // string offset=10
+.Linfo_string4:
+	.asciz	"main.exe-main.dwo"             // string offset=19
+	.section	.debug_str_offsets.dwo,"e", at progbits
+	.word	0
+	.word	5
+	.word	9
+	.word	10
+	.word	19
+	.section	.debug_info.dwo,"e", at progbits
+	.word	.Ldebug_info_dwo_end0-.Ldebug_info_dwo_start0 // Length of Unit
+.Ldebug_info_dwo_start0:
+	.hword	4                               // DWARF version number
+	.word	0                               // Offset Into Abbrev. Section
+	.byte	8                               // Address Size (in bytes)
+	.byte	1                               // Abbrev [1] 0xb:0x22 DW_TAG_compile_unit
+	.byte	2                               // DW_AT_producer
+	.hword	33                              // DW_AT_language
+	.byte	3                               // DW_AT_name
+	.byte	4                               // DW_AT_GNU_dwo_name
+	.xword	1465063543908291764             // DW_AT_GNU_dwo_id
+	.byte	2                               // Abbrev [2] 0x19:0xf DW_TAG_subprogram
+	.byte	0                               // DW_AT_low_pc
+	.word	.Lfunc_end0-.Lfunc_begin0       // DW_AT_high_pc
+	.byte	1                               // DW_AT_frame_base
+	.byte	109
+	.byte	0                               // DW_AT_name
+	.byte	1                               // DW_AT_decl_file
+	.byte	2                               // DW_AT_decl_line
+	.word	40                              // DW_AT_type
+                                        // DW_AT_external
+	.byte	3                               // Abbrev [3] 0x28:0x4 DW_TAG_base_type
+	.byte	1                               // DW_AT_name
+	.byte	5                               // DW_AT_encoding
+	.byte	4                               // DW_AT_byte_size
+	.byte	0                               // End Of Children Mark
+.Ldebug_info_dwo_end0:
+	.section	.debug_abbrev.dwo,"e", at progbits
+	.byte	1                               // Abbreviation Code
+	.byte	17                              // DW_TAG_compile_unit
+	.byte	1                               // DW_CHILDREN_yes
+	.byte	37                              // DW_AT_producer
+	.ascii	"\202>"                         // DW_FORM_GNU_str_index
+	.byte	19                              // DW_AT_language
+	.byte	5                               // DW_FORM_data2
+	.byte	3                               // DW_AT_name
+	.ascii	"\202>"                         // DW_FORM_GNU_str_index
+	.ascii	"\260B"                         // DW_AT_GNU_dwo_name
+	.ascii	"\202>"                         // DW_FORM_GNU_str_index
+	.ascii	"\261B"                         // DW_AT_GNU_dwo_id
+	.byte	7                               // DW_FORM_data8
+	.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
+	.ascii	"\201>"                         // DW_FORM_GNU_addr_index
+	.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
+	.ascii	"\202>"                         // DW_FORM_GNU_str_index
+	.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	36                              // DW_TAG_base_type
+	.byte	0                               // DW_CHILDREN_no
+	.byte	3                               // DW_AT_name
+	.ascii	"\202>"                         // DW_FORM_GNU_str_index
+	.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_addr,"", at progbits
+.Laddr_table_base0:
+	.xword	.Lfunc_begin0
+	.section	.debug_gnu_pubnames,"", at progbits
+	.word	.LpubNames_end0-.LpubNames_start0 // Length of Public Names Info
+.LpubNames_start0:
+	.hword	2                               // DWARF Version
+	.word	.Lcu_begin0                     // Offset of Compilation Unit Info
+	.word	48                              // Compilation Unit Length
+	.word	25                              // DIE offset
+	.byte	48                              // Attributes: FUNCTION, EXTERNAL
+	.asciz	"main"                          // External Name
+	.word	0                               // End Mark
+.LpubNames_end0:
+	.section	.debug_gnu_pubtypes,"", at progbits
+	.word	.LpubTypes_end0-.LpubTypes_start0 // Length of Public Types Info
+.LpubTypes_start0:
+	.hword	2                               // DWARF Version
+	.word	.Lcu_begin0                     // Offset of Compilation Unit Info
+	.word	48                              // Compilation Unit Length
+	.word	40                              // DIE offset
+	.byte	144                             // Attributes: TYPE, STATIC
+	.asciz	"int"                           // External Name
+	.word	0                               // End Mark
+.LpubTypes_end0:
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z6calleei
+	.section	.debug_line,"", at progbits
+.Lline_table_start0:
+#--- callee.s
+	.file	"callee.cpp"
+	.text
+	.globl	_Z6calleei                      // -- Begin function _Z6calleei
+	.p2align	2
+	.type	_Z6calleei, at function
+_Z6calleei:                             // @_Z6calleei
+.Lfunc_begin0:
+	.file	1 "." "callee.cpp"
+	.loc	1 1 0                           // callee.cpp:1:0
+	.cfi_startproc
+// %bb.0:                               // %entry
+	sub	sp, sp, #16
+	.cfi_def_cfa_offset 16
+	str	w0, [sp, #12]
+.Ltmp1:
+	.loc	1 1 28 prologue_end             // callee.cpp:1:28
+	ldr	w0, [sp, #12]
+	.loc	1 1 21 epilogue_begin is_stmt 0 // callee.cpp:1:21
+	add	sp, sp, #16
+	.cfi_def_cfa_offset 0
+	ret
+.Ltmp2:
+.Lfunc_end0:
+	.size	_Z6calleei, .Lfunc_end0-_Z6calleei
+	.cfi_endproc
+                                        // -- End function
+	.section	.debug_abbrev,"", at progbits
+	.byte	1                               // Abbreviation Code
+	.byte	17                              // DW_TAG_compile_unit
+	.byte	0                               // DW_CHILDREN_no
+	.byte	16                              // DW_AT_stmt_list
+	.byte	23                              // DW_FORM_sec_offset
+	.byte	27                              // DW_AT_comp_dir
+	.byte	14                              // DW_FORM_strp
+	.ascii	"\264B"                         // DW_AT_GNU_pubnames
+	.byte	25                              // DW_FORM_flag_present
+	.ascii	"\260B"                         // DW_AT_GNU_dwo_name
+	.byte	14                              // DW_FORM_strp
+	.ascii	"\261B"                         // DW_AT_GNU_dwo_id
+	.byte	7                               // DW_FORM_data8
+	.byte	17                              // DW_AT_low_pc
+	.byte	1                               // DW_FORM_addr
+	.byte	18                              // DW_AT_high_pc
+	.byte	6                               // DW_FORM_data4
+	.ascii	"\263B"                         // DW_AT_GNU_addr_base
+	.byte	23                              // DW_FORM_sec_offset
+	.byte	0                               // EOM(1)
+	.byte	0                               // EOM(2)
+	.byte	0                               // EOM(3)
+	.section	.debug_info,"", at progbits
+.Lcu_begin0:
+	.word	.Ldebug_info_end0-.Ldebug_info_start0 // Length of Unit
+.Ldebug_info_start0:
+	.hword	4                               // DWARF version number
+	.word	.debug_abbrev                   // Offset Into Abbrev. Section
+	.byte	8                               // Address Size (in bytes)
+	.byte	1                               // Abbrev [1] 0xb:0x25 DW_TAG_compile_unit
+	.word	.Lline_table_start0             // DW_AT_stmt_list
+	.word	.Lskel_string0                  // DW_AT_comp_dir
+                                        // DW_AT_GNU_pubnames
+	.word	.Lskel_string1                  // DW_AT_GNU_dwo_name
+	.xword	7650227797527095061             // DW_AT_GNU_dwo_id
+	.xword	.Lfunc_begin0                   // DW_AT_low_pc
+	.word	.Lfunc_end0-.Lfunc_begin0       // DW_AT_high_pc
+	.word	.Laddr_table_base0              // DW_AT_GNU_addr_base
+.Ldebug_info_end0:
+	.section	.debug_str,"MS", at progbits,1
+.Lskel_string0:
+	.asciz	"."                             // string offset=0
+.Lskel_string1:
+	.asciz	"main.exe-callee.dwo"           // string offset=2
+	.section	.debug_str.dwo,"eMS", at progbits,1
+.Linfo_string0:
+	.asciz	"_Z6calleei"                    // string offset=0
+.Linfo_string1:
+	.asciz	"callee"                        // string offset=11
+.Linfo_string2:
+	.asciz	"int"                           // string offset=18
+.Linfo_string3:
+	.asciz	"x"                             // string offset=22
+.Linfo_string4:
+	.byte	0                               // string offset=24
+.Linfo_string5:
+	.asciz	"callee.cpp"                    // string offset=25
+.Linfo_string6:
+	.asciz	"main.exe-callee.dwo"           // string offset=36
+	.section	.debug_str_offsets.dwo,"e", at progbits
+	.word	0
+	.word	11
+	.word	18
+	.word	22
+	.word	24
+	.word	25
+	.word	36
+	.section	.debug_info.dwo,"e", at progbits
+	.word	.Ldebug_info_dwo_end0-.Ldebug_info_dwo_start0 // Length of Unit
+.Ldebug_info_dwo_start0:
+	.hword	4                               // DWARF version number
+	.word	0                               // Offset Into Abbrev. Section
+	.byte	8                               // Address Size (in bytes)
+	.byte	1                               // Abbrev [1] 0xb:0x2f DW_TAG_compile_unit
+	.byte	4                               // DW_AT_producer
+	.hword	33                              // DW_AT_language
+	.byte	5                               // DW_AT_name
+	.byte	6                               // DW_AT_GNU_dwo_name
+	.xword	7650227797527095061             // DW_AT_GNU_dwo_id
+	.byte	2                               // Abbrev [2] 0x19:0x1c DW_TAG_subprogram
+	.byte	0                               // DW_AT_low_pc
+	.word	.Lfunc_end0-.Lfunc_begin0       // DW_AT_high_pc
+	.byte	1                               // DW_AT_frame_base
+	.byte	111
+	.byte	0                               // DW_AT_linkage_name
+	.byte	1                               // DW_AT_name
+	.byte	1                               // DW_AT_decl_file
+	.byte	1                               // DW_AT_decl_line
+	.word	53                              // DW_AT_type
+                                        // DW_AT_external
+	.byte	3                               // Abbrev [3] 0x29:0xb DW_TAG_formal_parameter
+	.byte	2                               // DW_AT_location
+	.byte	145
+	.byte	12
+	.byte	3                               // DW_AT_name
+	.byte	1                               // DW_AT_decl_file
+	.byte	1                               // DW_AT_decl_line
+	.word	53                              // DW_AT_type
+	.byte	0                               // End Of Children Mark
+	.byte	4                               // Abbrev [4] 0x35:0x4 DW_TAG_base_type
+	.byte	2                               // DW_AT_name
+	.byte	5                               // DW_AT_encoding
+	.byte	4                               // DW_AT_byte_size
+	.byte	0                               // End Of Children Mark
+.Ldebug_info_dwo_end0:
+	.section	.debug_abbrev.dwo,"e", at progbits
+	.byte	1                               // Abbreviation Code
+	.byte	17                              // DW_TAG_compile_unit
+	.byte	1                               // DW_CHILDREN_yes
+	.byte	37                              // DW_AT_producer
+	.ascii	"\202>"                         // DW_FORM_GNU_str_index
+	.byte	19                              // DW_AT_language
+	.byte	5                               // DW_FORM_data2
+	.byte	3                               // DW_AT_name
+	.ascii	"\202>"                         // DW_FORM_GNU_str_index
+	.ascii	"\260B"                         // DW_AT_GNU_dwo_name
+	.ascii	"\202>"                         // DW_FORM_GNU_str_index
+	.ascii	"\261B"                         // DW_AT_GNU_dwo_id
+	.byte	7                               // DW_FORM_data8
+	.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
+	.ascii	"\201>"                         // DW_FORM_GNU_addr_index
+	.byte	18                              // DW_AT_high_pc
+	.byte	6                               // DW_FORM_data4
+	.byte	64                              // DW_AT_frame_base
+	.byte	24                              // DW_FORM_exprloc
+	.byte	110                             // DW_AT_linkage_name
+	.ascii	"\202>"                         // DW_FORM_GNU_str_index
+	.byte	3                               // DW_AT_name
+	.ascii	"\202>"                         // DW_FORM_GNU_str_index
+	.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	5                               // DW_TAG_formal_parameter
+	.byte	0                               // DW_CHILDREN_no
+	.byte	2                               // DW_AT_location
+	.byte	24                              // DW_FORM_exprloc
+	.byte	3                               // DW_AT_name
+	.ascii	"\202>"                         // DW_FORM_GNU_str_index
+	.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	0                               // EOM(1)
+	.byte	0                               // EOM(2)
+	.byte	4                               // Abbreviation Code
+	.byte	36                              // DW_TAG_base_type
+	.byte	0                               // DW_CHILDREN_no
+	.byte	3                               // DW_AT_name
+	.ascii	"\202>"                         // DW_FORM_GNU_str_index
+	.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_addr,"", at progbits
+.Laddr_table_base0:
+	.xword	.Lfunc_begin0
+	.section	.debug_gnu_pubnames,"", at progbits
+	.word	.LpubNames_end0-.LpubNames_start0 // Length of Public Names Info
+.LpubNames_start0:
+	.hword	2                               // DWARF Version
+	.word	.Lcu_begin0                     // Offset of Compilation Unit Info
+	.word	48                              // Compilation Unit Length
+	.word	25                              // DIE offset
+	.byte	48                              // Attributes: FUNCTION, EXTERNAL
+	.asciz	"callee"                        // External Name
+	.word	0                               // End Mark
+.LpubNames_end0:
+	.section	.debug_gnu_pubtypes,"", at progbits
+	.word	.LpubTypes_end0-.LpubTypes_start0 // Length of Public Types Info
+.LpubTypes_start0:
+	.hword	2                               // DWARF Version
+	.word	.Lcu_begin0                     // Offset of Compilation Unit Info
+	.word	48                              // Compilation Unit Length
+	.word	53                              // DIE offset
+	.byte	144                             // Attributes: TYPE, STATIC
+	.asciz	"int"                           // External Name
+	.word	0                               // End Mark
+.LpubTypes_end0:
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.section	.debug_line,"", at progbits
+.Lline_table_start0:
diff --git a/bolt/test/X86/dwarf4-dwp.s b/bolt/test/X86/dwarf4-dwp-x86.s
similarity index 99%
rename from bolt/test/X86/dwarf4-dwp.s
rename to bolt/test/X86/dwarf4-dwp-x86.s
index d3168af692280..549258e6ccd56 100755
--- a/bolt/test/X86/dwarf4-dwp.s
+++ b/bolt/test/X86/dwarf4-dwp-x86.s
@@ -12,7 +12,7 @@ int main() { return callee(0); }
 #--- callee.cpp
 int callee(int x) { return x; }
 #--- gen
-clang++ -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-main.dwo -S main.cpp -v -o -
+clang++ -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-main.dwo -S main.cpp -o -
 echo '#--- callee.s'
 clang++ -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-callee.dwo -S callee.cpp -o -
 #--- main.s

>From 4e82b92fc5cd5774a7275b9a3da970e46698b84a Mon Sep 17 00:00:00 2001
From: huangjinjie <huangjinjie at bytedance.com>
Date: Wed, 3 Sep 2025 23:34:53 +0800
Subject: [PATCH 5/6] add arm test

---
 bolt/test/AArch64/dwarf4-dwp-aarch64.s | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/bolt/test/AArch64/dwarf4-dwp-aarch64.s b/bolt/test/AArch64/dwarf4-dwp-aarch64.s
index e03ccae2e525a..0be418f7f1272 100755
--- a/bolt/test/AArch64/dwarf4-dwp-aarch64.s
+++ b/bolt/test/AArch64/dwarf4-dwp-aarch64.s
@@ -1,6 +1,8 @@
 # RUN: rm -rf %t && mkdir -p %t && cd %t
 # RUN: split-file %s %t
-# RUN: %clangxx  --target=aarch64-unknown-linux -g -gdwarf-4 -gsplit-dwarf %t/main.s %t/callee.s -o main.exe
+# RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown --split-dwarf-file=main.exe-main.dwo %t/main.s -o %t/main.o
+# RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown --split-dwarf-file=main.exe-callee.dwo %t/callee.s -o %t/callee.o
+# RUN: %clangxx %cxxflags -gdwarf-4 -gsplit-dwarf=split -Wl,-e,main %t/main.o %t/callee.o -o main.exe
 # RUN: llvm-dwp -e %t/main.exe -o %t/main.exe.dwp
 # RUN: llvm-bolt %t/main.exe -o %t/main.exe.bolt -update-debug-sections  2>&1 | FileCheck %s
 
@@ -12,9 +14,9 @@ int main() { return callee(0); }
 #--- callee.cpp
 int callee(int x) { return x; }
 #--- gen
-clang++ --target=aarch64-unknown-linux -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-main.dwo -S main.cpp -o -
+clang++ --target=aarch64-unknown-unknown -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-main.dwo -S main.cpp -o -
 echo '#--- callee.s'
-clang++ --target=aarch64-unknown-linux -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-callee.dwo -S callee.cpp -o -
+clang++ --target=aarch64-unknown-unknown -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-callee.dwo -S callee.cpp -o -
 #--- main.s
 	.file	"main.cpp"
 	.text

>From 6840dc8b726c74e9cec83d23ceff6d62dca55834 Mon Sep 17 00:00:00 2001
From: huangjinjie <huangjinjie at bytedance.com>
Date: Thu, 4 Sep 2025 18:19:21 +0800
Subject: [PATCH 6/6] reduce the assembly for x86&arm

---
 bolt/test/AArch64/dwarf4-dwp-aarch64.s | 48 +-------------------------
 bolt/test/X86/dwarf4-dwp-x86.s         | 47 +------------------------
 2 files changed, 2 insertions(+), 93 deletions(-)

diff --git a/bolt/test/AArch64/dwarf4-dwp-aarch64.s b/bolt/test/AArch64/dwarf4-dwp-aarch64.s
index 0be418f7f1272..37507e100a62d 100755
--- a/bolt/test/AArch64/dwarf4-dwp-aarch64.s
+++ b/bolt/test/AArch64/dwarf4-dwp-aarch64.s
@@ -1,3 +1,4 @@
+## This test checks updating debuginfo via dwarf4 dwp file
 # RUN: rm -rf %t && mkdir -p %t && cd %t
 # RUN: split-file %s %t
 # RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown --split-dwarf-file=main.exe-main.dwo %t/main.s -o %t/main.o
@@ -8,52 +9,19 @@
 
 # CHECK-NOT: Assertion
 
-#--- main.cpp
-int callee(int x);
-int main() { return callee(0); }
-#--- callee.cpp
-int callee(int x) { return x; }
-#--- gen
-clang++ --target=aarch64-unknown-unknown -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-main.dwo -S main.cpp -o -
-echo '#--- callee.s'
-clang++ --target=aarch64-unknown-unknown -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-callee.dwo -S callee.cpp -o -
 #--- main.s
 	.file	"main.cpp"
-	.text
 	.globl	main                            // -- Begin function main
-	.p2align	2
 	.type	main, at function
 main:                                   // @main
 .Lfunc_begin0:
 	.file	1 "." "main.cpp"
 	.loc	1 2 0                           // main.cpp:2:0
-	.cfi_startproc
-// %bb.0:                               // %entry
-	sub	sp, sp, #32
-	.cfi_def_cfa_offset 32
-	stp	x29, x30, [sp, #16]             // 16-byte Folded Spill
-	add	x29, sp, #16
-	.cfi_def_cfa w29, 16
-	.cfi_offset w30, -8
-	.cfi_offset w29, -16
-	mov	w0, wzr
-	stur	wzr, [x29, #-4]
-.Ltmp0:
 	.loc	1 2 21 prologue_end             // main.cpp:2:21
-	bl	_Z6calleei
-	.cfi_def_cfa wsp, 32
 	.loc	1 2 14 epilogue_begin is_stmt 0 // main.cpp:2:14
-	ldp	x29, x30, [sp, #16]             // 16-byte Folded Reload
-	add	sp, sp, #32
-	.cfi_def_cfa_offset 0
-	.cfi_restore w30
-	.cfi_restore w29
 	ret
-.Ltmp1:
 .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
@@ -225,31 +193,17 @@ main:                                   // @main
 .Lline_table_start0:
 #--- callee.s
 	.file	"callee.cpp"
-	.text
 	.globl	_Z6calleei                      // -- Begin function _Z6calleei
-	.p2align	2
 	.type	_Z6calleei, at function
 _Z6calleei:                             // @_Z6calleei
 .Lfunc_begin0:
 	.file	1 "." "callee.cpp"
 	.loc	1 1 0                           // callee.cpp:1:0
-	.cfi_startproc
-// %bb.0:                               // %entry
-	sub	sp, sp, #16
-	.cfi_def_cfa_offset 16
-	str	w0, [sp, #12]
-.Ltmp1:
 	.loc	1 1 28 prologue_end             // callee.cpp:1:28
-	ldr	w0, [sp, #12]
 	.loc	1 1 21 epilogue_begin is_stmt 0 // callee.cpp:1:21
-	add	sp, sp, #16
-	.cfi_def_cfa_offset 0
 	ret
-.Ltmp2:
 .Lfunc_end0:
 	.size	_Z6calleei, .Lfunc_end0-_Z6calleei
-	.cfi_endproc
-                                        // -- End function
 	.section	.debug_abbrev,"", at progbits
 	.byte	1                               // Abbreviation Code
 	.byte	17                              // DW_TAG_compile_unit
diff --git a/bolt/test/X86/dwarf4-dwp-x86.s b/bolt/test/X86/dwarf4-dwp-x86.s
index 549258e6ccd56..b76b679f177f4 100755
--- a/bolt/test/X86/dwarf4-dwp-x86.s
+++ b/bolt/test/X86/dwarf4-dwp-x86.s
@@ -1,3 +1,4 @@
+## This test checks updating debuginfo via dwarf4 dwp file
 # RUN: rm -rf %t && mkdir -p %t && cd %t
 # RUN: split-file %s %t
 # RUN: %clangxx -g -gdwarf-4 -gsplit-dwarf %t/main.s %t/callee.s -o main.exe
@@ -6,48 +7,19 @@
 
 # CHECK-NOT: Assertion
 
-#--- main.cpp
-int callee(int x);
-int main() { return callee(0); }
-#--- callee.cpp
-int callee(int x) { return x; }
-#--- gen
-clang++ -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-main.dwo -S main.cpp -o -
-echo '#--- callee.s'
-clang++ -c -g -gdwarf-4 -gsplit-dwarf -fdebug-compilation-dir=. -Xclang -split-dwarf-file -Xclang main.exe-callee.dwo -S callee.cpp -o -
 #--- main.s
 	.file	"main.cpp"
-	.text
 	.globl	main                            # -- Begin function main
-	.p2align	4
 	.type	main, at function
 main:                                   # @main
 .Lfunc_begin0:
 	.file	1 "." "main.cpp"
 	.loc	1 2 0                           # main.cpp:2:0
-	.cfi_startproc
-# %bb.0:                                # %entry
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$16, %rsp
-	movl	$0, -4(%rbp)
-.Ltmp0:
 	.loc	1 2 21 prologue_end             # main.cpp:2:21
-	xorl	%edi, %edi
-	callq	_Z6calleei at PLT
 	.loc	1 2 14 epilogue_begin is_stmt 0 # main.cpp:2:14
-	addq	$16, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
-.Ltmp1:
 .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
@@ -219,34 +191,17 @@ main:                                   # @main
 .Lline_table_start0:
 #--- callee.s
 	.file	"callee.cpp"
-	.text
 	.globl	_Z6calleei                      # -- Begin function _Z6calleei
-	.p2align	4
 	.type	_Z6calleei, at function
 _Z6calleei:                             # @_Z6calleei
 .Lfunc_begin0:
 	.file	1 "." "callee.cpp"
 	.loc	1 1 0                           # callee.cpp:1:0
-	.cfi_startproc
-# %bb.0:                                # %entry
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-.Ltmp0:
 	.loc	1 1 28 prologue_end             # callee.cpp:1:28
-	movl	-4(%rbp), %eax
 	.loc	1 1 21 epilogue_begin is_stmt 0 # callee.cpp:1:21
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
-.Ltmp1:
 .Lfunc_end0:
 	.size	_Z6calleei, .Lfunc_end0-_Z6calleei
-	.cfi_endproc
-                                        # -- End function
 	.section	.debug_abbrev,"", at progbits
 	.byte	1                               # Abbreviation Code
 	.byte	17                              # DW_TAG_compile_unit



More information about the llvm-commits mailing list