blob: 7a1e2c31edf21e3039c5c2247793cb308943d306 [file] [log] [blame]
Mike Stump49520942009-08-11 04:03:59 +00001// RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -O0 -S %s -o %t-64.s &&
Mike Stump06758d02009-08-04 20:37:29 +00002// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s &&
Mike Stump49520942009-08-11 04:03:59 +00003// RUN: clang-cc -triple i386-apple-darwin -std=c++0x -O0 -S %s -o %t-32.s &&
Mike Stump06758d02009-08-04 20:37:29 +00004// RUN: FileCheck -check-prefix LP32 -input-file=%t-32.s %s &&
Mike Stump49520942009-08-11 04:03:59 +00005
6// RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -O3 -S %s -o %t-O3-64.s &&
7// RUN: FileCheck -check-prefix LPOPT64 --input-file=%t-O3-64.s %s &&
8// RUN: clang-cc -triple i386-apple-darwin -std=c++0x -O3 -S %s -o %t-O3-32.s &&
9// RUN: FileCheck -check-prefix LPOPT32 -input-file=%t-O3-32.s %s &&
10
Mike Stump06758d02009-08-04 20:37:29 +000011// RUN: true
Mike Stump3dee6ef2009-07-30 00:22:38 +000012
Mike Stump104ffaa2009-08-04 21:58:42 +000013struct B {
14 virtual void bar1();
15 virtual void bar2();
Mike Stump2effeca2009-08-06 00:38:46 +000016 int b;
Mike Stump104ffaa2009-08-04 21:58:42 +000017};
Mike Stump6f376332009-08-05 22:37:18 +000018void B::bar1() { }
19void B::bar2() { }
20
21struct C {
22 virtual void bee1();
23 virtual void bee2();
24};
25void C::bee1() { }
26void C::bee2() { }
Mike Stump104ffaa2009-08-04 21:58:42 +000027
Mike Stump2effeca2009-08-06 00:38:46 +000028struct D {
29 virtual void boo();
30};
31void D::boo() { }
Mike Stump104ffaa2009-08-04 21:58:42 +000032
Mike Stumpc5708d92009-08-06 14:12:47 +000033struct D1 {
34 virtual void bar();
Mike Stump02cf1e22009-08-06 23:48:32 +000035 virtual void bar2();
36 virtual void bar3();
37 virtual void bar4();
38 virtual void bar5();
Mike Stumpc5708d92009-08-06 14:12:47 +000039 void *d1;
40};
41void D1::bar() { }
42
43class F : virtual public D1, virtual public D {
44public:
45 virtual void foo();
46 void *f;
47};
48void F::foo() { }
49
50int j;
51void test2() {
52 F f;
53 static int sz = (char *)(&f.f) - (char *)(&f);
54 j = sz;
Mike Stump37148f42009-08-06 14:16:19 +000055 // FIXME: These should result in a frontend constant a la fold, no run time
56 // initializer
Mike Stump49520942009-08-11 04:03:59 +000057 // CHECK-LPOPT32: movl $4, __ZZ5test2vE2sz
58 // CHECK-LPOPT64: movl $8, __ZZ5test2vE2sz(%rip)
Mike Stumpc5708d92009-08-06 14:12:47 +000059}
Mike Stump8a12b562009-08-06 15:50:11 +000060
Mike Stumpc5708d92009-08-06 14:12:47 +000061static_assert(sizeof(F) == sizeof(void*)*4, "invalid vbase size");
62
Mike Stump2effeca2009-08-06 00:38:46 +000063struct E {
64 int e;
65};
66
67static_assert (sizeof (C) == (sizeof(void *)), "vtable pointer layout");
68
Mike Stumpeb19fa92009-08-06 13:41:24 +000069class A : public E, public B, public C {
Mike Stump3dee6ef2009-07-30 00:22:38 +000070public:
Mike Stump06758d02009-08-04 20:37:29 +000071 virtual void foo1();
72 virtual void foo2();
73 A() { }
Mike Stump2effeca2009-08-06 00:38:46 +000074 int a;
75} *ap;
Mike Stump6f376332009-08-05 22:37:18 +000076void A::foo1() { }
77void A::foo2() { }
Mike Stump3dee6ef2009-07-30 00:22:38 +000078
Mike Stump06758d02009-08-04 20:37:29 +000079int main() {
80 A a;
Mike Stump26899b02009-08-05 22:48:36 +000081 B b;
Mike Stump2effeca2009-08-06 00:38:46 +000082 ap->e = 1;
83 ap->b = 2;
Mike Stump06758d02009-08-04 20:37:29 +000084}
85
Mike Stump2effeca2009-08-06 00:38:46 +000086// CHECK-LP32: main:
87// CHECK-LP32: movl $1, 8(%eax)
88// CHECK-LP32: movl $2, 4(%eax)
89
90// CHECK-LP64: main:
91// CHECK-LP64: movl $1, 12(%rax)
92// CHECK-LP64: movl $2, 8(%rax)
93
Mike Stump49520942009-08-11 04:03:59 +000094
95struct test3_B3 { virtual void funcB3(); };
96struct test3_B2 : virtual test3_B3 { virtual void funcB2(); };
97struct test3_B1 : virtual test3_B2 { virtual void funcB1(); };
98
99struct test3_D : virtual test3_B1 {
100 virtual void funcD() { }
101};
102
103// CHECK-LP32:__ZTV7test3_D:
104// CHECK-LP32: .space 4
105// CHECK-LP32: .space 4
106// CHECK-LP32: .space 4
107// CHECK-LP32: .space 4
108// CHECK-LP32: .space 4
109// CHECK-LP32: .space 4
110// CHECK-LP32: .space 4
111// CHECK-LP32: .long __ZTI7test3_D
112// CHECK-LP32: .long __ZN8test3_B36funcB3Ev
113// CHECK-LP32: .long __ZN8test3_B26funcB2Ev
114// CHECK-LP32: .long __ZN8test3_B16funcB1Ev
115// CHECK-LP32: .long __ZN7test3_D5funcDEv
116
117// CHECK-LP64:__ZTV7test3_D:
118// CHECK-LP64: .space 8
119// CHECK-LP64: .space 8
120// CHECK-LP64: .space 8
121// CHECK-LP64: .space 8
122// CHECK-LP64: .space 8
123// CHECK-LP64: .space 8
124// CHECK-LP64: .space 8
125// CHECK-LP64: .quad __ZTI7test3_D
126// CHECK-LP64: .quad __ZN8test3_B36funcB3Ev
127// CHECK-LP64: .quad __ZN8test3_B26funcB2Ev
128// CHECK-LP64: .quad __ZN8test3_B16funcB1Ev
129// CHECK-LP64: .quad __ZN7test3_D5funcDEv
130
Mike Stump34fae9c2009-08-12 18:50:26 +0000131struct test4_D : virtual B, virtual C {
132};
133
134// CHECK-LP32:__ZTV7test4_D:
135// CHECK-LP32: .space 4
136// CHECK-LP32: .long 4
137// CHECK-LP32: .space 4
138// CHECK-LP32: .space 4
139// CHECK-LP32: .space 4
140// CHECK-LP32: .long __ZTI7test4_D
141// CHECK-LP32: .long __ZN1C4bee1Ev
142// CHECK-LP32: .long __ZN1C4bee2Ev
143// CHECK-LP32: .space 4
144// CHECK-LP32: .space 4
145// CHECK-LP32: .long 4294967292
146// CHECK-LP32: .long __ZTI7test4_D
147// CHECK-LP32: .long __ZN1B4bar1Ev
148// CHECK-LP32: .long __ZN1B4bar2Ev
149
150// CHECK-LP64:__ZTV7test4_D:
151// CHECK-LP64: .space 8
152// CHECK-LP64: .quad 8
153// CHECK-LP64: .space 8
154// CHECK-LP64: .space 8
155// CHECK-LP64: .space 8
156// CHECK-LP64: .quad __ZTI7test4_D
157// CHECK-LP64: .quad __ZN1C4bee1Ev
158// CHECK-LP64: .quad __ZN1C4bee2Ev
159// CHECK-LP64: .space 8
160// CHECK-LP64: .space 8
161// CHECK-LP64: .quad 18446744073709551608
162// CHECK-LP64: .quad __ZTI7test4_D
163// CHECK-LP64: .quad __ZN1B4bar1Ev
164// CHECK-LP64: .quad __ZN1B4bar2Ev
165
Mike Stump49520942009-08-11 04:03:59 +0000166
Mike Stumpd76264e2009-08-12 21:50:08 +0000167struct test5_B3 { virtual void funcB3(); };
168struct test5_B2 : virtual test5_B3 { virtual void funcB2(); };
169struct test5_B1 : virtual test5_B2 { virtual void funcB1(); };
170
171struct test5_B23 { virtual void funcB23(); };
172struct test5_B22 : virtual test5_B23 { virtual void funcB22(); };
173struct test5_B21 : virtual test5_B22 { virtual void funcB21(); };
174
175
176struct B232 { virtual void funcB232(); };
177struct B231 { virtual void funcB231(); };
178
179struct test5_B33 { virtual void funcB33(); };
180struct test5_B32 : virtual test5_B33, virtual B232 { virtual void funcB32(); };
181struct test5_B31 : virtual test5_B32, virtual B231 { virtual void funcB31(); };
182
183struct test5_D : virtual test5_B1, virtual test5_B21, virtual test5_B31 {
184 virtual void funcD() { }
185};
186
187// CHECK-LP32:__ZTV7test5_D:
188// CHECK-LP32 .long 16
189// CHECK-LP32 .long 12
190// CHECK-LP32 .long 8
191// CHECK-LP32 .long 8
192// CHECK-LP32 .long 8
193// CHECK-LP32 .long 4
194// CHECK-LP32 .long 4
195// CHECK-LP32 .long 4
196// CHECK-LP32: .space 4
197// CHECK-LP32: .space 4
198// CHECK-LP32: .space 4
199// CHECK-LP32: .space 4
200// CHECK-LP32: .space 4
201// CHECK-LP32: .space 4
202// CHECK-LP32: .space 4
203// CHECK-LP32: .long __ZTI7test5_D
204// CHECK-LP32: .long __ZN8test5_B36funcB3Ev
205// CHECK-LP32: .long __ZN8test5_B26funcB2Ev
206// CHECK-LP32: .long __ZN8test5_B16funcB1Ev
207// CHECK-LP32: .long __ZN7test5_D5funcDEv
208// CHECK-LP32 .space 4
209// CHECK-LP32 .space 4
210// CHECK-LP32 .space 4
211// CHECK-LP32 .space 4
212// CHECK-LP32: .space 4
213// CHECK-LP32 .long -4
214// CHECK-LP32: .long __ZTI7test5_D
215// CHECK-LP32: .long __ZN9test5_B237funcB23Ev
216// CHECK-LP32: .long __ZN9test5_B227funcB22Ev
217// CHECK-LP32 .long __ZN9test5_B217funcB21Ev
218// CHECK-LP32 .space 4
219// CHECK-LP32 .long 8
220// CHECK-LP32 .space 4
221// CHECK-LP32 .space 4
222// CHECK-LP32 .long 4
223// CHECK-LP32 .space 4
224// CHECK-LP32: .space 4
225// CHECK-LP32 .long -8
226// CHECK-LP32 .long __ZTI7test5_D
227// CHECK-LP32 .long __ZN9test5_B337funcB33Ev
228// CHECK-LP32 .long __ZN9test5_B327funcB32Ev
229// CHECK-LP32 .long __ZN9test5_B317funcB31Ev
230// CHECK-LP32: .space 4
231// CHECK-LP32 .long -12
232// CHECK-LP32: .long __ZTI7test5_D
233// CHECK-LP32: .long __ZN4B2328funcB232Ev
234// CHECK-LP32: .space 4
235// CHECK-LP32 .long -16
236// CHECK-LP32: .long __ZTI7test5_D
237// CHECK-LP32: .long __ZN4B2318funcB231Ev
238
239// CHECK-LP64:__ZTV7test5_D:
240// CHECK-LP64 .quad 32
241// CHECK-LP64 .quad 24
242// CHECK-LP64 .quad 16
243// CHECK-LP64 .quad 16
244// CHECK-LP64 .quad 16
245// CHECK-LP64 .quad 8
246// CHECK-LP64 .quad 8
247// CHECK-LP64 .quad 8
248// CHECK-LP64: .space 8
249// CHECK-LP64: .space 8
250// CHECK-LP64: .space 8
251// CHECK-LP64: .space 8
252// CHECK-LP64: .space 8
253// CHECK-LP64: .space 8
254// CHECK-LP64: .space 8
255// CHECK-LP64: .quad __ZTI7test5_D
256// CHECK-LP64: .quad __ZN8test5_B36funcB3Ev
257// CHECK-LP64: .quad __ZN8test5_B26funcB2Ev
258// CHECK-LP64: .quad __ZN8test5_B16funcB1Ev
259// CHECK-LP64: .quad __ZN7test5_D5funcDEv
260// CHECK-LP64 .space 8
261// CHECK-LP64 .space 8
262// CHECK-LP64 .space 8
263// CHECK-LP64 .space 8
264// CHECK-LP64: .space 8
265// CHECK-LP64 .quad 18446744073709551608
266// CHECK-LP64: .quad __ZTI7test5_D
267// CHECK-LP64: .quad __ZN9test5_B237funcB23Ev
268// CHECK-LP64: .quad __ZN9test5_B227funcB22Ev
269// CHECK-LP64 .quad __ZN9test5_B217funcB21Ev
270// CHECK-LP64 .space 8
271// CHECK-LP64 .quad 16
272// CHECK-LP64 .space 8
273// CHECK-LP64 .space 8
274// CHECK-LP64 .quad 8
275// CHECK-LP64 .space 8
276// CHECK-LP64: .space 8
277// CHECK-LP64 .quad 18446744073709551600
278// CHECK-LP64 .quad __ZTI7test5_D
279// CHECK-LP64 .quad __ZN9test5_B337funcB33Ev
280// CHECK-LP64 .quad __ZN9test5_B327funcB32Ev
281// CHECK-LP64 .quad __ZN9test5_B317funcB31Ev
282// CHECK-LP64: .space 8
283// CHECK-LP64 .quad 18446744073709551592
284// CHECK-LP64: .quad __ZTI7test5_D
285// CHECK-LP64: .quad __ZN4B2328funcB232Ev
286// CHECK-LP64: .space 8
287// CHECK-LP64 .quad 18446744073709551584
288// CHECK-LP64: .quad __ZTI7test5_D
289// CHECK-LP64: .quad __ZN4B2318funcB231Ev
290
291
Mike Stump49520942009-08-11 04:03:59 +0000292
293
Mike Stump26899b02009-08-05 22:48:36 +0000294// CHECK-LP64: __ZTV1B:
295// CHECK-LP64: .space 8
Mike Stumpe1be2b12009-08-06 21:49:36 +0000296// CHECK-LP64: .quad __ZTI1B
Mike Stump26899b02009-08-05 22:48:36 +0000297// CHECK-LP64: .quad __ZN1B4bar1Ev
298// CHECK-LP64: .quad __ZN1B4bar2Ev
299
300// CHECK-LP32: __ZTV1B:
301// CHECK-LP32: .space 4
Mike Stumpe1be2b12009-08-06 21:49:36 +0000302// CHECK-LP32: .long __ZTI1B
Mike Stump26899b02009-08-05 22:48:36 +0000303// CHECK-LP32: .long __ZN1B4bar1Ev
304// CHECK-LP32: .long __ZN1B4bar2Ev
305
Mike Stump06758d02009-08-04 20:37:29 +0000306// CHECK-LP64: __ZTV1A:
307// CHECK-LP64: .space 8
Mike Stumpe1be2b12009-08-06 21:49:36 +0000308// CHECK-LP64: .quad __ZTI1A
Mike Stump104ffaa2009-08-04 21:58:42 +0000309// CHECK-LP64: .quad __ZN1B4bar1Ev
310// CHECK-LP64: .quad __ZN1B4bar2Ev
Mike Stump06758d02009-08-04 20:37:29 +0000311// CHECK-LP64: .quad __ZN1A4foo1Ev
312// CHECK-LP64: .quad __ZN1A4foo2Ev
Mike Stump2effeca2009-08-06 00:38:46 +0000313// CHECK-LP64: .quad 18446744073709551600
Mike Stumpe1be2b12009-08-06 21:49:36 +0000314// CHECK-LP64: .quad __ZTI1A
Mike Stump6f376332009-08-05 22:37:18 +0000315// CHECK-LP64: .quad __ZN1C4bee1Ev
316// CHECK-LP64: .quad __ZN1C4bee2Ev
Mike Stump06758d02009-08-04 20:37:29 +0000317
318// CHECK-LP32: __ZTV1A:
319// CHECK-LP32: .space 4
Mike Stumpe1be2b12009-08-06 21:49:36 +0000320// CHECK-LP32: .long __ZTI1A
Mike Stump104ffaa2009-08-04 21:58:42 +0000321// CHECK-LP32: .long __ZN1B4bar1Ev
322// CHECK-LP32: .long __ZN1B4bar2Ev
Mike Stump06758d02009-08-04 20:37:29 +0000323// CHECK-LP32: .long __ZN1A4foo1Ev
324// CHECK-LP32: .long __ZN1A4foo2Ev
Mike Stump2effeca2009-08-06 00:38:46 +0000325// CHECK-LP32: .long 4294967284
Mike Stumpe1be2b12009-08-06 21:49:36 +0000326// CHECK-LP32: .long __ZTI1A
Mike Stump6f376332009-08-05 22:37:18 +0000327// CHECK-LP32: .long __ZN1C4bee1Ev
328// CHECK-LP32: .long __ZN1C4bee2Ev
Mike Stump8a12b562009-08-06 15:50:11 +0000329
Mike Stump928f1502009-08-07 19:00:50 +0000330// CHECK-LP32:__ZTV1F:
331// CHECK-LP32: .space 4
Mike Stump57cf2f32009-08-07 21:54:03 +0000332// CHECK-LP32: .long 8
Mike Stump928f1502009-08-07 19:00:50 +0000333// CHECK-LP32: .space 4
Mike Stump8a12b562009-08-06 15:50:11 +0000334// CHECK-LP32: .space 4
Mike Stumpe1be2b12009-08-06 21:49:36 +0000335// CHECK-LP32: .long __ZTI1F
Mike Stump70101ce2009-08-06 18:05:22 +0000336// CHECK-LP32: .long __ZN1D3booEv
337// CHECK-LP32: .long __ZN1F3fooEv
Mike Stump02cf1e22009-08-06 23:48:32 +0000338// CHECK-LP32: .space 4
339// CHECK-LP32: .space 4
340// CHECK-LP32: .space 4
341// CHECK-LP32: .space 4
342// CHECK-LP32: .space 4
Mike Stumpdac64a52009-08-06 22:02:55 +0000343// CHECK-LP32: .long 4294967288
Mike Stumpe1be2b12009-08-06 21:49:36 +0000344// CHECK-LP32: .long __ZTI1F
Mike Stump8a12b562009-08-06 15:50:11 +0000345// CHECK-LP32: .long __ZN2D13barEv
Mike Stump02cf1e22009-08-06 23:48:32 +0000346// CHECK-LP32: .long __ZN2D14bar2Ev
347// CHECK-LP32: .long __ZN2D14bar3Ev
348// CHECK-LP32: .long __ZN2D14bar4Ev
349// CHECK-LP32: .long __ZN2D14bar5Ev
Mike Stump8a12b562009-08-06 15:50:11 +0000350
351// CHECK-LP64: __ZTV1F:
Mike Stump928f1502009-08-07 19:00:50 +0000352// CHECK-LP64: .space 8
Mike Stump57cf2f32009-08-07 21:54:03 +0000353// CHECK-LP64: .quad 16
Mike Stump928f1502009-08-07 19:00:50 +0000354// CHECK-LP64: .space 8
Mike Stump8a12b562009-08-06 15:50:11 +0000355// CHECK-LP64: .space 8
Mike Stumpe1be2b12009-08-06 21:49:36 +0000356// CHECK-LP64: .quad __ZTI1F
Mike Stump70101ce2009-08-06 18:05:22 +0000357// CHECK-LP64: .quad __ZN1D3booEv
358// CHECK-LP64: .quad __ZN1F3fooEv
Mike Stump02cf1e22009-08-06 23:48:32 +0000359// CHECK-LP64: .space 8
360// CHECK-LP64: .space 8
361// CHECK-LP64: .space 8
362// CHECK-LP64: .space 8
363// CHECK-LP64: .space 8
Mike Stump636548d2009-08-06 21:53:24 +0000364// CHECK-LP64: .quad 18446744073709551600
365// CHECK-LP64: .quad __ZTI1F
Mike Stump8a12b562009-08-06 15:50:11 +0000366// CHECK-LP64: .quad __ZN2D13barEv
Mike Stump02cf1e22009-08-06 23:48:32 +0000367// CHECK-LP64: .quad __ZN2D14bar2Ev
368// CHECK-LP64: .quad __ZN2D14bar3Ev
369// CHECK-LP64: .quad __ZN2D14bar4Ev
370// CHECK-LP64: .quad __ZN2D14bar5Ev
Mike Stump49520942009-08-11 04:03:59 +0000371
372
Mike Stumpd76264e2009-08-12 21:50:08 +0000373test5_D d5;
Mike Stump34fae9c2009-08-12 18:50:26 +0000374test4_D d4;
375test3_D d3;