1// Test dwarf-5 DW_AT_location [DW_FORM_loclistx].
2
3// Built with "clang -c -target aarch64-linux -gdwarf-5 -O3 -S" from the following source:
4// void use(int *);
5// void f(void) {
6//   int x = 1;
7//   use(&x);
8// }
9
10// RUN: llvm-mc -filetype=obj -triple=aarch64-linux-android --dwarf-version=5 -o %t.o %s
11// RUN: echo 'FRAME %t.o 0x4'  | llvm-symbolizer | FileCheck %s
12
13// DW_AT_location        (indexed (0x0) loclist = 0x00000010:
14// [0x0000000000000010, 0x0000000000000018): DW_OP_consts +1, DW_OP_stack_value
15// [0x0000000000000018, 0x0000000000000028): DW_OP_breg29 W29-4)
16// CHECK:      f
17// CHECK-NEXT: x
18// CHECK-NEXT: {{.*}}dbg.c:3
19// CHECK-NEXT: -4 4 ??
20
21	.text
22	.file	"dbg.c"
23	.file	0 "/code/build-llvm-cmake" "/tmp/dbg.c" md5 0x87e53f5ae1de5f2c6ec0baa7fe683192
24	.globl	_Z1fv                   // -- Begin function _Z1fv
25	.p2align	2
26	.type	_Z1fv,@function
27_Z1fv:                                  // @_Z1fv
28.Lfunc_begin0:
29	.loc	0 2 0                   // /tmp/dbg.c:2:0
30	.cfi_startproc
31// %bb.0:                               // %entry
32	sub	sp, sp, #32             // =32
33	stp	x29, x30, [sp, #16]     // 16-byte Folded Spill
34	add	x29, sp, #16            // =16
35	.cfi_def_cfa w29, 16
36	.cfi_offset w30, -8
37	.cfi_offset w29, -16
38	mov	w8, #1
39.Ltmp0:
40	//DEBUG_VALUE: f:x <- 1
41	.loc	0 4 3 prologue_end      // /tmp/dbg.c:4:3
42	sub	x0, x29, #4             // =4
43	.loc	0 3 7                   // /tmp/dbg.c:3:7
44	stur	w8, [x29, #-4]
45.Ltmp1:
46	//DEBUG_VALUE: f:x <- [DW_OP_constu 4, DW_OP_minus, DW_OP_deref] $fp
47	.loc	0 4 3                   // /tmp/dbg.c:4:3
48	bl	_Z3usePi
49.Ltmp2:
50	.loc	0 5 1                   // /tmp/dbg.c:5:1
51	ldp	x29, x30, [sp, #16]     // 16-byte Folded Reload
52	add	sp, sp, #32             // =32
53	ret
54.Ltmp3:
55.Lfunc_end0:
56	.size	_Z1fv, .Lfunc_end0-_Z1fv
57	.cfi_endproc
58                                        // -- End function
59	.section	.debug_str_offsets,"",@progbits
60	.word	40
61	.hword	5
62	.hword	0
63.Lstr_offsets_base0:
64	.section	.debug_str,"MS",@progbits,1
65.Linfo_string0:
66	.asciz	"clang version 10.0.0 (git@github.com:llvm/llvm-project.git 0a094679914ccea0f9c8f03165132172544d9799)" // string offset=0
67.Linfo_string1:
68	.asciz	"/tmp/dbg.c"            // string offset=101
69.Linfo_string2:
70	.asciz	"/code/build-llvm-cmake" // string offset=112
71.Linfo_string3:
72	.asciz	"_Z3usePi"              // string offset=135
73.Linfo_string4:
74	.asciz	"use"                   // string offset=144
75.Linfo_string5:
76	.asciz	"int"                   // string offset=148
77.Linfo_string6:
78	.asciz	"_Z1fv"                 // string offset=152
79.Linfo_string7:
80	.asciz	"f"                     // string offset=158
81.Linfo_string8:
82	.asciz	"x"                     // string offset=160
83	.section	.debug_str_offsets,"",@progbits
84	.word	.Linfo_string0
85	.word	.Linfo_string1
86	.word	.Linfo_string2
87	.word	.Linfo_string3
88	.word	.Linfo_string4
89	.word	.Linfo_string5
90	.word	.Linfo_string6
91	.word	.Linfo_string7
92	.word	.Linfo_string8
93	.section	.debug_loclists,"",@progbits
94	.word	.Ldebug_loclist_table_end0-.Ldebug_loclist_table_start0 // Length
95.Ldebug_loclist_table_start0:
96	.hword	5                       // Version
97	.byte	8                       // Address size
98	.byte	0                       // Segment selector size
99	.word	1                       // Offset entry count
100.Lloclists_table_base0:
101	.word	.Ldebug_loc0-.Lloclists_table_base0
102.Ldebug_loc0:
103	.byte	4                       // DW_LLE_offset_pair
104	.uleb128 .Ltmp0-.Lfunc_begin0   //   starting offset
105	.uleb128 .Ltmp1-.Lfunc_begin0   //   ending offset
106	.byte	3                       // Loc expr size
107	.byte	17                      // DW_OP_consts
108	.byte	1                       // 1
109	.byte	159                     // DW_OP_stack_value
110	.byte	4                       // DW_LLE_offset_pair
111	.uleb128 .Ltmp1-.Lfunc_begin0   //   starting offset
112	.uleb128 .Lfunc_end0-.Lfunc_begin0 //   ending offset
113	.byte	2                       // Loc expr size
114	.byte	141                     // DW_OP_breg29
115	.byte	124                     // -4
116	.byte	0                       // DW_LLE_end_of_list
117.Ldebug_loclist_table_end0:
118	.section	.debug_abbrev,"",@progbits
119	.byte	1                       // Abbreviation Code
120	.byte	17                      // DW_TAG_compile_unit
121	.byte	1                       // DW_CHILDREN_yes
122	.byte	37                      // DW_AT_producer
123	.byte	37                      // DW_FORM_strx1
124	.byte	19                      // DW_AT_language
125	.byte	5                       // DW_FORM_data2
126	.byte	3                       // DW_AT_name
127	.byte	37                      // DW_FORM_strx1
128	.byte	114                     // DW_AT_str_offsets_base
129	.byte	23                      // DW_FORM_sec_offset
130	.byte	16                      // DW_AT_stmt_list
131	.byte	23                      // DW_FORM_sec_offset
132	.byte	27                      // DW_AT_comp_dir
133	.byte	37                      // DW_FORM_strx1
134	.byte	17                      // DW_AT_low_pc
135	.byte	27                      // DW_FORM_addrx
136	.byte	18                      // DW_AT_high_pc
137	.byte	6                       // DW_FORM_data4
138	.byte	115                     // DW_AT_addr_base
139	.byte	23                      // DW_FORM_sec_offset
140	.ascii	"\214\001"              // DW_AT_loclists_base
141	.byte	23                      // DW_FORM_sec_offset
142	.byte	0                       // EOM(1)
143	.byte	0                       // EOM(2)
144	.byte	2                       // Abbreviation Code
145	.byte	46                      // DW_TAG_subprogram
146	.byte	1                       // DW_CHILDREN_yes
147	.byte	110                     // DW_AT_linkage_name
148	.byte	37                      // DW_FORM_strx1
149	.byte	3                       // DW_AT_name
150	.byte	37                      // DW_FORM_strx1
151	.byte	58                      // DW_AT_decl_file
152	.byte	11                      // DW_FORM_data1
153	.byte	59                      // DW_AT_decl_line
154	.byte	11                      // DW_FORM_data1
155	.byte	60                      // DW_AT_declaration
156	.byte	25                      // DW_FORM_flag_present
157	.byte	63                      // DW_AT_external
158	.byte	25                      // DW_FORM_flag_present
159	.byte	0                       // EOM(1)
160	.byte	0                       // EOM(2)
161	.byte	3                       // Abbreviation Code
162	.byte	5                       // DW_TAG_formal_parameter
163	.byte	0                       // DW_CHILDREN_no
164	.byte	73                      // DW_AT_type
165	.byte	19                      // DW_FORM_ref4
166	.byte	0                       // EOM(1)
167	.byte	0                       // EOM(2)
168	.byte	4                       // Abbreviation Code
169	.byte	15                      // DW_TAG_pointer_type
170	.byte	0                       // DW_CHILDREN_no
171	.byte	73                      // DW_AT_type
172	.byte	19                      // DW_FORM_ref4
173	.byte	0                       // EOM(1)
174	.byte	0                       // EOM(2)
175	.byte	5                       // Abbreviation Code
176	.byte	36                      // DW_TAG_base_type
177	.byte	0                       // DW_CHILDREN_no
178	.byte	3                       // DW_AT_name
179	.byte	37                      // DW_FORM_strx1
180	.byte	62                      // DW_AT_encoding
181	.byte	11                      // DW_FORM_data1
182	.byte	11                      // DW_AT_byte_size
183	.byte	11                      // DW_FORM_data1
184	.byte	0                       // EOM(1)
185	.byte	0                       // EOM(2)
186	.byte	6                       // Abbreviation Code
187	.byte	46                      // DW_TAG_subprogram
188	.byte	1                       // DW_CHILDREN_yes
189	.byte	17                      // DW_AT_low_pc
190	.byte	27                      // DW_FORM_addrx
191	.byte	18                      // DW_AT_high_pc
192	.byte	6                       // DW_FORM_data4
193	.byte	64                      // DW_AT_frame_base
194	.byte	24                      // DW_FORM_exprloc
195	.byte	122                     // DW_AT_call_all_calls
196	.byte	25                      // DW_FORM_flag_present
197	.byte	110                     // DW_AT_linkage_name
198	.byte	37                      // DW_FORM_strx1
199	.byte	3                       // DW_AT_name
200	.byte	37                      // DW_FORM_strx1
201	.byte	58                      // DW_AT_decl_file
202	.byte	11                      // DW_FORM_data1
203	.byte	59                      // DW_AT_decl_line
204	.byte	11                      // DW_FORM_data1
205	.byte	63                      // DW_AT_external
206	.byte	25                      // DW_FORM_flag_present
207	.byte	0                       // EOM(1)
208	.byte	0                       // EOM(2)
209	.byte	7                       // Abbreviation Code
210	.byte	52                      // DW_TAG_variable
211	.byte	0                       // DW_CHILDREN_no
212	.byte	2                       // DW_AT_location
213	.byte	34                      // DW_FORM_loclistx
214	.byte	3                       // DW_AT_name
215	.byte	37                      // DW_FORM_strx1
216	.byte	58                      // DW_AT_decl_file
217	.byte	11                      // DW_FORM_data1
218	.byte	59                      // DW_AT_decl_line
219	.byte	11                      // DW_FORM_data1
220	.byte	73                      // DW_AT_type
221	.byte	19                      // DW_FORM_ref4
222	.byte	0                       // EOM(1)
223	.byte	0                       // EOM(2)
224	.byte	8                       // Abbreviation Code
225	.byte	72                      // DW_TAG_call_site
226	.byte	0                       // DW_CHILDREN_no
227	.byte	127                     // DW_AT_call_origin
228	.byte	19                      // DW_FORM_ref4
229	.byte	125                     // DW_AT_call_return_pc
230	.byte	1                       // DW_FORM_addr
231	.byte	0                       // EOM(1)
232	.byte	0                       // EOM(2)
233	.byte	0                       // EOM(3)
234	.section	.debug_info,"",@progbits
235.Lcu_begin0:
236	.word	.Ldebug_info_end0-.Ldebug_info_start0 // Length of Unit
237.Ldebug_info_start0:
238	.hword	5                       // DWARF version number
239	.byte	1                       // DWARF Unit Type
240	.byte	8                       // Address Size (in bytes)
241	.word	.debug_abbrev           // Offset Into Abbrev. Section
242	.byte	1                       // Abbrev [1] 0xc:0x53 DW_TAG_compile_unit
243	.byte	0                       // DW_AT_producer
244	.hword	33                      // DW_AT_language
245	.byte	1                       // DW_AT_name
246	.word	.Lstr_offsets_base0     // DW_AT_str_offsets_base
247	.word	.Lline_table_start0     // DW_AT_stmt_list
248	.byte	2                       // DW_AT_comp_dir
249	.byte	0                       // DW_AT_low_pc
250	.word	.Lfunc_end0-.Lfunc_begin0 // DW_AT_high_pc
251	.word	.Laddr_table_base0      // DW_AT_addr_base
252	.word	.Lloclists_table_base0  // DW_AT_loclists_base
253	.byte	2                       // Abbrev [2] 0x27:0xb DW_TAG_subprogram
254	.byte	3                       // DW_AT_linkage_name
255	.byte	4                       // DW_AT_name
256	.byte	0                       // DW_AT_decl_file
257	.byte	1                       // DW_AT_decl_line
258                                        // DW_AT_declaration
259                                        // DW_AT_external
260	.byte	3                       // Abbrev [3] 0x2c:0x5 DW_TAG_formal_parameter
261	.word	50                      // DW_AT_type
262	.byte	0                       // End Of Children Mark
263	.byte	4                       // Abbrev [4] 0x32:0x5 DW_TAG_pointer_type
264	.word	55                      // DW_AT_type
265	.byte	5                       // Abbrev [5] 0x37:0x4 DW_TAG_base_type
266	.byte	5                       // DW_AT_name
267	.byte	5                       // DW_AT_encoding
268	.byte	4                       // DW_AT_byte_size
269	.byte	6                       // Abbrev [6] 0x3b:0x23 DW_TAG_subprogram
270	.byte	0                       // DW_AT_low_pc
271	.word	.Lfunc_end0-.Lfunc_begin0 // DW_AT_high_pc
272	.byte	1                       // DW_AT_frame_base
273	.byte	109
274                                        // DW_AT_call_all_calls
275	.byte	6                       // DW_AT_linkage_name
276	.byte	7                       // DW_AT_name
277	.byte	0                       // DW_AT_decl_file
278	.byte	2                       // DW_AT_decl_line
279                                        // DW_AT_external
280	.byte	7                       // Abbrev [7] 0x47:0x9 DW_TAG_variable
281	.byte	0                       // DW_AT_location
282	.byte	8                       // DW_AT_name
283	.byte	0                       // DW_AT_decl_file
284	.byte	3                       // DW_AT_decl_line
285	.word	55                      // DW_AT_type
286	.byte	8                       // Abbrev [8] 0x50:0xd DW_TAG_call_site
287	.word	39                      // DW_AT_call_origin
288	.xword	.Ltmp2-.Lfunc_begin0    // DW_AT_call_return_pc
289	.byte	0                       // End Of Children Mark
290	.byte	0                       // End Of Children Mark
291.Ldebug_info_end0:
292	.section	.debug_addr,"",@progbits
293	.word	.Ldebug_addr_end0-.Ldebug_addr_start0 // Length of contribution
294.Ldebug_addr_start0:
295	.hword	5                       // DWARF version number
296	.byte	8                       // Address size
297	.byte	0                       // Segment selector size
298.Laddr_table_base0:
299	.xword	.Lfunc_begin0
300.Ldebug_addr_end0:
301	.ident	"clang version 10.0.0 (git@github.com:llvm/llvm-project.git 0a094679914ccea0f9c8f03165132172544d9799)"
302	.section	".note.GNU-stack","",@progbits
303	.addrsig
304	.section	.debug_line,"",@progbits
305.Lline_table_start0:
306