1 # REQUIRES: object-emission
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
14 # Totally made up debug map to test ODR uniquing
17 triple: 'x86_64-apple-darwin'
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 }
25 # Check that all our types are in the first CU.
27 # CHECK: TAG_compile_unit
28 # CHECK-NOT: {{DW_TAG|NULL}}
29 # CHECK: AT_name{{.*}}"odr1.cpp"
33 # CHECK: 0x[[S:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
34 # CHECK-NEXT: DW_AT_name{{.*}}"S"
36 # CHECK: 0x[[NESTED:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
37 # CHECK-NOT: {{DW_TAG|NULL}}
38 # CHECK: DW_AT_name{{.*}}"Nested"
40 # CHECK: DW_TAG_subprogram
41 # CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S4incrEv"
43 # CHECK: DW_TAG_subprogram
44 # CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S4incrEi"
46 # CHECK: DW_TAG_subprogram
47 # CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3fooEv"
51 # This is "class N::C"
53 # CHECK: DW_TAG_namespace
54 # CHECK-NEXT: DW_AT_name{{.*}}"N"
56 # CHECK: 0x[[NC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
57 # CHECK-NEXT: DW_AT_name{{.*}}"C"
60 # This is "class N::N::C"
62 # CHECK: DW_TAG_namespace
63 # CHECK-NEXT: DW_AT_name{{.*}}"N"
65 # CHECK: 0x[[NNC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
66 # CHECK-NEXT: DW_AT_name{{.*}}"C"
72 # CHECK: 0x[[ALIASFORS:[0-9a-f]*]]:{{.*}}DW_TAG_typedef
73 # CHECK-NEXT: DW_AT_type{{.*}}[[S]]
74 # CHECK-NEXT: DW_AT_name{{.*}}"AliasForS"
78 # CHECK: 0x[[U:[0-9a-f]*]]:{{.*}}DW_TAG_union_type
79 # CHECK-NEXT: DW_AT_name{{.*}}"U"
81 # CHECK: 0x[[UC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
83 # CHECK: 0x[[US:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
86 # This is "func" free function
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"
94 # This is "(anonymous namespace)::AnonC"
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"
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 }
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
111 # CHECK: TAG_compile_unit
112 # CHECK-NOT: {{DW_TAG|NULL}}
113 # CHECK: AT_name{{.*}}"odr1.cpp"
115 # ODR: DW_TAG_union_type
116 # ODR-NEXT: DW_AT_name{{.*}}"U"
117 # Types defined inside the union should be uniqued:
119 # ODR-NEXT: DW_AT_name{{.*}}"C"
120 # ODR-NOT: {{NULL|DW_TAG}}
121 # ODR: DW_AT_type{{.*}}[[UC]]
123 # ODR-NEXT: DW_AT_name{{.*}}"S"
124 # ODR-NOT: {{NULL|DW_TAG}}
125 # ODR: DW_AT_type{{.*}}[[US]]
128 # ODR: DW_TAG_subprogram
129 # ODR-NOT: {{NULL|DW_TAG}}
130 # ODR: DW_AT_name{{.*}}"func"
133 # ODR: DW_TAG_subprogram
134 # ODR-NOT: {{NULL|DW_TAG}}
135 # ODR: DW_AT_name{{.*}}"foo"
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]]
158 # ODR: DW_TAG_subprogram
159 # ODR-NOT: {{NULL|DW_TAG}}
160 # ODR: linkage_name{{.*}}"_ZZ4funcvENKUlvE_clEv"
162 # ODR: DW_TAG_variable
164 # ODR: DW_AT_name{{.*}}"dummy"
166 # ODR: DW_AT_type{{.*}}[[CINSIDEFUNC]]
168 # With no ODR uniquing, we should get copies of all the types:
171 # NOODR: 0x[[DUP_S:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
172 # NOODR-NEXT: DW_AT_name{{.*}}"S"
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"
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"
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"
193 # NOODR: 0x[[U:[0-9a-f]*]]:{{.*}}DW_TAG_union_type
194 # NOODR-NEXT: DW_AT_name{{.*}}"U"
196 # NOODR: 0x[[DUP_UC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
198 # NOODR: 0x[[DUP_US:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
201 # This is "func" free function
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"
209 # NOODR: DW_TAG_subprogram
210 # NOODR-NOT: {{NULL|DW_TAG}}
211 # NOODR: DW_AT_name{{.*}}"foo"
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]*]]
234 # This is the lanbda inside func
236 # NOODR: DW_TAG_subprogram
237 # NOODR-NOT: {{NULL|DW_TAG}}
238 # NOODR: linkage_name{{.*}}"_ZZ4funcvENKUlvE_clEv"
240 # NOODR: DW_TAG_variable
242 # NOODR: DW_AT_name{{.*}}"dummy"
244 # NOODR: DW_AT_type{{.*}}[[DUP_CINSIDEFUNC]]
246 # This is "(anonymous namespace)::AnonC"
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"
255 - { sym: __ZN1S3fooEv, objAddr: 0x0, binAddr: 0x7000, size: 0x12 }
256 - { sym: __Z3barv, objAddr: 0x0, binAddr: 0x8000, size: 0x12 }
259 - { sym: __ZN1S3fooEv, objAddr: 0x0, binAddr: 0x8000, size: 0x12 }
260 - { sym: __Z3barv, objAddr: 0x0, binAddr: 0x9000, size: 0x12 }
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.
265 # CHECK: TAG_compile_unit
266 # CHECK-NOT: {{DW_TAG|NULL}}
267 # CHECK: AT_name{{.*}}"odr2.cpp"
269 # NO-ODR: DW_TAG_structure_type
270 # ODR-NOT: DW_TAG_structure_type
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"
283 # ODR: DW_TAG_variable
284 # ODR-NOT: {{DW_TAG|NULL}}
285 # ODR: DW_AT_type{{.*}}[[S]]
287 # DOR: DW_TAG_inlined_subroutine
289 # ODR: DW_TAG_formal_parameter
290 # ODR-NOT {{NULL|DW_TAG}}
291 # ODR: DW_AT_type{{.*}}[[S_PTR]]
293 # CHECK: TAG_compile_unit
294 # CHECK-NOT: {{DW_TAG|NULL}}
295 # CHECK: AT_name{{.*}}"odr3.cpp"
297 # NO-ODR: DW_TAG_structure_type
298 # ODR-NOT: DW_TAG_structure_type
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"
311 # ODR: DW_TAG_variable
312 # ODR-NOT: {{DW_TAG|NULL}}
313 # ODR: DW_AT_type{{.*}}[[S]]
315 # DOR: DW_TAG_inlined_subroutine
317 # ODR: DW_TAG_formal_parameter
318 # ODR-NOT {{NULL|DW_TAG}}
319 # ODR: DW_AT_type{{.*}}[[S_PTR2]]
323 - { sym: __Z3bazv, objAddr: 0x0, binAddr: 0xa000, size: 0x12 }
325 # odr4.cpp helps check that anonymous namespaces with similarly named contents do
328 # CHECK: TAG_compile_unit
329 # CHECK-NOT: {{DW_TAG|NULL}}
330 # CHECK: AT_name{{.*}}"odr4.cpp"
332 # CHECK: DW_TAG_subprogram
334 # CHECK: DW_TAG_variable
336 # ODR: DW_AT_type{{.*}}[[LOCALANONC:........]])
337 # NOODR: DW_AT_type{{.*}}[[LOCALANONC:........]]})
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"
347 - { sym: __Z3bazv, objAddr: 0x0, binAddr: 0xb000, size: 0x12 }
348 - { sym: __ZN1S6Nested4initIiEEvT_, objAddr: 0x0, binAddr: 0xc000, size: 0x12 }
351 - { sym: __Z3bazv, objAddr: 0x0, binAddr: 0xd000, size: 0x12 }
352 - { sym: __ZN1S6Nested4initIdEEvT_, objAddr: 0x0, binAddr: 0xe000, size: 0x12 }
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.
360 # CHECK: TAG_compile_unit
361 # CHECK-NOT: {{DW_TAG|NULL}}
362 # CHECK: AT_name{{.*}}"odr5.cpp"
364 # CHECK: 0x{{[0-9a-f]*}}:{{.*}}DW_TAG_structure_type
365 # CHECK-NEXT: DW_AT_name{{.*}}"S"
367 # CHECK: 0x[[NESTED2:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
368 # CHECK-NOT: {{DW_TAG|NULL}}
369 # CHECK: DW_AT_name{{.*}}"Nested"
371 # CHECK: 0x[[INITTEMPLATE:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
372 # CHECK-NEXT:{{.*}}"_ZN1S6Nested4init
374 # CHECK: DW_AT_specification{{.*}}[[INITTEMPLATE]]
375 # CHECK: DW_TAG_formal_parameter
377 # CHECK: DW_AT_type{{.*}}[[NESTED_PTR:[0-9a-f]{8}]]{{[}]?}})
379 # CHECK: 0x[[NESTED_PTR]]{{.*}}DW_TAG_pointer_type
380 # ODR-NEXT: DW_AT_type{{.*}}[[NESTED]]
381 # NOODR-NEXT: DW_AT_type{{.*}}[[NESTED2]]
383 # CHECK: TAG_compile_unit
384 # CHECK-NOT: {{DW_TAG|NULL}}
385 # CHECK: AT_name{{.*}}"odr6.cpp"
387 # CHECK: 0x{{[0-9a-f]*}}:{{.*}}DW_TAG_structure_type
388 # CHECK-NEXT: DW_AT_name{{.*}}"S"
390 # CHECK: 0x[[NESTED3:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
391 # CHECK-NOT: {{DW_TAG|NULL}}
392 # CHECK: DW_AT_name{{.*}}"Nested"
394 # CHECK: 0x[[INITTEMPLATE2:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
395 # CHECK-NEXT:{{.*}}"_ZN1S6Nested4init
397 # CHECK: DW_AT_specification{{.*}}[[INITTEMPLATE2]]
398 # CHECK: DW_TAG_formal_parameter
400 # CHECK: DW_AT_type{{.*}}[[NESTED_PTR2:[0-9a-f]{8}]]{{[}]?}})
402 # CHECK: 0x[[NESTED_PTR2]]{{.*}}DW_TAG_pointer_type
403 # ODR-NEXT: DW_AT_type{{.*}}[[NESTED]]
404 # NOODR-NEXT: DW_AT_type{{.*}}[[NESTED3]]
408 - { sym: __Z3foov, objAddr: 0x0, binAddr: 0xf000, size: 0x12 }
410 # Check that a reference to a nested class correctly refers to the original
413 # CHECK: TAG_compile_unit
414 # CHECK-NOT: {{DW_TAG|NULL}}
415 # CHECK: AT_name{{.*}}"odr7.cpp"
417 # ODR: DW_TAG_subprogram
419 # ODR: DW_TAG_variable
421 # ODR: DW_AT_type{{.*}}[[NESTED]]