[llvm] [BOLT][DWARF] Fix --dwarf-output-path (PR #71886)

Alexander Yermolovich via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 10 13:02:25 PST 2023


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

>From c8939b1471ed77130b8d2ef93170572777680d76 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Thu, 9 Nov 2023 17:41:26 -0800
Subject: [PATCH 1/4] [BOLT][DWARF] Fix --dwarf-output-path

Fixed a bug where when --dwarf-output-path is specified
and DW_AT_dwo_name contains part of the path the output path would contain both.
Which lead to llvm-bolt crash, because the path didn't exist.
Example:
llvm-bolt .... --dwarf-output-path=/some/path/
DW_AT_dwo_name ("objects/o1/split.dwo")

It would try to write .dwo file to /some/path/objects/o1/split.dwo.dwo instead of to
/some/path/split.dwo.dwo
---
 bolt/lib/Rewrite/DWARFRewriter.cpp            |   3 +
 .../dwarf5-df-output-dir-same-name-helper.s   | 222 ++++++++++++++++++
 .../dwarf5-df-output-dir-same-name-main.s     | 217 +++++++++++++++++
 .../X86/dwarf5-df-output-dir-same-name.test   |  23 ++
 4 files changed, 465 insertions(+)
 create mode 100644 bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s
 create mode 100644 bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-main.s
 create mode 100644 bolt/test/X86/dwarf5-df-output-dir-same-name.test

diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp
index 2d20158cf4eccb0..6d3000901c8a1c1 100644
--- a/bolt/lib/Rewrite/DWARFRewriter.cpp
+++ b/bolt/lib/Rewrite/DWARFRewriter.cpp
@@ -440,6 +440,9 @@ getDWOName(llvm::DWARFUnit &CU,
   assert(!DWOName.empty() &&
          "DW_AT_dwo_name/DW_AT_GNU_dwo_name does not exists.");
   if (!opts::DwarfOutputPath.empty()) {
+    auto Pos = DWOName.rfind("/");
+    if (Pos != std::string::npos)
+      DWOName = DWOName.substr(Pos + 1);
     auto Iter = NameToIndexMap.find(DWOName);
     if (Iter == NameToIndexMap.end())
       Iter = NameToIndexMap.insert({DWOName, 0}).first;
diff --git a/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s b/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s
new file mode 100644
index 000000000000000..f539423a03fdbcc
--- /dev/null
+++ b/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s
@@ -0,0 +1,222 @@
+	.text
+	.file	"helper.cpp"
+	.globl	_Z3foov                         # -- Begin function _Z3foov
+	.p2align	4, 0x90
+	.type	_Z3foov, at function
+_Z3foov:                                # @_Z3foov
+.Lfunc_begin0:
+	.file	0 "." "helper.cpp" md5 0xde8d315e6d1f74ad53575cef6507e770
+	.loc	0 1 0                           # helper.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
+.Ltmp0:
+	.loc	0 1 13 prologue_end             # helper.cpp:1:13
+	xorl	%eax, %eax
+	.loc	0 1 13 epilogue_begin is_stmt 0 # helper.cpp:1:13
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Ltmp1:
+.Lfunc_end0:
+	.size	_Z3foov, .Lfunc_end0-_Z3foov
+	.cfi_endproc
+                                        # -- End function
+	.section	.debug_abbrev,"", at progbits
+	.byte	1                               # Abbreviation Code
+	.byte	74                              # DW_TAG_skeleton_unit
+	.byte	0                               # DW_CHILDREN_no
+	.byte	16                              # DW_AT_stmt_list
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	114                             # DW_AT_str_offsets_base
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	27                              # DW_AT_comp_dir
+	.byte	37                              # DW_FORM_strx1
+	.ascii	"\264B"                         # DW_AT_GNU_pubnames
+	.byte	25                              # DW_FORM_flag_present
+	.byte	118                             # DW_AT_dwo_name
+	.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	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	4                               # DWARF Unit Type
+	.byte	8                               # Address Size (in bytes)
+	.long	.debug_abbrev                   # Offset Into Abbrev. Section
+	.quad	-1360665163647638292
+	.byte	1                               # Abbrev [1] 0x14:0x14 DW_TAG_skeleton_unit
+	.long	.Lline_table_start0             # DW_AT_stmt_list
+	.long	.Lstr_offsets_base0             # DW_AT_str_offsets_base
+	.byte	0                               # DW_AT_comp_dir
+                                        # DW_AT_GNU_pubnames
+	.byte	1                               # DW_AT_dwo_name
+	.byte	0                               # DW_AT_low_pc
+	.long	.Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+	.long	.Laddr_table_base0              # DW_AT_addr_base
+.Ldebug_info_end0:
+	.section	.debug_str_offsets,"", at progbits
+	.long	12                              # Length of String Offsets Set
+	.short	5
+	.short	0
+.Lstr_offsets_base0:
+	.section	.debug_str,"MS", at progbits,1
+.Lskel_string0:
+	.asciz	"."                             # string offset=0
+.Lskel_string1:
+	.asciz	"objects/o2/split.dwo"                    # string offset=2
+	.section	.debug_str_offsets,"", at progbits
+	.long	.Lskel_string0
+	.long	.Lskel_string1
+	.section	.debug_str_offsets.dwo,"e", at progbits
+	.long	28                              # Length of String Offsets Set
+	.short	5
+	.short	0
+	.section	.debug_str.dwo,"eMS", at progbits,1
+.Linfo_string0:
+	.asciz	"_Z3foov"                       # string offset=0
+.Linfo_string1:
+	.asciz	"foo"                           # string offset=8
+.Linfo_string2:
+	.asciz	"int"                           # string offset=12
+.Linfo_string3:
+	.asciz	"clang version 18.0.0"          # string offset=16
+.Linfo_string4:
+	.asciz	"helper.cpp"                    # string offset=37
+.Linfo_string5:
+	.asciz	"objects/o2/split.dwo"                    # string offset=48
+	.section	.debug_str_offsets.dwo,"e", at progbits
+	.long	0
+	.long	8
+	.long	12
+	.long	16
+	.long	37
+	.long	48
+	.section	.debug_info.dwo,"e", at progbits
+	.long	.Ldebug_info_dwo_end0-.Ldebug_info_dwo_start0 # Length of Unit
+.Ldebug_info_dwo_start0:
+	.short	5                               # DWARF version number
+	.byte	5                               # DWARF Unit Type
+	.byte	8                               # Address Size (in bytes)
+	.long	0                               # Offset Into Abbrev. Section
+	.quad	-1360665163647638292
+	.byte	1                               # Abbrev [1] 0x14:0x1b DW_TAG_compile_unit
+	.byte	3                               # DW_AT_producer
+	.short	33                              # DW_AT_language
+	.byte	4                               # DW_AT_name
+	.byte	5                               # DW_AT_dwo_name
+	.byte	2                               # Abbrev [2] 0x1a:0x10 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	0                               # DW_AT_decl_file
+	.byte	1                               # DW_AT_decl_line
+	.long	42                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	3                               # Abbrev [3] 0x2a: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
+	.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	118                             # DW_AT_dwo_name
+	.byte	37                              # DW_FORM_strx1
+	.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	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	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
+	.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_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:
+	.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	40                              # Compilation Unit Length
+	.long	26                              # DIE offset
+	.byte	48                              # Attributes: FUNCTION, EXTERNAL
+	.asciz	"foo"                           # 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	40                              # Compilation Unit Length
+	.long	42                              # DIE offset
+	.byte	144                             # Attributes: TYPE, STATIC
+	.asciz	"int"                           # External Name
+	.long	0                               # End Mark
+.LpubTypes_end0:
+	.ident	"clang version 18.0.0"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.section	.debug_line,"", at progbits
+.Lline_table_start0:
diff --git a/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-main.s b/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-main.s
new file mode 100644
index 000000000000000..4882d607e75bac7
--- /dev/null
+++ b/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-main.s
@@ -0,0 +1,217 @@
+	.text
+	.file	"main.cpp"
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+.Lfunc_begin0:
+	.file	0 "." "main.cpp" md5 0xbb12fec8d002b1f0e06f7dee4604c6cc
+	.loc	0 1 0                           # main.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	$0, -4(%rbp)
+.Ltmp0:
+	.loc	0 2 3 prologue_end              # main.cpp:2:3
+	xorl	%eax, %eax
+	.loc	0 2 3 epilogue_begin is_stmt 0  # main.cpp:2:3
+	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	74                              # DW_TAG_skeleton_unit
+	.byte	0                               # DW_CHILDREN_no
+	.byte	16                              # DW_AT_stmt_list
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	114                             # DW_AT_str_offsets_base
+	.byte	23                              # DW_FORM_sec_offset
+	.byte	27                              # DW_AT_comp_dir
+	.byte	37                              # DW_FORM_strx1
+	.ascii	"\264B"                         # DW_AT_GNU_pubnames
+	.byte	25                              # DW_FORM_flag_present
+	.byte	118                             # DW_AT_dwo_name
+	.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	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	4                               # DWARF Unit Type
+	.byte	8                               # Address Size (in bytes)
+	.long	.debug_abbrev                   # Offset Into Abbrev. Section
+	.quad	6318074710904753300
+	.byte	1                               # Abbrev [1] 0x14:0x14 DW_TAG_skeleton_unit
+	.long	.Lline_table_start0             # DW_AT_stmt_list
+	.long	.Lstr_offsets_base0             # DW_AT_str_offsets_base
+	.byte	0                               # DW_AT_comp_dir
+                                        # DW_AT_GNU_pubnames
+	.byte	1                               # DW_AT_dwo_name
+	.byte	0                               # DW_AT_low_pc
+	.long	.Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
+	.long	.Laddr_table_base0              # DW_AT_addr_base
+.Ldebug_info_end0:
+	.section	.debug_str_offsets,"", at progbits
+	.long	12                              # Length of String Offsets Set
+	.short	5
+	.short	0
+.Lstr_offsets_base0:
+	.section	.debug_str,"MS", at progbits,1
+.Lskel_string0:
+	.asciz	"."                             # string offset=0
+.Lskel_string1:
+	.asciz	"objects/o1/split.dwo"                      # string offset=2
+	.section	.debug_str_offsets,"", at progbits
+	.long	.Lskel_string0
+	.long	.Lskel_string1
+	.section	.debug_str_offsets.dwo,"e", at progbits
+	.long	24                              # Length of String Offsets Set
+	.short	5
+	.short	0
+	.section	.debug_str.dwo,"eMS", at progbits,1
+.Linfo_string0:
+	.asciz	"main"                          # string offset=0
+.Linfo_string1:
+	.asciz	"int"                           # string offset=5
+.Linfo_string2:
+	.asciz	"clang version 18.0.0"          # string offset=9
+.Linfo_string3:
+	.asciz	"main.cpp"                      # string offset=30
+.Linfo_string4:
+	.asciz	"objects/o1/split.dwo"                      # string offset=39
+	.section	.debug_str_offsets.dwo,"e", at progbits
+	.long	0
+	.long	5
+	.long	9
+	.long	30
+	.long	39
+	.section	.debug_info.dwo,"e", at progbits
+	.long	.Ldebug_info_dwo_end0-.Ldebug_info_dwo_start0 # Length of Unit
+.Ldebug_info_dwo_start0:
+	.short	5                               # DWARF version number
+	.byte	5                               # DWARF Unit Type
+	.byte	8                               # Address Size (in bytes)
+	.long	0                               # Offset Into Abbrev. Section
+	.quad	6318074710904753300
+	.byte	1                               # Abbrev [1] 0x14:0x1a DW_TAG_compile_unit
+	.byte	2                               # DW_AT_producer
+	.short	33                              # DW_AT_language
+	.byte	3                               # DW_AT_name
+	.byte	4                               # DW_AT_dwo_name
+	.byte	2                               # Abbrev [2] 0x1a: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	0                               # DW_AT_decl_file
+	.byte	1                               # DW_AT_decl_line
+	.long	41                              # DW_AT_type
+                                        # DW_AT_external
+	.byte	3                               # Abbrev [3] 0x29: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
+	.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	118                             # DW_AT_dwo_name
+	.byte	37                              # DW_FORM_strx1
+	.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	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
+	.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_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:
+	.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	40                              # Compilation Unit Length
+	.long	26                              # 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	40                              # Compilation Unit Length
+	.long	41                              # DIE offset
+	.byte	144                             # Attributes: TYPE, STATIC
+	.asciz	"int"                           # External Name
+	.long	0                               # End Mark
+.LpubTypes_end0:
+	.ident	"clang version 18.0.0"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.section	.debug_line,"", at progbits
+.Lline_table_start0:
diff --git a/bolt/test/X86/dwarf5-df-output-dir-same-name.test b/bolt/test/X86/dwarf5-df-output-dir-same-name.test
new file mode 100644
index 000000000000000..bc0a15e35192d7f
--- /dev/null
+++ b/bolt/test/X86/dwarf5-df-output-dir-same-name.test
@@ -0,0 +1,23 @@
+; RUN: rm -rf %t
+; RUN: mkdir %t
+; RUN: mkdir -p %t/objects/o1
+; RUN: mkdir -p %t/objects/o2
+; RUN: mkdir %t/dwo
+; RUN: cd %t
+; RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-df-output-dir-same-name-main.s \
+; RUN: -split-dwarf-file=objects/o1/split.dwo -o main.o
+; RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-df-output-dir-same-name-helper.s \
+; RUN: -split-dwarf-file=objects/o2/split.dwo -o helper.o
+; RUN: %clang %cflags -gdwarf-5 -gsplit-dwarf=split main.o helper.o -o main.exe
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --dwarf-output-path=%t/dwo
+; RUN: ls -lat %t/dwo > log
+; RUN: llvm-dwarfdump --debug-info main.exe.bolt >> log
+; RUN: cat log | FileCheck -check-prefix=BOLT %s
+
+; Tests that BOLT handles correctly writing out .dwo files to the same directory when input has input where part of path
+; is in DW_AT_dwo_name and the .dwo file names are the same.
+
+; BOLT: split.dwo1.dwo
+; BOLT: split.dwo0.dwo
+; BOLT: DW_AT_dwo_name  ("split.dwo0.dwo")
+; BOLT: DW_AT_dwo_name  ("split.dwo1.dwo")

>From d6312a035f36d39cdcbdccba106597b1bfa447c5 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Fri, 10 Nov 2023 10:44:02 -0800
Subject: [PATCH 2/4] fixup! [BOLT][DWARF] Fix --dwarf-output-path

---
 .../X86/Inputs/dwarf5-df-output-dir-same-name-helper.s    | 3 +++
 .../test/X86/Inputs/dwarf5-df-output-dir-same-name-main.s | 8 ++++++--
 bolt/test/X86/dwarf5-df-output-dir-same-name.test         | 4 ++--
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s b/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s
index f539423a03fdbcc..0854e1ae5287c4a 100644
--- a/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s
+++ b/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s
@@ -1,3 +1,6 @@
+# clang++ helper.cpp -g2 -gsplit-dwarf -S -fdebug-compilation-dir=.
+# Modified assembly so that DW_AT_dwo_name has a partial path.
+# int foo() { return 0; }
 	.text
 	.file	"helper.cpp"
 	.globl	_Z3foov                         # -- Begin function _Z3foov
diff --git a/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-main.s b/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-main.s
index 4882d607e75bac7..45fca52ce509976 100644
--- a/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-main.s
+++ b/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-main.s
@@ -1,3 +1,7 @@
+# clang++ main.cpp -g2 -gsplit-dwarf -S -fdebug-compilation-dir=.
+# Modified assembly so that DW_AT_dwo_name has a partial path.
+# int main() { return 0; }
+
 	.text
 	.file	"main.cpp"
 	.globl	main                            # -- Begin function main
@@ -78,7 +82,7 @@ main:                                   # @main
 .Lskel_string0:
 	.asciz	"."                             # string offset=0
 .Lskel_string1:
-	.asciz	"objects/o1/split.dwo"                      # string offset=2
+	.asciz	"objects/o1/split.dwo"                      # string offset=2 <--- Manually modified.
 	.section	.debug_str_offsets,"", at progbits
 	.long	.Lskel_string0
 	.long	.Lskel_string1
@@ -96,7 +100,7 @@ main:                                   # @main
 .Linfo_string3:
 	.asciz	"main.cpp"                      # string offset=30
 .Linfo_string4:
-	.asciz	"objects/o1/split.dwo"                      # string offset=39
+	.asciz	"objects/o1/split.dwo"                      # string offset=39 <--- Manually modified.
 	.section	.debug_str_offsets.dwo,"e", at progbits
 	.long	0
 	.long	5
diff --git a/bolt/test/X86/dwarf5-df-output-dir-same-name.test b/bolt/test/X86/dwarf5-df-output-dir-same-name.test
index bc0a15e35192d7f..5ff543efa019055 100644
--- a/bolt/test/X86/dwarf5-df-output-dir-same-name.test
+++ b/bolt/test/X86/dwarf5-df-output-dir-same-name.test
@@ -4,9 +4,9 @@
 ; RUN: mkdir -p %t/objects/o2
 ; RUN: mkdir %t/dwo
 ; RUN: cd %t
-; RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-df-output-dir-same-name-main.s \
+; RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-df-output-dir-same-name-main.s \
 ; RUN: -split-dwarf-file=objects/o1/split.dwo -o main.o
-; RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-df-output-dir-same-name-helper.s \
+; RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-df-output-dir-same-name-helper.s \
 ; RUN: -split-dwarf-file=objects/o2/split.dwo -o helper.o
 ; RUN: %clang %cflags -gdwarf-5 -gsplit-dwarf=split main.o helper.o -o main.exe
 ; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --dwarf-output-path=%t/dwo

>From b83acd34b42797d575f62de42ae5657087744020 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Fri, 10 Nov 2023 10:46:13 -0800
Subject: [PATCH 3/4] fixup! fixup! [BOLT][DWARF] Fix --dwarf-output-path

---
 bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s b/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s
index 0854e1ae5287c4a..cd0d20cd0a4162a 100644
--- a/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s
+++ b/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s
@@ -80,7 +80,7 @@ _Z3foov:                                # @_Z3foov
 .Lskel_string0:
 	.asciz	"."                             # string offset=0
 .Lskel_string1:
-	.asciz	"objects/o2/split.dwo"                    # string offset=2
+	.asciz	"objects/o2/split.dwo"                    # string offset=2 <-- Manutally modified.
 	.section	.debug_str_offsets,"", at progbits
 	.long	.Lskel_string0
 	.long	.Lskel_string1
@@ -100,7 +100,7 @@ _Z3foov:                                # @_Z3foov
 .Linfo_string4:
 	.asciz	"helper.cpp"                    # string offset=37
 .Linfo_string5:
-	.asciz	"objects/o2/split.dwo"                    # string offset=48
+	.asciz	"objects/o2/split.dwo"                    # string offset=48 <-- Manutally modified.
 	.section	.debug_str_offsets.dwo,"e", at progbits
 	.long	0
 	.long	8

>From 12268a4a3fec33793afc5e5c080dff136df0e6b8 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Fri, 10 Nov 2023 12:31:04 -0800
Subject: [PATCH 4/4] fixup! fixup! fixup! [BOLT][DWARF] Fix
 --dwarf-output-path

---
 bolt/lib/Rewrite/DWARFRewriter.cpp                           | 4 +---
 bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s | 4 ++--
 bolt/test/X86/dwarf5-df-output-dir-same-name.test            | 4 ++--
 3 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp
index 6d3000901c8a1c1..360b82f45bd7754 100644
--- a/bolt/lib/Rewrite/DWARFRewriter.cpp
+++ b/bolt/lib/Rewrite/DWARFRewriter.cpp
@@ -440,9 +440,7 @@ getDWOName(llvm::DWARFUnit &CU,
   assert(!DWOName.empty() &&
          "DW_AT_dwo_name/DW_AT_GNU_dwo_name does not exists.");
   if (!opts::DwarfOutputPath.empty()) {
-    auto Pos = DWOName.rfind("/");
-    if (Pos != std::string::npos)
-      DWOName = DWOName.substr(Pos + 1);
+    DWOName = std::string(sys::path::filename(DWOName));
     auto Iter = NameToIndexMap.find(DWOName);
     if (Iter == NameToIndexMap.end())
       Iter = NameToIndexMap.insert({DWOName, 0}).first;
diff --git a/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s b/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s
index cd0d20cd0a4162a..6ff18a192b8e21e 100644
--- a/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s
+++ b/bolt/test/X86/Inputs/dwarf5-df-output-dir-same-name-helper.s
@@ -80,7 +80,7 @@ _Z3foov:                                # @_Z3foov
 .Lskel_string0:
 	.asciz	"."                             # string offset=0
 .Lskel_string1:
-	.asciz	"objects/o2/split.dwo"                    # string offset=2 <-- Manutally modified.
+	.asciz	"objects/o2/split.dwo"                    # string offset=2 <-- Manually modified.
 	.section	.debug_str_offsets,"", at progbits
 	.long	.Lskel_string0
 	.long	.Lskel_string1
@@ -100,7 +100,7 @@ _Z3foov:                                # @_Z3foov
 .Linfo_string4:
 	.asciz	"helper.cpp"                    # string offset=37
 .Linfo_string5:
-	.asciz	"objects/o2/split.dwo"                    # string offset=48 <-- Manutally modified.
+	.asciz	"objects/o2/split.dwo"                    # string offset=48 <-- Manually modified.
 	.section	.debug_str_offsets.dwo,"e", at progbits
 	.long	0
 	.long	8
diff --git a/bolt/test/X86/dwarf5-df-output-dir-same-name.test b/bolt/test/X86/dwarf5-df-output-dir-same-name.test
index 5ff543efa019055..4fd42e287a11b71 100644
--- a/bolt/test/X86/dwarf5-df-output-dir-same-name.test
+++ b/bolt/test/X86/dwarf5-df-output-dir-same-name.test
@@ -10,14 +10,14 @@
 ; RUN: -split-dwarf-file=objects/o2/split.dwo -o helper.o
 ; RUN: %clang %cflags -gdwarf-5 -gsplit-dwarf=split main.o helper.o -o main.exe
 ; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --dwarf-output-path=%t/dwo
-; RUN: ls -lat %t/dwo > log
+; RUN: ls -l %t/dwo > log
 ; RUN: llvm-dwarfdump --debug-info main.exe.bolt >> log
 ; RUN: cat log | FileCheck -check-prefix=BOLT %s
 
 ; Tests that BOLT handles correctly writing out .dwo files to the same directory when input has input where part of path
 ; is in DW_AT_dwo_name and the .dwo file names are the same.
 
-; BOLT: split.dwo1.dwo
 ; BOLT: split.dwo0.dwo
+; BOLT: split.dwo1.dwo
 ; BOLT: DW_AT_dwo_name  ("split.dwo0.dwo")
 ; BOLT: DW_AT_dwo_name  ("split.dwo1.dwo")



More information about the llvm-commits mailing list