1 # REQUIRES: system-linux
3 # RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-main.s -o %tmain.o
4 # RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper0.s -o %t0.o
5 # RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper1.s -o %t1.o
6 # RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper2.s -o %t2.o
7 # RUN: %clang %cflags -dwarf-5 %tmain.o %t0.o %t1.o %t2.o -o %t.exe -Wl,-q
8 # RUN: llvm-bolt --always-convert-to-ranges %t.exe -o %t.bolt --update-debug-sections
9 # RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe | FileCheck --check-prefix=PRECHECK %s
10 # RUN: llvm-dwarfdump --show-form --verbose --debug-line %t.exe > %t_line.txt
11 # RUN: llvm-dwarfdump --show-form --verbose --debug-addr %t.bolt > %t.txt
12 # RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt >> %t.txt
13 # RUN: cat %t.txt | FileCheck --check-prefix=POSTCHECK %s
14 # RUN: llvm-dwarfdump --show-form --verbose --debug-line %t.bolt >> %t_line.txt
15 # RUN: FileCheck --check-prefix=CHECK-LINE %s --input-file %t_line.txt
18 # Check BOLT handles monolithic mix of DWARF4 and DWARF5.
21 # PRECHECK: version = 0x0005
22 # PRECHECK: DW_TAG_compile_unit [1] *
23 # PRECHECK-NEXT: DW_AT_producer [DW_FORM_strx1] (indexed (00000000)
24 # PRECHECK-NEXT: DW_AT_language
25 # PRECHECK-NEXT: DW_AT_name
26 # PRECHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000008)
27 # PRECHECK-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000)
28 # PRECHECK-NEXT: DW_AT_comp_dir
29 # PRECHECK-NEXT: DW_AT_low_pc
30 # PRECHECK: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1)
33 # PRECHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset] (0x00000008)
34 # PRECHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x0000000c)
35 # PRECHECK-NEXT: DW_AT_loclists_base [DW_FORM_sec_offset] (0x0000000c)
36 # PRECHECK: DW_TAG_subprogram [2] * (0x0000000c)
37 # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000000)
38 # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]
39 # PRECHECK: DW_TAG_subprogram [8]
40 # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001)
41 # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]
42 # PRECHECK: DW_TAG_formal_parameter [9]
43 # PRECHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) loclist = 0x00000018
44 # PRECHECK: DW_TAG_formal_parameter [9]
45 # PRECHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x1) loclist = 0x00000028
46 # PRECHECK: DW_TAG_variable
47 # PRECHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x2) loclist = 0x00000038
48 # PRECHECK: DW_TAG_inlined_subroutine [12]
49 # PRECHECK-NEXT: DW_AT_abstract_origin
50 # PRECHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000014
53 # PRECHECK: version = 0x0004
54 # PRECHECK: DW_TAG_compile_unit
55 # PRECHECK-NEXT: DW_AT_producer
56 # PRECHECK-NEXT: DW_AT_language
57 # PRECHECK-NEXT: DW_AT_name
58 # PRECHECK-NEXT: DW_AT_stmt_list
59 # PRECHECK-NEXT: DW_AT_comp_dir
60 # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]
61 # PRECHECK-NEXT: DW_AT_high_pc
62 # PRECHECK: DW_TAG_subprogram [7]
63 # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]
64 # PRECHECK-NEXT: DW_AT_high_pc
65 # PRECHECK: DW_TAG_variable [9]
66 # PRECHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] (0x00000000:
67 # PRECHECK: DW_TAG_inlined_subroutine [10]
68 # PRECHECK-NEXT: DW_AT_abstract_origin
69 # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]
70 # PRECHECK-NEXT: DW_AT_high_pc
73 # PRECHECK: version = 0x0005
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_str_offsets_base [DW_FORM_sec_offset] (0x00000058)
79 # PRECHECK-NEXT: DW_AT_stmt_list
80 # PRECHECK-NEXT: DW_AT_comp_dir
81 # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001)
82 # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]
83 # PRECHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset] (0x00000038)
84 # PRECHECK-NEXT: DW_AT_loclists_base [DW_FORM_sec_offset] (0x00000051)
85 # PRECHECK: DW_TAG_variable [2]
86 # PRECHECK-NEXT: DW_AT_name
87 # PRECHECK-NEXT: DW_AT_type
88 # PRECHECK-NEXT: DW_AT_external
89 # PRECHECK-NEXT: DW_AT_decl_file
90 # PRECHECK-NEXT: DW_AT_decl_line
91 # PRECHECK: DW_AT_location [DW_FORM_exprloc] (DW_OP_addrx 0x0)
92 # PRECHECK: DW_TAG_subprogram [7]
93 # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001)
94 # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]
95 # PRECHECK: DW_TAG_variable [9]
96 # PRECHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0)
97 # PRECHECK: DW_TAG_inlined_subroutine [10]
98 # PRECHECK-NEXT: DW_AT_abstract_origin
99 # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001)
100 # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]
103 # PRECHECK: version = 0x0004
104 # PRECHECK: DW_TAG_compile_unit [1] *
105 # PRECHECK-NEXT: DW_AT_producer
106 # PRECHECK-NEXT: DW_AT_language
107 # PRECHECK-NEXT: DW_AT_name
108 # PRECHECK-NEXT: DW_AT_stmt_list
109 # PRECHECK-NEXT: DW_AT_comp_dir
110 # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]
111 # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]
112 # PRECHECK: DW_TAG_subprogram [7]
113 # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]
114 # PRECHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]
115 # PRECHECK: DW_TAG_variable [9]
116 # PRECHECK-NEXT: DW_AT_location [DW_FORM_sec_offset]
117 # PRECHECK: DW_TAG_inlined_subroutine [10]
118 # PRECHECK-NEXT: DW_AT_abstract_origin
119 # PRECHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]
120 # PRECHECK-NEXT: DW_AT_high_pc
122 # Checking debug line.
124 # CHECK-LINE: debug_line[
125 # CHECK-LINE: version: 5
126 # CHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#%.8x,TEST_DEBUG_LINE:]]] = "/test"
127 # CHECK-LINE-NEXT: file_names[ 0]:
128 # CHECK-LINE-NEXT: name: .debug_line_str[0x[[#%.8x,MAIN_DEBUG_LINE:]]] = "main.cpp"
129 # CHECK-LINE-NEXT: dir_index: 0
130 # CHECK-LINE-NEXT: md5_checksum: e3a18fae8565a087d09d6076b542cdab
132 # CHECK-LINE: debug_line[
133 # CHECK-LINE: version: 4
134 # CHECK-LINE: include_directories[ 1] = "/test"
135 # CHECK-LINE-NEXT: file_names[ 1]:
136 # CHECK-LINE-NEXT: name: "helper0.cpp"
137 # CHECK-LINE-NEXT: dir_index: 1
138 # CHECK-LINE-NEXT: mod_time:
139 # CHECK-LINE-NEXT: length:
141 # CHECK-LINE: debug_line[
142 # CHECK-LINE: version: 5
143 # CHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#TEST_DEBUG_LINE]]] = "/test"
144 # CHECK-LINE-NEXT: file_names[ 0]:
145 # CHECK-LINE-NEXT: name: .debug_line_str[0x[[#%.8x,HELPER_DEBUG_LINE:]]] = "helper1.cpp"
146 # CHECK-LINE-NEXT: dir_index: 0
147 # CHECK-LINE-NEXT: md5_checksum: e6dbd773fdf80bfea332cdf8284cddce
149 # CHECK-LINE: debug_line[
150 # CHECK-LINE: version: 4
151 # CHECK-LINE: include_directories[ 1] = "/test"
152 # CHECK-LINE-NEXT: file_names[ 1]:
153 # CHECK-LINE-NEXT: name: "helper2.cpp"
154 # CHECK-LINE-NEXT: dir_index: 1
155 # CHECK-LINE-NEXT: mod_time:
156 # CHECK-LINE-NEXT: length:
161 # POSTCHECK: Addrs: [
162 # POSTCHECK-NEXT: 0x[[#%.16x,ADDR:]]
163 # POSTCHECK-NEXT: 0x[[#%.16x,ADDR1:]]
164 # POSTCHECK-NEXT: 0x[[#%.16x,ADDR2:]]
165 # POSTCHECK-NEXT: 0x[[#%.16x,ADDR3:]]
166 # POSTCHECK-NEXT: 0x[[#%.16x,ADDR4:]]
167 # POSTCHECK-NEXT: 0x[[#%.16x,ADDR5:]]
168 # POSTCHECK-NEXT: 0x[[#%.16x,ADDR6:]]
170 # POSTCHECK: Addrs: [
171 # POSTCHECK-NEXT: 0x[[#%.16x,ADDRB:]]
172 # POSTCHECK-NEXT: 0x[[#%.16x,ADDRB1:]]
173 # POSTCHECK-NEXT: 0x[[#%.16x,ADDRB2:]]
177 # POSTCHECK: version = 0x0005
178 # POSTCHECK: DW_TAG_compile_unit [1] *
179 # POSTCHECK-NEXT: DW_AT_producer [DW_FORM_strx1] (indexed (00000000)
180 # POSTCHECK-NEXT: DW_AT_language
181 # POSTCHECK-NEXT: DW_AT_name
182 # POSTCHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000008)
183 # POSTCHECK-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000)
184 # POSTCHECK-NEXT: DW_AT_comp_dir
185 # POSTCHECK-NEXT: DW_AT_low_pc
186 # POSTCHECK: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0)
187 # POSTCHECK-NEXT: [0x[[#ADDR]], 0x[[#ADDR + 0x7]]
188 # POSTCHECK-NEXT: [0x[[#ADDR1]], 0x[[#ADDR1 + 0x51]]
189 # POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset] (0x00000008)
190 # POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x0000000c)
191 # POSTCHECK-NEXT: DW_AT_loclists_base [DW_FORM_sec_offset] (0x0000000c)
192 # POSTCHECK: DW_TAG_subprogram [2]
193 # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist
194 # POSTCHECK-NEXT: [0x[[#ADDR]], 0x[[#ADDR + 0x7]]
195 # POSTCHECK: DW_TAG_subprogram [8]
196 # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x2) rangelist = 0x00000029
197 # POSTCHECK-NEXT: [0x[[#ADDR1]], 0x[[#ADDR1 + 0x51]]
198 # POSTCHECK: DW_TAG_formal_parameter [9]
199 # POSTCHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0) loclist = 0x00000018
200 # POSTCHECK-NEXT: [0x[[#ADDR1]], 0x[[#ADDR1 + 0x22]]
201 # POSTCHECK-NEXT: [0x[[#ADDR1 + 0x22]], 0x[[#ADDR1 + 0x51]]
202 # POSTCHECK: DW_TAG_formal_parameter [9]
203 # POSTCHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x1) loclist = 0x00000028
204 # POSTCHECK-NEXT: [0x[[#ADDR1]], 0x[[#ADDR1 + 0x27]]
205 # POSTCHECK-NEXT: [0x[[#ADDR1 + 0x27]], 0x[[#ADDR1 + 0x51]]
206 # POSTCHECK: DW_TAG_variable
207 # POSTCHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x2) loclist = 0x00000038
208 # POSTCHECK-NEXT: [0x[[#ADDR2]], 0x[[#ADDR2 + 0x6]]
209 # POSTCHECK-NEXT: [0x[[#ADDR2 + 0x6]], 0x[[#ADDR2 + 0x46]]
210 # POSTCHECK: DW_TAG_inlined_subroutine [12]
211 # POSTCHECK-NEXT: DW_AT_abstract_origin
212 # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x3) rangelist = 0x0000002d
213 # POSTCHECK-NEXT: [0x[[#ADDR3]], 0x[[#ADDR3 + 0x4]]
214 # POSTCHECK-NEXT: [0x[[#ADDR3 + 0x10]], 0x[[#ADDR3 + 0x16]]
217 # POSTCHECK: version = 0x0004
218 # POSTCHECK: DW_TAG_compile_unit
219 # POSTCHECK-NEXT: DW_AT_producer
220 # POSTCHECK-NEXT: DW_AT_language
221 # POSTCHECK-NEXT: DW_AT_name
222 # POSTCHECK-NEXT: DW_AT_stmt_list
223 # POSTCHECK-NEXT: DW_AT_comp_dir
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 # POSTCHECK: DW_TAG_subprogram [22]
228 # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
229 # POSTCHECK-NEXT: [0x
230 # POSTCHECK: DW_TAG_variable [24]
231 # POSTCHECK-NEXT: DW_AT_location [DW_FORM_sec_offset]
232 # POSTCHECK-NEXT: [0x
233 # POSTCHECK-NEXT: [0x
234 # POSTCHECK: DW_TAG_inlined_subroutine [25]
235 # POSTCHECK-NEXT: DW_AT_abstract_origin
236 # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
237 # POSTCHECK-NEXT: [0x
240 # POSTCHECK: version = 0x0005
241 # POSTCHECK: DW_TAG_compile_unit [26] *
242 # POSTCHECK-NEXT: DW_AT_producer
243 # POSTCHECK-NEXT: DW_AT_language
244 # POSTCHECK-NEXT: DW_AT_name
245 # POSTCHECK-NEXT: DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x00000058)
246 # POSTCHECK-NEXT: DW_AT_stmt_list
247 # POSTCHECK-NEXT: DW_AT_comp_dir
248 # POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000001)
249 # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0)
250 # POSTCHECK-NEXT: [0x[[#ADDRB]], 0x[[#ADDRB + 0x4]]
251 # POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset]
252 # POSTCHECK-NEXT: DW_AT_loclists_base [DW_FORM_sec_offset]
253 # POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset]
254 # POSTCHECK: DW_TAG_variable [27]
255 # POSTCHECK-NEXT: DW_AT_name
256 # POSTCHECK-NEXT: DW_AT_type
257 # POSTCHECK-NEXT: DW_AT_external
258 # POSTCHECK-NEXT: DW_AT_decl_file
259 # POSTCHECK-NEXT: DW_AT_decl_line
260 # POSTCHECK: DW_AT_location [DW_FORM_exprloc] (DW_OP_addrx 0x2)
261 # POSTCHECK: DW_TAG_subprogram [29]
262 # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1)
263 # POSTCHECK-NEXT: [0x[[#ADDRB]], 0x[[#ADDRB + 0x4]]
264 # POSTCHECK: DW_TAG_variable [10]
265 # POSTCHECK-NEXT: DW_AT_location [DW_FORM_loclistx] (indexed (0x0)
266 # POSTCHECK-NEXT: [0x[[#ADDRB]], 0x[[#ADDRB + 0x3]]
267 # POSTCHECK-NEXT: [0x[[#ADDRB + 0x3]], 0x[[#ADDRB + 0x4]]
268 # POSTCHECK: DW_TAG_inlined_subroutine
269 # POSTCHECK-NEXT: DW_AT_abstract_origin
270 # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x2) rangelist
271 # POSTCHECK-NEXT: [0x[[#ADDRB]], 0x[[#ADDRB + 0x3]]
274 # POSTCHECK: version = 0x0004
275 # POSTCHECK: DW_TAG_compile_unit [17] *
276 # POSTCHECK-NEXT: DW_AT_producer
277 # POSTCHECK-NEXT: DW_AT_language
278 # POSTCHECK-NEXT: DW_AT_name
279 # POSTCHECK-NEXT: DW_AT_stmt_list
280 # POSTCHECK-NEXT: DW_AT_comp_dir
281 # POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
282 # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
283 # POSTCHECK-NEXT: [0x
284 # POSTCHECK: DW_TAG_subprogram [22]
285 # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
286 # POSTCHECK-NEXT: [0x
287 # POSTCHECK: DW_TAG_variable [24]
288 # POSTCHECK-NEXT: DW_AT_location [DW_FORM_sec_offset]
289 # POSTCHECK-NEXT: [0x
290 # POSTCHECK-NEXT: [0x
291 # POSTCHECK: DW_TAG_inlined_subroutine [25]
292 # POSTCHECK-NEXT: DW_AT_abstract_origin
293 # POSTCHECK-NEXT: DW_AT_ranges [DW_FORM_sec_offset]
294 # POSTCHECK-NEXT: [0x
297 # Checking debug line.
299 # CHECK-LINE: debug_line[
300 # CHECK-LINE: version: 5
301 # CHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#TEST_DEBUG_LINE]]] = "/test"
302 # CHECK-LINE-NEXT: file_names[ 0]:
303 # CHECK-LINE-NEXT: name: .debug_line_str[0x[[#MAIN_DEBUG_LINE]]] = "main.cpp"
304 # CHECK-LINE-NEXT: dir_index: 0
305 # CHECK-LINE-NEXT: md5_checksum: e3a18fae8565a087d09d6076b542cdab
307 # CHECK-LINE: debug_line[
308 # CHECK-LINE: version: 4
309 # CHECK-LINE: include_directories[ 1] = "/test"
310 # CHECK-LINE-NEXT: file_names[ 1]:
311 # CHECK-LINE-NEXT: name: "helper0.cpp"
312 # CHECK-LINE-NEXT: dir_index: 1
313 # CHECK-LINE-NEXT: mod_time:
314 # CHECK-LINE-NEXT: length:
316 # CHECK-LINE: debug_line[
317 # CHECK-LINE: version: 5
318 # CHECK-LINE: include_directories[ 0] = .debug_line_str[0x[[#TEST_DEBUG_LINE]]] = "/test"
319 # CHECK-LINE-NEXT: file_names[ 0]:
320 # CHECK-LINE-NEXT: name: .debug_line_str[0x[[#HELPER_DEBUG_LINE]]] = "helper1.cpp"
321 # CHECK-LINE-NEXT: dir_index: 0
322 # CHECK-LINE-NEXT: md5_checksum: e6dbd773fdf80bfea332cdf8284cddce
324 # CHECK-LINE: debug_line[
325 # CHECK-LINE: version: 4
326 # CHECK-LINE: include_directories[ 1] = "/test"
327 # CHECK-LINE-NEXT: file_names[ 1]:
328 # CHECK-LINE-NEXT: name: "helper2.cpp"
329 # CHECK-LINE-NEXT: dir_index: 1
330 # CHECK-LINE-NEXT: mod_time:
331 # CHECK-LINE-NEXT: length: