f39c5cef1221daf609a9954335c56f41089438a9
[oota-llvm.git] / test / tools / dsymutil / X86 / odr-1.test
1 # REQUIRES: object-emission
2 # RUN: rm -rf %t
3 # RUN: mkdir -p %t
4 # RUN: llc -filetype=obj %p/../Inputs/odr1.ll -o %t/odr1.o
5 # RUN: llc -filetype=obj %p/../Inputs/odr2.ll -o %t/odr2.o
6 # RUN: llc -filetype=obj %p/../Inputs/odr3.ll -o %t/odr3.o
7 # RUN: llc -filetype=obj %p/../Inputs/odr4.ll -o %t/odr4.o
8 # RUN: llc -filetype=obj %p/../Inputs/odr5.ll -o %t/odr5.o
9 # RUN: llc -filetype=obj %p/../Inputs/odr6.ll -o %t/odr6.o
10 # RUN: llc -filetype=obj %p/../Inputs/odr7.ll -o %t/odr7.o
11 # RUN: llvm-dsymutil -f -oso-prepend-path=%t -y %s -o - | llvm-dwarfdump -debug-dump=info - | FileCheck -check-prefix=ODR -check-prefix=CHECK %s
12 # RUN: llvm-dsymutil -f -oso-prepend-path=%t -y %s -no-odr -o - | llvm-dwarfdump -debug-dump=info - | FileCheck -check-prefix=NOODR -check-prefix=CHECK %s
13
14 # Totally made up debug map to test ODR uniquing
15
16 ---
17 triple:          'x86_64-apple-darwin'
18 objects:
19   - filename: odr1.o
20     symbols:
21       - { sym: __Z3foov, objAddr: 0x0, binAddr: 0x1000, size: 0x12 }
22       - { sym: __Z4funcv, objAddr: 0x0, binAddr: 0x2000, size: 0x12 }
23       - { sym: __ZZ4funcvENKUlvE_clEv,  objAddr: 0x0, binAddr: 0x3000, size: 0x12 }
24
25 # Check that all our types are in the first CU.
26
27 # CHECK: TAG_compile_unit
28 # CHECK-NOT: {{DW_TAG|NULL}}
29 # CHECK: AT_name{{.*}}"odr1.cpp"
30
31 # This is "struct S"
32
33 # CHECK: 0x[[S:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
34 # CHECK-NEXT: DW_AT_name{{.*}}"S"
35 # CHECK-NOT: NULL
36 # CHECK: 0x[[NESTED:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
37 # CHECK-NOT: {{DW_TAG|NULL}}
38 # CHECK: DW_AT_name{{.*}}"Nested"
39 # CHECK: NULL
40 # CHECK: DW_TAG_subprogram
41 # CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S4incrEv"
42 # CHECK: NULL
43 # CHECK: DW_TAG_subprogram
44 # CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S4incrEi"
45 # CHECK: NULL
46 # CHECK: DW_TAG_subprogram
47 # CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3fooEv"
48 # CHECK: NULL
49 # CHECK: NULL
50
51 # This is "class N::C"
52
53 # CHECK: DW_TAG_namespace
54 # CHECK-NEXT: DW_AT_name{{.*}}"N"
55 # CHECK-NOT: NULL
56 # CHECK: 0x[[NC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
57 # CHECK-NEXT: DW_AT_name{{.*}}"C"
58 # CHECK: NULL
59
60 # This is "class N::N::C"
61
62 # CHECK: DW_TAG_namespace
63 # CHECK-NEXT: DW_AT_name{{.*}}"N"
64 # CHECK-NOT: NULL
65 # CHECK: 0x[[NNC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
66 # CHECK-NEXT: DW_AT_name{{.*}}"C"
67 # CHECK: NULL
68 # CHECK: NULL
69 # CHECK: NULL
70
71 # This is "AliasForS"
72 # CHECK: 0x[[ALIASFORS:[0-9a-f]*]]:{{.*}}DW_TAG_typedef
73 # CHECK-NEXT: DW_AT_type{{.*}}[[S]]
74 # CHECK-NEXT: DW_AT_name{{.*}}"AliasForS"
75
76 # This is "union U"
77
78 # CHECK:  0x[[U:[0-9a-f]*]]:{{.*}}DW_TAG_union_type
79 # CHECK-NEXT: DW_AT_name{{.*}}"U"
80 # CHECK-NOT: NULL
81 # CHECK:  0x[[UC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
82 # CHECK-NOT: NULL
83 # CHECK:  0x[[US:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
84 # CHECK: NULL
85
86 # This is "func" free function
87
88 # CHECK: DW_TAG_subprogram
89 # CHECK-NOT: {{DW_TAG|NULL}}
90 # CHECK: DW_AT_name{{.*}}"func"
91 # CHECK: 0x[[CINSIDEFUNC:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
92 # CHECK-NEXT: DW_AT_name{{.*}}"CInsideFunc"
93
94 # This is "(anonymous namespace)::AnonC"
95
96 # CHECK: DW_TAG_namespace
97 # CHECK-NOT: {{DW_AT_name|NULL|DW_TAG}}
98 # CHECK: 0x[[ANONC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
99 # CHECK-NEXT: DW_AT_name{{.*}}"AnonC"
100
101   - filename: odr1.o
102     symbols:
103       - { sym: __Z3foov, objAddr: 0x0, binAddr: 0x4000, size: 0x12 }
104       - { sym: __Z4funcv, objAddr: 0x0, binAddr: 0x5000, size: 0x12 }
105       - { sym: __ZZ4funcvENKUlvE_clEv,  objAddr: 0x0, binAddr: 0x6000, size: 0x12 }
106
107 # We relink the same file a second time. In the ODR case, everything (except for the
108 # union for now) should be uniqued. In the non-ODR case, we should get every type
109 # duplicated.
110
111 # CHECK: TAG_compile_unit
112 # CHECK-NOT: {{DW_TAG|NULL}}
113 # CHECK: AT_name{{.*}}"odr1.cpp"
114
115 # ODR: DW_TAG_union_type
116 # ODR-NEXT: DW_AT_name{{.*}}"U"
117 # Types defined inside the union should be uniqued:
118 # ODR: DW_TAG_member
119 # ODR-NEXT: DW_AT_name{{.*}}"C"
120 # ODR-NOT: {{NULL|DW_TAG}}
121 # ODR: DW_AT_type{{.*}}[[UC]]
122 # ODR: DW_TAG_member
123 # ODR-NEXT: DW_AT_name{{.*}}"S"
124 # ODR-NOT: {{NULL|DW_TAG}}
125 # ODR: DW_AT_type{{.*}}[[US]]
126
127 # Skip func
128 # ODR: DW_TAG_subprogram
129 # ODR-NOT: {{NULL|DW_TAG}}
130 # ODR: DW_AT_name{{.*}}"func"
131 # ODR: NULL
132
133 # ODR: DW_TAG_subprogram
134 # ODR-NOT: {{NULL|DW_TAG}}
135 # ODR: DW_AT_name{{.*}}"foo"
136 # ODR-NOT: NULL
137 # ODR: DW_TAG_variable
138 # ODR-NOT: {{DW_TAG|NULL}}
139 # ODR: DW_AT_name{{.*}}"s"
140 # ODR-NOT: {{DW_TAG|NULL}}
141 # ODR: DW_AT_type{{.*}}[[ALIASFORS]]
142 # ODR: DW_TAG_variable
143 # ODR-NOT: {{DW_TAG|NULL}}
144 # ODR: DW_AT_name{{.*}}"nc"
145 # ODR-NOT: {{DW_TAG|NULL}}
146 # ODR: DW_AT_type{{.*}}[[NC]]
147 # ODR: DW_TAG_variable
148 # ODR-NOT: {{DW_TAG|NULL}}
149 # ODR: DW_AT_name{{.*}}"nnc"
150 # ODR-NOT: {{DW_TAG|NULL}}
151 # ODR: DW_AT_type{{.*}}[[NNC]]
152 # ODR: DW_TAG_variable
153 # ODR-NOT: {{DW_TAG|NULL}}
154 # ODR: DW_AT_name{{.*}}"ac"
155 # ODR-NOT: {{DW_TAG|NULL}}
156 # ODR: DW_AT_type{{.*}}[[ANONC]]
157
158 # ODR: DW_TAG_subprogram
159 # ODR-NOT: {{NULL|DW_TAG}}
160 # ODR: linkage_name{{.*}}"_ZZ4funcvENKUlvE_clEv"
161 # ODR-NOT: NULL
162 # ODR: DW_TAG_variable
163 # ODR-NOT: DW_TAG
164 # ODR: DW_AT_name{{.*}}"dummy"
165 # ODR-NOT: NULL
166 # ODR: DW_AT_type{{.*}}[[CINSIDEFUNC]]
167
168 # With no ODR uniquing, we should get copies of all the types:
169
170 # This is "struct S"
171 # NOODR: 0x[[DUP_S:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
172 # NOODR-NEXT: DW_AT_name{{.*}}"S"
173
174 # This is "class N::C"
175 # NOODR: DW_TAG_namespace
176 # NOODR-NEXT: DW_AT_name{{.*}}"N"
177 # NOODR: 0x[[DUP_NC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
178 # NOODR-NEXT: DW_AT_name{{.*}}"C"
179
180 # This is "class N::N::C"
181 # NOODR: DW_TAG_namespace
182 # NOODR-NEXT: DW_AT_name{{.*}}"N"
183 # NOODR: 0x[[DUP_NNC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
184 # NOODR-NEXT: DW_AT_name{{.*}}"C"
185
186 # This is "AliasForS"
187 # NOODR: 0x[[DUP_ALIASFORS:[0-9a-f]*]]:{{.*}}DW_TAG_typedef
188 # NOODR-NOT: {{NULL|DW_TAG}}
189 # NOODR: DW_AT_name{{.*}}"AliasForS"
190
191 # This is "union U"
192
193 # NOODR:  0x[[U:[0-9a-f]*]]:{{.*}}DW_TAG_union_type
194 # NOODR-NEXT: DW_AT_name{{.*}}"U"
195 # NOODR-NOT: NULL
196 # NOODR:  0x[[DUP_UC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
197 # NOODR-NOT: NULL
198 # NOODR:  0x[[DUP_US:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
199 # NOODR: NULL
200
201 # This is "func" free function
202
203 # NOODR: DW_TAG_subprogram
204 # NOODR-NOT: {{DW_TAG|NULL}}
205 # NOODR: DW_AT_name{{.*}}"func"
206 # NOODR: 0x[[DUP_CINSIDEFUNC:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
207 # NOODR-NEXT: DW_AT_name{{.*}}"CInsideFunc"
208
209 # NOODR: DW_TAG_subprogram
210 # NOODR-NOT: {{NULL|DW_TAG}}
211 # NOODR: DW_AT_name{{.*}}"foo"
212 # NOODR-NOT: NULL
213 # NOODR: DW_TAG_variable
214 # NOODR-NOT: {{DW_TAG|NULL}}
215 # NOODR: DW_AT_name{{.*}}"s"
216 # NOODR-NOT: {{DW_TAG|NULL}}
217 # NOODR: DW_AT_type{{.*}}[[DUP_ALIASFORS]]
218 # NOODR: DW_TAG_variable
219 # NOODR-NOT: {{DW_TAG|NULL}}
220 # NOODR: DW_AT_name{{.*}}"nc"
221 # NOODR-NOT: {{DW_TAG|NULL}}
222 # NOODR: DW_AT_type{{.*}}[[DUP_NC]]
223 # NOODR: DW_TAG_variable
224 # NOODR-NOT: {{DW_TAG|NULL}}
225 # NOODR: DW_AT_name{{.*}}"nnc"
226 # NOODR-NOT: {{DW_TAG|NULL}}
227 # NOODR: DW_AT_type{{.*}}[[DUP_NNC]]
228 # NOODR: DW_TAG_variable
229 # NOODR-NOT: {{DW_TAG|NULL}}
230 # NOODR: DW_AT_name{{.*}}"ac"
231 # NOODR-NOT: {{DW_TAG|NULL}}
232 # NOODR: DW_AT_type{{.*}}0x[[DUP_ANONC:[0-9a-f]*]]
233
234 # This is the lanbda inside func
235
236 # NOODR: DW_TAG_subprogram
237 # NOODR-NOT: {{NULL|DW_TAG}}
238 # NOODR: linkage_name{{.*}}"_ZZ4funcvENKUlvE_clEv"
239 # NOODR-NOT: NULL
240 # NOODR: DW_TAG_variable
241 # NOODR-NOT: DW_TAG
242 # NOODR: DW_AT_name{{.*}}"dummy"
243 # NOODR-NOT: NULL
244 # NOODR: DW_AT_type{{.*}}[[DUP_CINSIDEFUNC]]
245
246 # This is "(anonymous namespace)::AnonC"
247
248 # NOODR: DW_TAG_namespace
249 # NOODR-NOT: {{DW_AT_name|NULL|DW_TAG}}
250 # NOODR: 0x[[DUP_ANONC]]:{{.*}}DW_TAG_class_type
251 # NOODR-NEXT: DW_AT_name{{.*}}"AnonC"
252
253   - filename: odr2.o
254     symbols:
255       - { sym: __ZN1S3fooEv, objAddr: 0x0, binAddr: 0x7000, size: 0x12 }
256       - { sym: __Z3barv, objAddr: 0x0, binAddr: 0x8000, size: 0x12 }
257   - filename: odr3.o
258     symbols:
259       - { sym: __ZN1S3fooEv, objAddr: 0x0, binAddr: 0x8000, size: 0x12 }
260       - { sym: __Z3barv, objAddr: 0x0, binAddr: 0x9000, size: 0x12 }
261
262 # odr2.cpp and odr3.cpp test that a simple overloaded function doesn't break the
263 # uniquing (contrary to what we'll see with template/artificial) functions. 
264
265 # CHECK: TAG_compile_unit
266 # CHECK-NOT: {{DW_TAG|NULL}}
267 # CHECK: AT_name{{.*}}"odr2.cpp"
268
269 # NO-ODR: DW_TAG_structure_type
270 # ODR-NOT: DW_TAG_structure_type
271
272 # ODR: DW_TAG_subprogram
273 # ODR: DW_AT_specification{{.*}}4incr
274 # ODR: DW_TAG_formal_parameter
275 # ODR-NEXT: DW_AT_name{{.*}}"this"
276 # ODR-NEXT: DW_AT_type{{.*}}0x00000000[[S_PTR:[0-9a-f]*]]
277 # ODR: 0x[[S_PTR]]:{{.*}}DW_TAG_pointer_type
278 # ODR-NEXT: DW_AT_type{{.*}}[[S]]
279 # ODR: DW_TAG_subprogram
280 # ODR-NOT: {{DW_TAG|NULL}}
281 # ODR: DW_AT_name{{.*}}"bar"
282 # ODR-NOT: NULL
283 # ODR: DW_TAG_variable
284 # ODR-NOT: {{DW_TAG|NULL}}
285 # ODR: DW_AT_type{{.*}}[[S]]
286 # ODR-NOT NULL
287 # DOR: DW_TAG_inlined_subroutine
288 # ODR-NOT NULL
289 # ODR: DW_TAG_formal_parameter
290 # ODR-NOT {{NULL|DW_TAG}}
291 # ODR: DW_AT_type{{.*}}[[S_PTR]]
292
293 # CHECK: TAG_compile_unit
294 # CHECK-NOT: {{DW_TAG|NULL}}
295 # CHECK: AT_name{{.*}}"odr3.cpp"
296
297 # NO-ODR: DW_TAG_structure_type
298 # ODR-NOT: DW_TAG_structure_type
299
300 # ODR: DW_TAG_subprogram
301 # ODR: DW_AT_specification{{.*}}4incr
302 # ODR: DW_TAG_formal_parameter
303 # ODR-NEXT: DW_AT_name{{.*}}"this"
304 # ODR-NEXT: DW_AT_type{{.*}}0x00000000[[S_PTR2:[0-9a-f]*]]
305 # ODR: 0x[[S_PTR2]]:{{.*}}DW_TAG_pointer_type
306 # ODR-NEXT: DW_AT_type{{.*}}[[S]]
307 # ODR: DW_TAG_subprogram
308 # ODR-NOT: {{DW_TAG|NULL}}
309 # ODR: DW_AT_name{{.*}}"bar"
310 # ODR-NOT: NULL
311 # ODR: DW_TAG_variable
312 # ODR-NOT: {{DW_TAG|NULL}}
313 # ODR: DW_AT_type{{.*}}[[S]]
314 # ODR-NOT NULL
315 # DOR: DW_TAG_inlined_subroutine
316 # ODR-NOT NULL
317 # ODR: DW_TAG_formal_parameter
318 # ODR-NOT {{NULL|DW_TAG}}
319 # ODR: DW_AT_type{{.*}}[[S_PTR2]]
320
321   - filename: odr4.o
322     symbols:
323       - { sym: __Z3bazv, objAddr: 0x0, binAddr: 0xa000, size: 0x12 }
324
325 # odr4.cpp helps check that anonymous namespaces with similarly named contents do
326 # not get uniqued.
327
328 # CHECK: TAG_compile_unit
329 # CHECK-NOT: {{DW_TAG|NULL}}
330 # CHECK: AT_name{{.*}}"odr4.cpp"
331
332 # CHECK: DW_TAG_subprogram
333 # CHECK-NOT: NULL
334 # CHECK: DW_TAG_variable
335 # CHECK-NOT: DW_TAG
336 # ODR: DW_AT_type{{.*}}[[LOCALANONC:........]])
337 # NOODR: DW_AT_type{{.*}}[[LOCALANONC:........]]})
338
339 # CHECK: DW_TAG_namespace
340 # CHECK-NOT: DW_AT_name
341 # CHECK: [[LOCALANONC]]{{.*}}DW_TAG_class_type
342 # CHECK-NOT: {{NULL|DW_TAG}}
343 # CHECK: DW_AT_name{{.*}}"AnonC"
344
345   - filename: odr5.o
346     symbols:
347       - { sym: __Z3bazv, objAddr: 0x0, binAddr: 0xb000, size: 0x12 }
348       - { sym: __ZN1S6Nested4initIiEEvT_, objAddr: 0x0, binAddr: 0xc000, size: 0x12 }
349   - filename: odr6.o
350     symbols:
351       - { sym: __Z3bazv, objAddr: 0x0, binAddr: 0xd000, size: 0x12 }
352       - { sym: __ZN1S6Nested4initIdEEvT_, objAddr: 0x0, binAddr: 0xe000, size: 0x12 }
353
354 # odr5.cpp and odr6.cpp instanciate a template member function of the S class.
355 # They instanciate it with different types. As DWARF only describes the actual
356 # intances, these members aren't described in the uniqued class definition of
357 # odr1.cpp. Both these files should contain a new copy of S' definition with
358 # the template instance included.
359
360 # CHECK: TAG_compile_unit
361 # CHECK-NOT: {{DW_TAG|NULL}}
362 # CHECK: AT_name{{.*}}"odr5.cpp"
363
364 # CHECK: 0x{{[0-9a-f]*}}:{{.*}}DW_TAG_structure_type
365 # CHECK-NEXT: DW_AT_name{{.*}}"S"
366 # CHECK-NOT: NULL
367 # CHECK: 0x[[NESTED2:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
368 # CHECK-NOT: {{DW_TAG|NULL}}
369 # CHECK: DW_AT_name{{.*}}"Nested"
370 # CHECK-NOT: NULL
371 # CHECK: 0x[[INITTEMPLATE:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
372 # CHECK-NEXT:{{.*}}"_ZN1S6Nested4init
373
374 # CHECK: DW_AT_specification{{.*}}[[INITTEMPLATE]]
375 # CHECK: DW_TAG_formal_parameter
376 # CHECK-NOT: DW_TAG
377 # CHECK: DW_AT_type{{.*}}[[NESTED_PTR:[0-9a-f]{8}]]{{[}]?}})
378
379 # CHECK: 0x[[NESTED_PTR]]{{.*}}DW_TAG_pointer_type
380 # ODR-NEXT: DW_AT_type{{.*}}[[NESTED]]
381 # NOODR-NEXT: DW_AT_type{{.*}}[[NESTED2]]
382
383 # CHECK: TAG_compile_unit
384 # CHECK-NOT: {{DW_TAG|NULL}}
385 # CHECK: AT_name{{.*}}"odr6.cpp"
386
387 # CHECK: 0x{{[0-9a-f]*}}:{{.*}}DW_TAG_structure_type
388 # CHECK-NEXT: DW_AT_name{{.*}}"S"
389 # CHECK-NOT: NULL
390 # CHECK: 0x[[NESTED3:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
391 # CHECK-NOT: {{DW_TAG|NULL}}
392 # CHECK: DW_AT_name{{.*}}"Nested"
393 # CHECK-NOT: NULL
394 # CHECK: 0x[[INITTEMPLATE2:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
395 # CHECK-NEXT:{{.*}}"_ZN1S6Nested4init
396
397 # CHECK: DW_AT_specification{{.*}}[[INITTEMPLATE2]]
398 # CHECK: DW_TAG_formal_parameter
399 # CHECK-NOT: DW_TAG
400 # CHECK: DW_AT_type{{.*}}[[NESTED_PTR2:[0-9a-f]{8}]]{{[}]?}})
401
402 # CHECK: 0x[[NESTED_PTR2]]{{.*}}DW_TAG_pointer_type
403 # ODR-NEXT: DW_AT_type{{.*}}[[NESTED]]
404 # NOODR-NEXT: DW_AT_type{{.*}}[[NESTED3]]
405
406   - filename: odr7.o
407     symbols:
408       - { sym: __Z3foov, objAddr: 0x0, binAddr: 0xf000, size: 0x12 }
409
410 # Check that a reference to a nested class correctly refers to the original
411 # definition
412
413 # CHECK: TAG_compile_unit
414 # CHECK-NOT: {{DW_TAG|NULL}}
415 # CHECK: AT_name{{.*}}"odr7.cpp"
416
417 # ODR: DW_TAG_subprogram
418 # ODR-NOT: NULL
419 # ODR: DW_TAG_variable
420 # ODR-NOT: DW_TAG
421 # ODR: DW_AT_type{{.*}}[[NESTED]]
422 ...
423