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 main.exe -o main.bolt --update-debug-sections
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# POSTCHECK-NEXT: 0x[[#%.16x,ADDR7:]]
141# POSTCHECK-NEXT: 0x[[#%.16x,ADDR8:]]
142
143# POSTCHECK: Addrs: [
144# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB:]]
145# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB1:]]
146# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB2:]]
147# POSTCHECK-NEXT: 0x[[#%.16x,ADDRB3:]]
148
149
150# main.cpp
151# POSTCHECK: version = 0x0005
152# POSTCHECK: DW_AT_stmt_list [DW_FORM_sec_offset]  (0x00000000)
153# POSTCHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000008)
154# POSTCHECK-NEXT: DW_AT_comp_dir [DW_FORM_strx1]  (indexed (00000000) string = ".")
155# POSTCHECK-NEXT: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true)
156# POSTCHECK-NEXT: DW_AT_dwo_name [DW_FORM_strx1]  (indexed (00000001) string = "main.dwo.dwo")
157# POSTCHECK-NEXT: DW_AT_low_pc
158# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0)
159# POSTCHECK-NEXT: [0x[[#ADDR]], 0x[[#ADDR + 0x7]]
160# POSTCHECK-NEXT: [0x[[#ADDR2]], 0x[[#ADDR2 + 0x51]]
161# POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset]
162# POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset]
163
164# helper0.cpp
165# POSTCHECK: version = 0x0004
166# POSTCHECK: DW_TAG_compile_unit
167# POSTCHECK-NEXT: DW_AT_producer
168# POSTCHECK-NEXT: DW_AT_language
169# POSTCHECK-NEXT: DW_AT_name
170# POSTCHECK-NEXT: DW_AT_stmt_list
171# POSTCHECK-NEXT: DW_AT_comp_dir
172# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
173# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
174# POSTCHECK-NEXT: [0x
175# POSTCHECK: DW_TAG_subprogram [7]
176# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
177# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
178# POSTCHECK-NEXT: [0x
179# POSTCHECK: DW_TAG_variable [9]
180# POSTCHECK-NEXT: DW_AT_location [DW_FORM_sec_offset]
181# POSTCHECK-NEXT: [0x
182# POSTCHECK-NEXT: [0x
183# POSTCHECK: DW_TAG_inlined_subroutine [10]
184# POSTCHECK-NEXT: DW_AT_abstract_origin
185# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
186# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
187# POSTCHECK-NEXT: [0x
188
189# helper1.cpp
190# POSTCHECK: version = 0x0005
191# POSTCHECK: DW_TAG_skeleton_unit [1]
192# POSTCHECK-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset]  (0x000000fe)
193# POSTCHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000018)
194# POSTCHECK-NEXT: DW_AT_comp_dir [DW_FORM_strx1]  (indexed (00000000) string = ".")
195# POSTCHECK-NEXT: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true)
196# POSTCHECK-NEXT: DW_AT_dwo_name [DW_FORM_strx1]  (indexed (00000001) string = "helper1.dwo.dwo")
197# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx]  (indexed (00000002)
198# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0)
199# POSTCHECK-NEXT: [0x[[#ADDRB1]], 0x[[#ADDRB1 + 0x4]]
200# POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset]
201# POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset]
202
203# helper2.cpp
204# POSTCHECK: version = 0x0004
205# POSTCHECK: DW_TAG_compile_unit [1] *
206# POSTCHECK-NEXT: DW_AT_producer
207# POSTCHECK-NEXT: DW_AT_language
208# POSTCHECK-NEXT: DW_AT_name
209# POSTCHECK-NEXT: DW_AT_stmt_list
210# POSTCHECK-NEXT: DW_AT_comp_dir
211# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
212# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
213# POSTCHECK-NEXT: [0x
214# POSTCHECK: DW_TAG_subprogram [7]
215# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
216# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
217# POSTCHECK-NEXT: [0x
218# POSTCHECK: DW_TAG_variable [9]
219# POSTCHECK-NEXT: DW_AT_location [DW_FORM_sec_offset]
220# POSTCHECK-NEXT: [0x
221# POSTCHECK-NEXT: [0x
222# POSTCHECK: DW_TAG_inlined_subroutine [10]
223# POSTCHECK-NEXT: DW_AT_abstract_origin
224# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
225# POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
226# POSTCHECK-NEXT: [0x
227
228# POSTCHECK-DWO-MAIN: version = 0x0005
229# POSTCHECK-DWO-MAIN: DW_TAG_compile_unit
230# POSTCHECK-DWO-MAIN: DW_TAG_subprogram [2]
231# POSTCHECK-DWO-MAIN-NEXT: DW_AT_low_pc [DW_FORM_addrx]  (indexed (00000001)
232# POSTCHECK-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000018
233# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000000, 0x0000000000000007))
234# POSTCHECK-DWO-MAIN: DW_TAG_subprogram [8]
235# POSTCHECK-DWO-MAIN-NEXT: DW_AT_low_pc [DW_FORM_addrx]  (indexed (00000001)
236# POSTCHECK-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x0000001c
237# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000000, 0x0000000000000051))
238# POSTCHECK-DWO-MAIN: DW_TAG_formal_parameter [9]
239# POSTCHECK-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) loclist = 0x00000018:
240# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_startx_length   (0x0000000000000002, 0x0000000000000022): DW_OP_reg5 RDI
241# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_startx_length   (0x0000000000000003, 0x000000000000002f): DW_OP_entry_value(DW_OP_reg5 RDI), DW_OP_stack_value)
242# POSTCHECK-DWO-MAIN: DW_TAG_formal_parameter [9]
243# POSTCHECK-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x1) loclist = 0x00000026:
244# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_startx_length   (0x0000000000000002, 0x0000000000000027): DW_OP_reg4 RSI
245# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_startx_length   (0x0000000000000004, 0x000000000000002a): DW_OP_entry_value(DW_OP_reg4 RSI), DW_OP_stack_value)
246# POSTCHECK-DWO-MAIN: DW_TAG_variable [10]
247# POSTCHECK-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x2) loclist = 0x00000034:
248# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_startx_length   (0x0000000000000005, 0x0000000000000006): DW_OP_reg5 RDI
249# POSTCHECK-DWO-MAIN-NEXT: DW_LLE_startx_length   (0x0000000000000006, 0x0000000000000040): DW_OP_reg14 R14)
250# POSTCHECK-DWO-MAIN: DW_TAG_inlined_subroutine [12]
251# POSTCHECK-DWO-MAIN-NEXT: DW_AT_abstract_origin [DW_FORM_ref4]
252# POSTCHECK-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x2) rangelist = 0x00000020
253# BOLT uses DW_RLE_startx_length encoding. Wit this encoding llvm-dwarfdump tries to lookup the actual address.
254# Since .debug_addr is in the binary low_pc is set to 0.
255# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000000, 0x0000000000000004)
256# POSTCHECK-DWO-MAIN-NEXT: [0x0000000000000000, 0x0000000000000006))
257
258# POSTCHECK-DWO-HELPER1: version = 0x0005
259# POSTCHECK-DWO-HELPER1: DW_TAG_subprogram [7]
260# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_low_pc [DW_FORM_addrx]  (indexed (00000002) address
261# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000014
262# POSTCHECK-DWO-HELPER1-NEXT: [0x0000000000000000, 0x0000000000000004))
263# POSTCHECK-DWO-HELPER1: DW_TAG_variable [9]
264# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) loclist = 0x00000010:
265# POSTCHECK-DWO-HELPER1-NEXT: DW_LLE_startx_length   (0x0000000000000001, 0x0000000000000003): DW_OP_reg5 RDI
266# POSTCHECK-DWO-HELPER1-NEXT: DW_LLE_startx_length   (0x0000000000000003, 0x0000000000000001): DW_OP_reg0 RAX)
267# POSTCHECK-DWO-HELPER1: DW_TAG_inlined_subroutine [10]
268# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_abstract_origin
269# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_low_pc [DW_FORM_addrx]  (indexed (00000002) address
270# POSTCHECK-DWO-HELPER1-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000018
271# POSTCHECK-DWO-HELPER1-NEXT: [0x0000000000000000, 0x0000000000000003))
272
273# Checking debug line.
274
275# POSTCHECK-LINE: debug_line[
276# POSTCHECK-LINE: version: 5
277# POSTCHECK-LINE: include_directories[  0] =  .debug_line_str[0x[[#%.8x,LINE:]]] = "."
278# POSTCHECK-LINE-NEXT: file_names[  0]:
279# POSTCHECK-LINE-NEXT: name:  .debug_line_str[0x[[#%.8x,LINE:]]] = "main.cpp"
280# POSTCHECK-LINE-NEXT: dir_index: 0
281# POSTCHECK-LINE-NEXT: md5_checksum: e3a18fae8565a087d09d6076b542cdab
282
283# POSTCHECK-LINE: debug_line[
284# POSTCHECK-LINE: version: 4
285# POSTCHECK-LINE: include_directories[  1] = "/test"
286# POSTCHECK-LINE-NEXT: file_names[  1]:
287# POSTCHECK-LINE-NEXT: name: "helper0.cpp"
288# POSTCHECK-LINE-NEXT: dir_index: 1
289# POSTCHECK-LINE-NEXT: mod_time:
290# POSTCHECK-LINE-NEXT: length:
291
292# POSTCHECK-LINE: debug_line[
293# POSTCHECK-LINE: version: 5
294# POSTCHECK-LINE: include_directories[  0] =  .debug_line_str[0x[[#%.8x,LINE:]]] = "."
295# POSTCHECK-LINE-NEXT: file_names[  0]:
296# POSTCHECK-LINE-NEXT: name:  .debug_line_str[0x[[#%.8x,LINE:]]] = "helper1.cpp"
297# POSTCHECK-LINE-NEXT: dir_index: 0
298# POSTCHECK-LINE-NEXT: md5_checksum: e6dbd773fdf80bfea332cdf8284cddce
299
300# POSTCHECK-LINE: debug_line[
301# POSTCHECK-LINE: version: 4
302# POSTCHECK-LINE: include_directories[  1] = "/test"
303# POSTCHECK-LINE-NEXT: file_names[  1]:
304# POSTCHECK-LINE-NEXT: name: "helper2.cpp"
305# POSTCHECK-LINE-NEXT: dir_index: 1
306# POSTCHECK-LINE-NEXT: mod_time:
307# POSTCHECK-LINE-NEXT: length:
308