xref: /llvm-project/bolt/test/X86/dwarf5-split-dwarf4-monolithic.test (revision 6aad62cf5b7f91f4b02266cf72469e2c8e28dbef)
1# REQUIRES: system-linux
2
3; RUN: rm -rf %t
4; RUN: mkdir %t
5; RUN: cd %t
6
7# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux -split-dwarf-file=main.dwo %p/Inputs/dwarf5-split-dwarf4-monolithic-main.s -o main.o
8# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper0.s -o helper0.o
9# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux -split-dwarf-file=helper1.dwo %p/Inputs/dwarf5-split-dwarf4-monolithic-helper1.s -o helper1.o
10# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper2.s -o helper2.o
11# RUN: %clang %cflags -dwarf-5 main.o helper0.o helper1.o helper2.o -o main.exe -Wl,-q
12# RUN: llvm-bolt --always-convert-to-ranges main.exe -o main.bolt --update-debug-sections --debug-thread-count=4 --cu-processing-batch-size=4
13# RUN: llvm-dwarfdump --show-form --verbose --debug-info main.exe | FileCheck --check-prefix=PRECHECK %s
14# RUN: llvm-dwarfdump --show-form --verbose --debug-line main.exe | FileCheck --check-prefix=PRECHECK-LINE %s
15# RUN: llvm-dwarfdump --show-form --verbose --debug-addr main.bolt >  boltout.txt
16# RUN: llvm-dwarfdump --show-form --verbose --debug-info main.bolt >> boltout.txt
17# RUN: cat boltout.txt | FileCheck --check-prefix=POSTCHECK %s
18# RUN: llvm-dwarfdump --show-form --verbose --debug-info main.dwo.dwo | FileCheck --check-prefix=POSTCHECK-DWO-MAIN %s
19# RUN: llvm-dwarfdump --show-form --verbose --debug-info helper1.dwo.dwo | FileCheck --check-prefix=POSTCHECK-DWO-HELPER1 %s
20# RUN: llvm-dwarfdump --show-form --verbose --debug-line main.bolt | FileCheck --check-prefix=POSTCHECK-LINE %s
21
22
23## Check BOLT handles monolithic mix of DWARF4 and DWARF5.
24
25# main.cpp
26# PRECHECK: version = 0x0005
27# PRECHECK: DW_TAG_skeleton_unit
28# PRECHECK-NEXT: DW_AT_stmt_list
29# PRECHECK-NEXT: DW_AT_str_offsets_base
30# PRECHECK-NEXT: DW_AT_comp_dir
31# PRECHECK-NEXT: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true)
32# PRECHECK-NEXT: DW_AT_dwo_name [DW_FORM_strx1]  (indexed (00000001) string = "main.dwo")
33# PRECHECK-NEXT: DW_AT_low_pc
34# PRECHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000010
35# PRECHECK-NEXT: [0x
36# PRECHECK-NEXT: [0x
37# PRECHECK-NEXT: DW_AT_addr_base
38# PRECHECK-NEXT: DW_AT_rnglists_base
39
40# helper0.cpp
41# PRECHECK: version = 0x0004
42# PRECHECK: DW_TAG_compile_unit
43# PRECHECK-NEXT: DW_AT_producer
44# PRECHECK-NEXT: DW_AT_language
45# PRECHECK-NEXT: DW_AT_name
46# PRECHECK-NEXT: DW_AT_stmt_list
47# PRECHECK-NEXT: DW_AT_comp_dir
48# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]
49# PRECHECK-NEXT: DW_AT_high_pc
50# PRECHECK: DW_TAG_subprogram [7]
51# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]
52# PRECHECK-NEXT: DW_AT_high_pc
53# PRECHECK: DW_TAG_variable [9]
54# PRECHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] (0x00000000:
55# PRECHECK: DW_TAG_inlined_subroutine [10]
56# PRECHECK-NEXT: DW_AT_abstract_origin
57# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]
58# PRECHECK-NEXT: DW_AT_high_pc
59
60# helper1.cpp
61# PRECHECK: version = 0x0005
62# PRECHECK: DW_TAG_skeleton_unit [1]
63# PRECHECK-NEXT: DW_AT_stmt_list
64# PRECHECK-NEXT: DW_AT_str_offsets_base
65# PRECHECK-NEXT: DW_AT_comp_dir
66# PRECHECK-NEXT: DW_AT_GNU_pubnames
67# PRECHECK-NEXT: DW_AT_dwo_name [DW_FORM_strx1]  (indexed (00000001) string = "helper1.dwo")
68# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx]  (indexed (00000001) address
69# PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]
70# PRECHECK-NEXT: DW_AT_addr_base
71
72# helper2.cpp
73# PRECHECK: version = 0x0004
74# PRECHECK: DW_TAG_compile_unit [1] *
75# PRECHECK-NEXT: DW_AT_producer
76# PRECHECK-NEXT: DW_AT_language
77# PRECHECK-NEXT: DW_AT_name
78# PRECHECK-NEXT: DW_AT_stmt_list
79# PRECHECK-NEXT: DW_AT_comp_dir
80# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]
81# PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]
82# PRECHECK: DW_TAG_subprogram [7]
83# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]
84# PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]
85# PRECHECK: DW_TAG_variable [9]
86# PRECHECK-NEXT: DW_AT_location [DW_FORM_sec_offset]
87# PRECHECK: DW_TAG_inlined_subroutine [10]
88# PRECHECK-NEXT: DW_AT_abstract_origin
89# PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]
90# PRECHECK-NEXT: DW_AT_high_pc
91
92## Checking debug line.
93
94# PRECHECK-LINE: debug_line[
95# PRECHECK-LINE: version: 5
96# PRECHECK-LINE: include_directories[  0] =  .debug_line_str[0x[[#%.8x,LINE:]]] = "."
97# PRECHECK-LINE-NEXT: file_names[  0]:
98# PRECHECK-LINE-NEXT: name:  .debug_line_str[0x[[#%.8x,LINE:]]] = "main.cpp"
99# PRECHECK-LINE-NEXT: dir_index: 0
100# PRECHECK-LINE-NEXT: md5_checksum: e3a18fae8565a087d09d6076b542cdab
101
102# PRECHECK-LINE: debug_line[
103# PRECHECK-LINE: version: 4
104# PRECHECK-LINE: include_directories[  1] = "/test"
105# PRECHECK-LINE-NEXT: file_names[  1]:
106# PRECHECK-LINE-NEXT: name: "helper0.cpp"
107# PRECHECK-LINE-NEXT: dir_index: 1
108# PRECHECK-LINE-NEXT: mod_time:
109# PRECHECK-LINE-NEXT: length:
110
111# PRECHECK-LINE: debug_line[
112# PRECHECK-LINE: version: 5
113# PRECHECK-LINE: include_directories[  0] =  .debug_line_str[0x[[#%.8x,LINE:]]] = "."
114# PRECHECK-LINE-NEXT: file_names[  0]:
115# PRECHECK-LINE-NEXT: name:  .debug_line_str[0x[[#%.8x,LINE:]]] = "helper1.cpp"
116# PRECHECK-LINE-NEXT: dir_index: 0
117# PRECHECK-LINE-NEXT: md5_checksum: e6dbd773fdf80bfea332cdf8284cddce
118
119
120# PRECHECK-LINE: debug_line[
121# PRECHECK-LINE: version: 4
122# PRECHECK-LINE: include_directories[  1] = "/test"
123# PRECHECK-LINE-NEXT: file_names[  1]:
124# PRECHECK-LINE-NEXT: name: "helper2.cpp"
125# PRECHECK-LINE-NEXT: dir_index: 1
126# PRECHECK-LINE-NEXT: mod_time:
127# PRECHECK-LINE-NEXT: length:
128
129
130# POST BOLT.
131
132# POSTCHECK: Addrs: [
133# POSTCHECK-NEXT: 0x[[#%.16x,ADDR:]]
134# POSTCHECK-NEXT: 0x[[#%.16x,ADDR1:]]
135# POSTCHECK-NEXT: 0x[[#%.16x,ADDR2:]]
136# POSTCHECK-NEXT: 0x[[#%.16x,ADDR3:]]
137# POSTCHECK-NEXT: 0x[[#%.16x,ADDR4:]]
138# POSTCHECK-NEXT: 0x[[#%.16x,ADDR5:]]
139# POSTCHECK-NEXT: 0x[[#%.16x,ADDR6:]]
140
141# POSTCHECK: Addrs: [
142# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB:]]
143# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB1:]]
144# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB2:]]
145
146
147# main.cpp
148# POSTCHECK: version = 0x0005
149# POSTCHECK: DW_AT_stmt_list [DW_FORM_sec_offset]  (0x00000000)
150# POSTCHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000008)
151# POSTCHECK-NEXT: DW_AT_comp_dir [DW_FORM_strx1]  (indexed (00000000) string = ".")
152# POSTCHECK-NEXT: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true)
153# POSTCHECK-NEXT: DW_AT_dwo_name [DW_FORM_strx1]  (indexed (00000001) string = "main.dwo.dwo")
154# POSTCHECK-NEXT: DW_AT_low_pc
155# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0)
156# POSTCHECK-NEXT: [0x[[#ADDR]], 0x[[#ADDR + 0x7]]
157# POSTCHECK-NEXT: [0x[[#ADDR1]], 0x[[#ADDR1 + 0x51]]
158# POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset]
159# POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset]
160
161# helper0.cpp
162# POSTCHECK: version = 0x0004
163# POSTCHECK: DW_TAG_compile_unit
164# POSTCHECK-NEXT: DW_AT_producer
165# POSTCHECK-NEXT: DW_AT_language
166# POSTCHECK-NEXT: DW_AT_name
167# POSTCHECK-NEXT: DW_AT_stmt_list
168# POSTCHECK-NEXT: DW_AT_comp_dir
169# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
170# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
171# POSTCHECK-NEXT: [0x
172# POSTCHECK: DW_TAG_subprogram [8]
173# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
174# POSTCHECK-NEXT: [0x
175# POSTCHECK: DW_TAG_variable [10]
176# POSTCHECK-NEXT: DW_AT_location [DW_FORM_sec_offset]
177# POSTCHECK-NEXT: [0x
178# POSTCHECK-NEXT: [0x
179# POSTCHECK: DW_TAG_inlined_subroutine [11]
180# POSTCHECK-NEXT: DW_AT_abstract_origin
181# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
182# POSTCHECK-NEXT: [0x
183
184# helper1.cpp
185# POSTCHECK: version = 0x0005
186# POSTCHECK: DW_TAG_skeleton_unit [12]
187# POSTCHECK-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset]  (0x000000fe)
188# POSTCHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000018)
189# POSTCHECK-NEXT: DW_AT_comp_dir [DW_FORM_strx1]  (indexed (00000000) string = ".")
190# POSTCHECK-NEXT: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true)
191# POSTCHECK-NEXT: DW_AT_dwo_name [DW_FORM_strx1]  (indexed (00000001) string = "helper1.dwo.dwo")
192# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx]  (indexed (00000002)
193# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0)
194# POSTCHECK-NEXT: [0x[[#ADDRB1]], 0x[[#ADDRB1 + 0x4]]
195# POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset]
196# POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset]
197
198# helper2.cpp
199# POSTCHECK: version = 0x0004
200# POSTCHECK: DW_TAG_compile_unit [2] *
201# POSTCHECK-NEXT: DW_AT_producer
202# POSTCHECK-NEXT: DW_AT_language
203# POSTCHECK-NEXT: DW_AT_name
204# POSTCHECK-NEXT: DW_AT_stmt_list
205# POSTCHECK-NEXT: DW_AT_comp_dir
206# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
207# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
208# POSTCHECK-NEXT: [0x
209# POSTCHECK: DW_TAG_subprogram [8]
210# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
211# POSTCHECK-NEXT: [0x
212# POSTCHECK: DW_TAG_variable [10]
213# POSTCHECK-NEXT: DW_AT_location [DW_FORM_sec_offset]
214# POSTCHECK-NEXT: [0x
215# POSTCHECK-NEXT: [0x
216# POSTCHECK: DW_TAG_inlined_subroutine [11]
217# POSTCHECK-NEXT: DW_AT_abstract_origin
218# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
219# POSTCHECK-NEXT: [0x
220
221# POSTCHECK-DWO-MAIN: version = 0x0005
222# POSTCHECK-DWO-MAIN: DW_TAG_compile_unit
223# POSTCHECK-DWO-MAIN: DW_TAG_subprogram [2]
224# POSTCHECK-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000018
225# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000000, 0x0000000000000007))
226# POSTCHECK-DWO-MAIN: DW_TAG_subprogram [8]
227# POSTCHECK-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x0000001c
228# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000000, 0x0000000000000051))
229# POSTCHECK-DWO-MAIN: DW_TAG_formal_parameter [9]
230# POSTCHECK-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) loclist = 0x00000018:
231# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_base_addressx   (0x0000000000000001)
232# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_offset_pair     (0x0000000000000000, 0x0000000000000022): DW_OP_reg5 RDI
233# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_offset_pair     (0x0000000000000022, 0x0000000000000051): DW_OP_entry_value(DW_OP_reg5 RDI), DW_OP_stack_value)
234# POSTCHECK-DWO-MAIN: DW_TAG_formal_parameter [9]
235# POSTCHECK-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x1) loclist = 0x00000028:
236# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_base_addressx   (0x0000000000000001)
237# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_offset_pair     (0x0000000000000000, 0x0000000000000027): DW_OP_reg4 RSI
238# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_offset_pair     (0x0000000000000027, 0x0000000000000051): DW_OP_entry_value(DW_OP_reg4 RSI), DW_OP_stack_value)
239# POSTCHECK-DWO-MAIN: DW_TAG_variable [10]
240# POSTCHECK-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x2) loclist = 0x00000038:
241# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_base_addressx   (0x0000000000000002)
242# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_offset_pair     (0x0000000000000000, 0x0000000000000006): DW_OP_reg5 RDI
243# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_offset_pair     (0x0000000000000006, 0x0000000000000046): DW_OP_reg14 R14)
244# POSTCHECK-DWO-MAIN: DW_TAG_inlined_subroutine [12]
245# POSTCHECK-DWO-MAIN-NEXT: DW_AT_abstract_origin [DW_FORM_ref4]
246# POSTCHECK-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x2) rangelist = 0x00000020
247# Encoded as a pair. So it's offset from base address.
248# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000003, 0x0000000000000007)
249# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000013, 0x0000000000000019))
250
251# POSTCHECK-DWO-HELPER1: version = 0x0005
252# POSTCHECK-DWO-HELPER1: DW_TAG_subprogram [7]
253# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000014
254# POSTCHECK-DWO-HELPER1-NEXT: [0x0000000000000000, 0x0000000000000004))
255# POSTCHECK-DWO-HELPER1: DW_TAG_variable [9]
256# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) loclist = 0x00000010:
257# POSTCHECK-DWO-HELPER1-NEXT: DW_LLE_base_addressx   (0x0000000000000001)
258# POSTCHECK-DWO-HELPER1-NEXT: DW_LLE_offset_pair     (0x0000000000000000, 0x0000000000000003): DW_OP_reg5 RDI
259# POSTCHECK-DWO-HELPER1-NEXT: DW_LLE_offset_pair     (0x0000000000000003, 0x0000000000000004): DW_OP_reg0 RAX)
260# POSTCHECK-DWO-HELPER1: DW_TAG_inlined_subroutine [10]
261# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_abstract_origin
262# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000018
263# POSTCHECK-DWO-HELPER1-NEXT: [0x0000000000000000, 0x0000000000000003))
264
265## Checking debug line.
266
267# POSTCHECK-LINE: debug_line[
268# POSTCHECK-LINE: version: 5
269# POSTCHECK-LINE: include_directories[  0] =  .debug_line_str[0x[[#%.8x,LINE:]]] = "."
270# POSTCHECK-LINE-NEXT: file_names[  0]:
271# POSTCHECK-LINE-NEXT: name:  .debug_line_str[0x[[#%.8x,LINE:]]] = "main.cpp"
272# POSTCHECK-LINE-NEXT: dir_index: 0
273# POSTCHECK-LINE-NEXT: md5_checksum: e3a18fae8565a087d09d6076b542cdab
274
275# POSTCHECK-LINE: debug_line[
276# POSTCHECK-LINE: version: 4
277# POSTCHECK-LINE: include_directories[  1] = "/test"
278# POSTCHECK-LINE-NEXT: file_names[  1]:
279# POSTCHECK-LINE-NEXT: name: "helper0.cpp"
280# POSTCHECK-LINE-NEXT: dir_index: 1
281# POSTCHECK-LINE-NEXT: mod_time:
282# POSTCHECK-LINE-NEXT: length:
283
284# POSTCHECK-LINE: debug_line[
285# POSTCHECK-LINE: version: 5
286# POSTCHECK-LINE: include_directories[  0] =  .debug_line_str[0x[[#%.8x,LINE:]]] = "."
287# POSTCHECK-LINE-NEXT: file_names[  0]:
288# POSTCHECK-LINE-NEXT: name:  .debug_line_str[0x[[#%.8x,LINE:]]] = "helper1.cpp"
289# POSTCHECK-LINE-NEXT: dir_index: 0
290# POSTCHECK-LINE-NEXT: md5_checksum: e6dbd773fdf80bfea332cdf8284cddce
291
292# POSTCHECK-LINE: debug_line[
293# POSTCHECK-LINE: version: 4
294# POSTCHECK-LINE: include_directories[  1] = "/test"
295# POSTCHECK-LINE-NEXT: file_names[  1]:
296# POSTCHECK-LINE-NEXT: name: "helper2.cpp"
297# POSTCHECK-LINE-NEXT: dir_index: 1
298# POSTCHECK-LINE-NEXT: mod_time:
299# POSTCHECK-LINE-NEXT: length:
300