1*9880d681SAndroid Build Coastguard Worker /* Compile with:
2*9880d681SAndroid Build Coastguard Worker clang -g -c odr-uniquing.cpp -o odr-uniquing/1.o
3*9880d681SAndroid Build Coastguard Worker cp odr-uniquing/1.o odr-uniquing/2.o
4*9880d681SAndroid Build Coastguard Worker The aim of these test is to check that all the 'type types' that
5*9880d681SAndroid Build Coastguard Worker should be uniqued through the ODR really are.
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker The resulting object file is linked against itself using a fake
8*9880d681SAndroid Build Coastguard Worker debug map. The end result is:
9*9880d681SAndroid Build Coastguard Worker - with ODR uniquing: all types (expect for the union for now) in
10*9880d681SAndroid Build Coastguard Worker the second CU should point back to the types of the first CU.
11*9880d681SAndroid Build Coastguard Worker - without ODR uniquing: all types are re-emited in the second CU
12*9880d681SAndroid Build Coastguard Worker */
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker // RUN: llvm-dsymutil -f -oso-prepend-path=%p/../Inputs/odr-uniquing -y %p/dummy-debug-map.map -o - | llvm-dwarfdump -debug-dump=info - | FileCheck -check-prefix=ODR -check-prefix=CHECK %s
15*9880d681SAndroid Build Coastguard Worker // RUN: llvm-dsymutil -f -oso-prepend-path=%p/../Inputs/odr-uniquing -y %p/dummy-debug-map.map -no-odr -o - | llvm-dwarfdump -debug-dump=info - | FileCheck -check-prefix=NOODR -check-prefix=CHECK %s
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker // The first compile unit contains all the types:
18*9880d681SAndroid Build Coastguard Worker // CHECK: TAG_compile_unit
19*9880d681SAndroid Build Coastguard Worker // CHECK-NOT: DW_TAG
20*9880d681SAndroid Build Coastguard Worker // CHECK: AT_name{{.*}}"odr-uniquing.cpp"
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker struct S {
23*9880d681SAndroid Build Coastguard Worker struct Nested {};
24*9880d681SAndroid Build Coastguard Worker };
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker // CHECK: 0x[[S:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
27*9880d681SAndroid Build Coastguard Worker // CHECK-NEXT: DW_AT_name{{.*}}"S"
28*9880d681SAndroid Build Coastguard Worker // CHECK-NOT: NULL
29*9880d681SAndroid Build Coastguard Worker // CHECK: 0x[[NESTED:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
30*9880d681SAndroid Build Coastguard Worker // CHECK-NOT: DW_TAG
31*9880d681SAndroid Build Coastguard Worker // CHECK: DW_AT_name{{.*}}"Nested"
32*9880d681SAndroid Build Coastguard Worker // CHECK: NULL
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker namespace N {
35*9880d681SAndroid Build Coastguard Worker class C {};
36*9880d681SAndroid Build Coastguard Worker }
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker // CHECK: DW_TAG_namespace
39*9880d681SAndroid Build Coastguard Worker // CHECK-NEXT: DW_AT_name{{.*}}"N"
40*9880d681SAndroid Build Coastguard Worker // CHECK-NOT: NULL
41*9880d681SAndroid Build Coastguard Worker // CHECK: 0x[[NC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
42*9880d681SAndroid Build Coastguard Worker // CHECK-NEXT: DW_AT_name{{.*}}"C"
43*9880d681SAndroid Build Coastguard Worker // CHECK: NULL
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker union U {
46*9880d681SAndroid Build Coastguard Worker class C {} C;
47*9880d681SAndroid Build Coastguard Worker struct S {} S;
48*9880d681SAndroid Build Coastguard Worker };
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker // CHECK: 0x[[U:[0-9a-f]*]]:{{.*}}DW_TAG_union_type
51*9880d681SAndroid Build Coastguard Worker // CHECK-NEXT: DW_AT_name{{.*}}"U"
52*9880d681SAndroid Build Coastguard Worker // CHECK-NOT: NULL
53*9880d681SAndroid Build Coastguard Worker // CHECK: 0x[[UC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
54*9880d681SAndroid Build Coastguard Worker // CHECK-NOT: NULL
55*9880d681SAndroid Build Coastguard Worker // CHECK: 0x[[US:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
56*9880d681SAndroid Build Coastguard Worker // CHECK: NULL
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker typedef S AliasForS;
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker // CHECK: 0x[[ALIASFORS:[0-9a-f]*]]:{{.*}}DW_TAG_typedef
61*9880d681SAndroid Build Coastguard Worker // CHECK-NEXT: DW_AT_type{{.*}}[[S]]
62*9880d681SAndroid Build Coastguard Worker // CHECK-NEXT: DW_AT_name{{.*}}"AliasForS"
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker namespace {
65*9880d681SAndroid Build Coastguard Worker class AnonC {};
66*9880d681SAndroid Build Coastguard Worker }
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker // CHECK: DW_TAG_namespace
69*9880d681SAndroid Build Coastguard Worker // CHECK-NOT: {{DW_AT_name|NULL|DW_TAG}}
70*9880d681SAndroid Build Coastguard Worker // CHECK: 0x[[ANONC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
71*9880d681SAndroid Build Coastguard Worker // CHECK-NEXT: DW_AT_name{{.*}}"AnonC"
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker // This function is only here to hold objects that refer to the above types.
foo()74*9880d681SAndroid Build Coastguard Worker void foo() {
75*9880d681SAndroid Build Coastguard Worker AliasForS s;
76*9880d681SAndroid Build Coastguard Worker S::Nested n;
77*9880d681SAndroid Build Coastguard Worker N::C nc;
78*9880d681SAndroid Build Coastguard Worker AnonC ac;
79*9880d681SAndroid Build Coastguard Worker U u;
80*9880d681SAndroid Build Coastguard Worker }
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker // The second CU contents depend on wether we disabled ODR uniquing or
83*9880d681SAndroid Build Coastguard Worker // not.
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker // CHECK: TAG_compile_unit
86*9880d681SAndroid Build Coastguard Worker // CHECK-NOT: DW_TAG
87*9880d681SAndroid Build Coastguard Worker // CHECK: AT_name{{.*}}"odr-uniquing.cpp"
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker // The union itself is not uniqued for now (for dsymutil-compatibility),
90*9880d681SAndroid Build Coastguard Worker // but the types defined inside it should be.
91*9880d681SAndroid Build Coastguard Worker // ODR: DW_TAG_union_type
92*9880d681SAndroid Build Coastguard Worker // ODR-NEXT: DW_AT_name{{.*}}"U"
93*9880d681SAndroid Build Coastguard Worker // ODR: DW_TAG_member
94*9880d681SAndroid Build Coastguard Worker // ODR-NEXT: DW_AT_name{{.*}}"C"
95*9880d681SAndroid Build Coastguard Worker // ODR-NOT: DW_TAG
96*9880d681SAndroid Build Coastguard Worker // ODR: DW_AT_type{{.*}}[[UC]]
97*9880d681SAndroid Build Coastguard Worker // ODR: DW_TAG_member
98*9880d681SAndroid Build Coastguard Worker // ODR-NEXT: DW_AT_name{{.*}}"S"
99*9880d681SAndroid Build Coastguard Worker // ODR-NOT: DW_TAG
100*9880d681SAndroid Build Coastguard Worker // ODR: DW_AT_type{{.*}}[[US]]
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker // Check that the variables point to the right type
103*9880d681SAndroid Build Coastguard Worker // ODR: DW_TAG_subprogram
104*9880d681SAndroid Build Coastguard Worker // ODR-NOT: DW_TAG
105*9880d681SAndroid Build Coastguard Worker // ODR: DW_AT_name{{.*}}"foo"
106*9880d681SAndroid Build Coastguard Worker // ODR-NOT: NULL
107*9880d681SAndroid Build Coastguard Worker // ODR: DW_TAG_variable
108*9880d681SAndroid Build Coastguard Worker // ODR-NOT: DW_TAG
109*9880d681SAndroid Build Coastguard Worker // ODR: DW_AT_name{{.*}}"s"
110*9880d681SAndroid Build Coastguard Worker // ODR-NOT: DW_TAG
111*9880d681SAndroid Build Coastguard Worker // ODR: DW_AT_type{{.*}}[[ALIASFORS]]
112*9880d681SAndroid Build Coastguard Worker // ODR: DW_AT_name{{.*}}"n"
113*9880d681SAndroid Build Coastguard Worker // ODR-NOT: DW_TAG
114*9880d681SAndroid Build Coastguard Worker // ODR: DW_AT_type{{.*}}[[NESTED]]
115*9880d681SAndroid Build Coastguard Worker // ODR: DW_TAG_variable
116*9880d681SAndroid Build Coastguard Worker // ODR-NOT: DW_TAG
117*9880d681SAndroid Build Coastguard Worker // ODR: DW_AT_name{{.*}}"nc"
118*9880d681SAndroid Build Coastguard Worker // ODR-NOT: DW_TAG
119*9880d681SAndroid Build Coastguard Worker // ODR: DW_AT_type{{.*}}[[NC]]
120*9880d681SAndroid Build Coastguard Worker // ODR: DW_TAG_variable
121*9880d681SAndroid Build Coastguard Worker // ODR-NOT: DW_TAG
122*9880d681SAndroid Build Coastguard Worker // ODR: DW_AT_name{{.*}}"ac"
123*9880d681SAndroid Build Coastguard Worker // ODR-NOT: DW_TAG
124*9880d681SAndroid Build Coastguard Worker // ODR: DW_AT_type{{.*}}[[ANONC]]
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker // With no ODR uniquing, we should get copies of all the types:
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker // This is "struct S"
129*9880d681SAndroid Build Coastguard Worker // NOODR: 0x[[DUP_S:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
130*9880d681SAndroid Build Coastguard Worker // NOODR-NEXT: DW_AT_name{{.*}}"S"
131*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: NULL
132*9880d681SAndroid Build Coastguard Worker // NOODR: 0x[[DUP_NESTED:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
133*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: DW_TAG
134*9880d681SAndroid Build Coastguard Worker // NOODR: DW_AT_name{{.*}}"Nested"
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker // This is "class N::C"
137*9880d681SAndroid Build Coastguard Worker // NOODR: DW_TAG_namespace
138*9880d681SAndroid Build Coastguard Worker // NOODR-NEXT: DW_AT_name{{.*}}"N"
139*9880d681SAndroid Build Coastguard Worker // NOODR: 0x[[DUP_NC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
140*9880d681SAndroid Build Coastguard Worker // NOODR-NEXT: DW_AT_name{{.*}}"C"
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker // This is "union U"
143*9880d681SAndroid Build Coastguard Worker // NOODR: 0x[[DUP_U:[0-9a-f]*]]:{{.*}}DW_TAG_union_type
144*9880d681SAndroid Build Coastguard Worker // NOODR-NEXT: DW_AT_name{{.*}}"U"
145*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: NULL
146*9880d681SAndroid Build Coastguard Worker // NOODR: 0x[[DUP_UC:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
147*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: NULL
148*9880d681SAndroid Build Coastguard Worker // NOODR: 0x[[DUP_US:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
149*9880d681SAndroid Build Coastguard Worker // NOODR: NULL
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker // Check that the variables point to the right type
152*9880d681SAndroid Build Coastguard Worker // NOODR: DW_TAG_subprogram
153*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: DW_TAG
154*9880d681SAndroid Build Coastguard Worker // NOODR: DW_AT_name{{.*}}"foo"
155*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: NULL
156*9880d681SAndroid Build Coastguard Worker // NOODR: DW_TAG_variable
157*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: DW_TAG
158*9880d681SAndroid Build Coastguard Worker // NOODR: DW_AT_name{{.*}}"s"
159*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: DW_TAG
160*9880d681SAndroid Build Coastguard Worker // NOODR: DW_AT_type{{.*}}0x[[DUP_ALIASFORS:[0-9a-f]*]]
161*9880d681SAndroid Build Coastguard Worker // NOODR: DW_TAG_variable
162*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: DW_TAG
163*9880d681SAndroid Build Coastguard Worker // NOODR: DW_AT_name{{.*}}"n"
164*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: DW_TAG
165*9880d681SAndroid Build Coastguard Worker // NOODR: DW_AT_type{{.*}}[[DUP_NESTED]]
166*9880d681SAndroid Build Coastguard Worker // NOODR: DW_TAG_variable
167*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: DW_TAG
168*9880d681SAndroid Build Coastguard Worker // NOODR: DW_AT_name{{.*}}"nc"
169*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: DW_TAG
170*9880d681SAndroid Build Coastguard Worker // NOODR: DW_AT_type{{.*}}[[DUP_NC]]
171*9880d681SAndroid Build Coastguard Worker // NOODR: DW_TAG_variable
172*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: DW_TAG
173*9880d681SAndroid Build Coastguard Worker // NOODR: DW_AT_name{{.*}}"ac"
174*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: DW_TAG
175*9880d681SAndroid Build Coastguard Worker // NOODR: DW_AT_type{{.*}}0x[[DUP_ANONC:[0-9a-f]*]]
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker // This is "AliasForS"
178*9880d681SAndroid Build Coastguard Worker // NOODR: 0x[[DUP_ALIASFORS]]:{{.*}}DW_TAG_typedef
179*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: DW_TAG
180*9880d681SAndroid Build Coastguard Worker // NOODR: DW_AT_name{{.*}}"AliasForS"
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker // This is "(anonymous namespace)::AnonC"
183*9880d681SAndroid Build Coastguard Worker // NOODR: DW_TAG_namespace
184*9880d681SAndroid Build Coastguard Worker // NOODR-NOT: {{DW_AT_name|NULL|DW_TAG}}
185*9880d681SAndroid Build Coastguard Worker // NOODR: 0x[[DUP_ANONC]]:{{.*}}DW_TAG_class_type
186*9880d681SAndroid Build Coastguard Worker // NOODR-NEXT: DW_AT_name{{.*}}"AnonC"
187*9880d681SAndroid Build Coastguard Worker
188