blob: b453ed55df3ece5d90195d156dd36ac0d2b61cc0 [file] [log] [blame]
Daniel Dunbar4fcfde42009-11-08 01:45:36 +00001// RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -O0 -S %s -o %t-64.s
2// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s
Mike Stump49520942009-08-11 04:03:59 +00003
Daniel Dunbar4fcfde42009-11-08 01:45:36 +00004// RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -emit-llvm %s -o %t-64.ll
5// RUN: FileCheck -check-prefix LPLL64 --input-file=%t-64.ll %s
Mike Stump49520942009-08-11 04:03:59 +00006
Mike Stump104ffaa2009-08-04 21:58:42 +00007struct B {
8 virtual void bar1();
9 virtual void bar2();
Mike Stump2effeca2009-08-06 00:38:46 +000010 int b;
Mike Stump104ffaa2009-08-04 21:58:42 +000011};
Mike Stump6f376332009-08-05 22:37:18 +000012void B::bar1() { }
13void B::bar2() { }
14
15struct C {
16 virtual void bee1();
17 virtual void bee2();
18};
19void C::bee1() { }
20void C::bee2() { }
Mike Stump104ffaa2009-08-04 21:58:42 +000021
Mike Stump2effeca2009-08-06 00:38:46 +000022struct D {
23 virtual void boo();
24};
25void D::boo() { }
Mike Stump104ffaa2009-08-04 21:58:42 +000026
Mike Stumpc5708d92009-08-06 14:12:47 +000027struct D1 {
28 virtual void bar();
Mike Stump02cf1e22009-08-06 23:48:32 +000029 virtual void bar2();
30 virtual void bar3();
31 virtual void bar4();
32 virtual void bar5();
Mike Stumpc5708d92009-08-06 14:12:47 +000033 void *d1;
34};
35void D1::bar() { }
36
37class F : virtual public D1, virtual public D {
38public:
39 virtual void foo();
40 void *f;
41};
42void F::foo() { }
43
44int j;
Mike Stump941e3f32009-11-05 05:01:19 +000045void *vp;
Mike Stumpc5708d92009-08-06 14:12:47 +000046void test2() {
47 F f;
48 static int sz = (char *)(&f.f) - (char *)(&f);
Mike Stump941e3f32009-11-05 05:01:19 +000049 vp = &sz;
Mike Stumpc5708d92009-08-06 14:12:47 +000050 j = sz;
Mike Stump37148f42009-08-06 14:16:19 +000051 // FIXME: These should result in a frontend constant a la fold, no run time
52 // initializer
Mike Stump599837a2009-11-06 00:18:25 +000053 // CHECK-LPLL64: define void @_Z5test2v()
54 // CHECK-LPLL64: = getelementptr inbounds %class.F* %f, i32 0, i32 1
Mike Stumpc5708d92009-08-06 14:12:47 +000055}
Mike Stump8a12b562009-08-06 15:50:11 +000056
Mike Stumpc5708d92009-08-06 14:12:47 +000057static_assert(sizeof(F) == sizeof(void*)*4, "invalid vbase size");
58
Mike Stump2effeca2009-08-06 00:38:46 +000059struct E {
60 int e;
61};
62
63static_assert (sizeof (C) == (sizeof(void *)), "vtable pointer layout");
64
Mike Stumpeb19fa92009-08-06 13:41:24 +000065class A : public E, public B, public C {
Mike Stump3dee6ef2009-07-30 00:22:38 +000066public:
Mike Stump06758d02009-08-04 20:37:29 +000067 virtual void foo1();
68 virtual void foo2();
69 A() { }
Mike Stump2effeca2009-08-06 00:38:46 +000070 int a;
71} *ap;
Mike Stump6f376332009-08-05 22:37:18 +000072void A::foo1() { }
73void A::foo2() { }
Mike Stump3dee6ef2009-07-30 00:22:38 +000074
Mike Stump06758d02009-08-04 20:37:29 +000075int main() {
76 A a;
Mike Stump26899b02009-08-05 22:48:36 +000077 B b;
Mike Stump2effeca2009-08-06 00:38:46 +000078 ap->e = 1;
79 ap->b = 2;
Mike Stump06758d02009-08-04 20:37:29 +000080}
81
Mike Stump2effeca2009-08-06 00:38:46 +000082// CHECK-LP64: main:
83// CHECK-LP64: movl $1, 12(%rax)
84// CHECK-LP64: movl $2, 8(%rax)
85
Mike Stumpf0070db2009-08-26 20:46:33 +000086struct test12_A {
87 virtual void foo0() { }
88 virtual void foo();
89} *test12_pa;
90
91struct test12_B : public test12_A {
92 virtual void foo() { }
93} *test12_pb;
94
95struct test12_D : public test12_B {
96} *test12_pd;
97void test12_foo() {
98 test12_pa->foo0();
99 test12_pb->foo0();
100 test12_pd->foo0();
101 test12_pa->foo();
102 test12_pb->foo();
103 test12_pd->foo();
104 test12_pa->test12_A::foo();
105}
106
Mike Stump599837a2009-11-06 00:18:25 +0000107// CHECK-LPLL64:define void @_Z10test12_foov() nounwind {
108// CHECK-LPLL64: call void %2(%class.test14* %tmp)
109// CHECK-LPLL64: call void %5(%class.test14* %tmp1)
110// CHECK-LPLL64: call void %8(%class.test14* %tmp3)
111// CHECK-LPLL64: call void %11(%class.test14* %tmp5)
112// CHECK-LPLL64: call void %14(%class.test14* %tmp7)
113// CHECK-LPLL64: call void %17(%class.test14* %tmp9)
114// CHECK-LPLL64: call void @_ZN8test12_A3fooEv(%class.test14* %tmp11)
Mike Stump49520942009-08-11 04:03:59 +0000115
Mike Stump941e3f32009-11-05 05:01:19 +0000116
Mike Stump94d0bce2009-08-13 00:34:14 +0000117struct test6_B2 { virtual void funcB2(); char b[1000]; };
118struct test6_B1 : virtual test6_B2 { virtual void funcB1(); };
119
120struct test6_D : test6_B2, virtual test6_B1 {
121};
122
Mike Stump94d0bce2009-08-13 00:34:14 +0000123// CHECK-LP64: .zerofill __DATA, __common, _d6, 2024, 4
124
Mike Stump78846782009-08-13 23:33:29 +0000125struct test7_B2 { virtual void funcB2(); };
126struct test7_B1 : virtual test7_B2 { virtual void funcB1(); };
127
128struct test7_D : test7_B2, virtual test7_B1 {
129};
130
Mike Stump78846782009-08-13 23:33:29 +0000131// CHECK-LP64: .zerofill __DATA, __common, _d7, 16, 3
Mike Stump94d0bce2009-08-13 00:34:14 +0000132
133
Mike Stump49520942009-08-11 04:03:59 +0000134struct test3_B3 { virtual void funcB3(); };
135struct test3_B2 : virtual test3_B3 { virtual void funcB2(); };
136struct test3_B1 : virtual test3_B2 { virtual void funcB1(); };
137
Mike Stumpf0070db2009-08-26 20:46:33 +0000138struct test3_D : virtual test3_B1 {
Mike Stump49520942009-08-11 04:03:59 +0000139 virtual void funcD() { }
140};
141
Mike Stump49520942009-08-11 04:03:59 +0000142// CHECK-LP64:__ZTV7test3_D:
Mike Stump4ec04c42009-08-16 02:40:14 +0000143// CHECK-LP64-NEXT: .space 8
144// CHECK-LP64-NEXT: .space 8
145// CHECK-LP64-NEXT: .space 8
146// CHECK-LP64-NEXT: .space 8
147// CHECK-LP64-NEXT: .space 8
148// CHECK-LP64-NEXT: .space 8
149// CHECK-LP64-NEXT: .space 8
Mike Stump666a91e2009-08-21 18:05:02 +0000150// CHECK-LP64-NEXT: .quad __ZTI7test3_D
Mike Stump4ec04c42009-08-16 02:40:14 +0000151// CHECK-LP64-NEXT: .quad __ZN8test3_B36funcB3Ev
152// CHECK-LP64-NEXT: .quad __ZN8test3_B26funcB2Ev
153// CHECK-LP64-NEXT: .quad __ZN8test3_B16funcB1Ev
154// CHECK-LP64-NEXT: .quad __ZN7test3_D5funcDEv
Mike Stump49520942009-08-11 04:03:59 +0000155
Mike Stump34fae9c2009-08-12 18:50:26 +0000156struct test4_D : virtual B, virtual C {
157};
158
Mike Stump34fae9c2009-08-12 18:50:26 +0000159// CHECK-LP64:__ZTV7test4_D:
Mike Stump4ec04c42009-08-16 02:40:14 +0000160// CHECK-LP64-NEXT: .space 8
161// CHECK-LP64-NEXT: .quad 8
162// CHECK-LP64-NEXT: .space 8
163// CHECK-LP64-NEXT: .space 8
164// CHECK-LP64-NEXT: .space 8
165// CHECK-LP64-NEXT: .quad __ZTI7test4_D
166// CHECK-LP64-NEXT: .quad __ZN1C4bee1Ev
167// CHECK-LP64-NEXT: .quad __ZN1C4bee2Ev
168// CHECK-LP64-NEXT: .space 8
169// CHECK-LP64-NEXT: .space 8
170// CHECK-LP64-NEXT: .quad 18446744073709551608
171// CHECK-LP64-NEXT: .quad __ZTI7test4_D
172// CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev
173// CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev
Mike Stump34fae9c2009-08-12 18:50:26 +0000174
Mike Stump49520942009-08-11 04:03:59 +0000175
Mike Stumpd76264e2009-08-12 21:50:08 +0000176struct test5_B3 { virtual void funcB3(); };
177struct test5_B2 : virtual test5_B3 { virtual void funcB2(); };
178struct test5_B1 : virtual test5_B2 { virtual void funcB1(); };
179
180struct test5_B23 { virtual void funcB23(); };
181struct test5_B22 : virtual test5_B23 { virtual void funcB22(); };
182struct test5_B21 : virtual test5_B22 { virtual void funcB21(); };
183
184
185struct B232 { virtual void funcB232(); };
186struct B231 { virtual void funcB231(); };
187
188struct test5_B33 { virtual void funcB33(); };
189struct test5_B32 : virtual test5_B33, virtual B232 { virtual void funcB32(); };
190struct test5_B31 : virtual test5_B32, virtual B231 { virtual void funcB31(); };
191
192struct test5_D : virtual test5_B1, virtual test5_B21, virtual test5_B31 {
193 virtual void funcD() { }
194};
195
Mike Stumpd76264e2009-08-12 21:50:08 +0000196// CHECK-LP64:__ZTV7test5_D:
Mike Stump4ec04c42009-08-16 02:40:14 +0000197// CHECK-LP64-NEXT: .quad 32
198// CHECK-LP64-NEXT: .quad 24
Mike Stumpfe3010d2009-08-16 19:04:13 +0000199// CHECK-LP64-NEXT: .quad 16
200// CHECK-LP64-NEXT: .quad 16
201// CHECK-LP64-NEXT: .quad 16
202// CHECK-LP64-NEXT: .quad 8
203// CHECK-LP64-NEXT: .quad 8
204// CHECK-LP64-NEXT: .quad 8
205// CHECK-LP64-NEXT: .space 8
Mike Stump4ec04c42009-08-16 02:40:14 +0000206// CHECK-LP64-NEXT: .space 8
207// CHECK-LP64-NEXT: .space 8
208// CHECK-LP64-NEXT: .space 8
209// CHECK-LP64-NEXT: .space 8
210// CHECK-LP64-NEXT: .space 8
211// CHECK-LP64-NEXT: .space 8
Mike Stumpb9837442009-08-20 07:22:17 +0000212// CHECK-LP64-NEXT: .quad __ZTI7test5_D
Mike Stump4ec04c42009-08-16 02:40:14 +0000213// CHECK-LP64-NEXT: .quad __ZN8test5_B36funcB3Ev
214// CHECK-LP64-NEXT: .quad __ZN8test5_B26funcB2Ev
215// CHECK-LP64-NEXT: .quad __ZN8test5_B16funcB1Ev
216// CHECK-LP64-NEXT: .quad __ZN7test5_D5funcDEv
Mike Stump4ec04c42009-08-16 02:40:14 +0000217// CHECK-LP64-NEXT: .space 8
218// CHECK-LP64-NEXT: .space 8
219// CHECK-LP64-NEXT: .space 8
220// CHECK-LP64-NEXT: .space 8
Mike Stump15a24e02009-08-28 23:22:54 +0000221// CHECK-LP64-NEXT: .space 8
Mike Stumpbf3fe202009-08-27 01:09:45 +0000222// CHECK-LP64-NEXT: .quad 18446744073709551608
Mike Stumpfe3010d2009-08-16 19:04:13 +0000223// CHECK-LP64-NEXT: .quad __ZTI7test5_D
Mike Stump4ec04c42009-08-16 02:40:14 +0000224// CHECK-LP64-NEXT: .quad __ZN9test5_B237funcB23Ev
225// CHECK-LP64-NEXT: .quad __ZN9test5_B227funcB22Ev
226// CHECK-LP64-NEXT: .quad __ZN9test5_B217funcB21Ev
Mike Stump74be00b2009-09-01 22:01:25 +0000227// CHECK-LP64-NEXT: .space 8
Mike Stump6a9612f2009-10-31 20:06:59 +0000228// CHECK-LP64-NEXT: .quad 16
229// CHECK-LP64-NEXT: .space 8
230// CHECK-LP64-NEXT: .space 8
231// CHECK-LP64-NEXT: .quad 8
Mike Stump4ec04c42009-08-16 02:40:14 +0000232// CHECK-LP64-NEXT: .space 8
233// CHECK-LP64-NEXT: .space 8
Mike Stump74be00b2009-09-01 22:01:25 +0000234// CHECK-LP64-NEXT: .quad 18446744073709551600
Mike Stumpfe3010d2009-08-16 19:04:13 +0000235// CHECK-LP64-NEXT: .quad __ZTI7test5_D
Mike Stump4ec04c42009-08-16 02:40:14 +0000236// CHECK-LP64-NEXT: .quad __ZN9test5_B337funcB33Ev
237// CHECK-LP64-NEXT: .quad __ZN9test5_B327funcB32Ev
238// CHECK-LP64-NEXT: .quad __ZN9test5_B317funcB31Ev
239// CHECK-LP64-NEXT: .space 8
240// CHECK-LP64-NEXT: .quad 18446744073709551592
241// CHECK-LP64-NEXT: .quad __ZTI7test5_D
242// CHECK-LP64-NEXT: .quad __ZN4B2328funcB232Ev
243// CHECK-LP64-NEXT: .space 8
Mike Stumpb9837442009-08-20 07:22:17 +0000244// CHECK-LP64-NEXT: .quad 18446744073709551584
Mike Stump4ec04c42009-08-16 02:40:14 +0000245// CHECK-LP64-NEXT: .quad __ZTI7test5_D
246// CHECK-LP64-NEXT: .quad __ZN4B2318funcB231Ev
Mike Stumpd76264e2009-08-12 21:50:08 +0000247
Mike Stump276b9f12009-08-16 01:46:26 +0000248struct test8_B1 {
249 virtual void ftest8_B1() { }
250};
251struct test8_B2aa {
252 virtual void ftest8_B2aa() { }
253 int i;
254};
255struct test8_B2ab {
256 virtual void ftest8_B2ab() { }
257 int i;
258};
259struct test8_B2a : virtual test8_B2aa, virtual test8_B2ab {
260 virtual void ftest8_B2a() { }
261};
262struct test8_B2b {
263 virtual void ftest8_B2b() { }
264};
265struct test8_B2 : test8_B2a, test8_B2b {
266 virtual void ftest8_B2() { }
267};
268struct test8_B3 {
269 virtual void ftest8_B3() { }
270};
271class test8_D : test8_B1, test8_B2, test8_B3 {
Mike Stump09765ec2009-08-19 02:53:08 +0000272};
Mike Stump276b9f12009-08-16 01:46:26 +0000273
Mike Stump276b9f12009-08-16 01:46:26 +0000274// CHECK-LP64:__ZTV7test8_D:
Mike Stump4ec04c42009-08-16 02:40:14 +0000275// CHECK-LP64-NEXT: .quad 48
276// CHECK-LP64-NEXT: .quad 32
277// CHECK-LP64-NEXT: .space 8
Mike Stumpb46c92d2009-08-19 02:06:38 +0000278// CHECK-LP64-NEXT: .quad __ZTI7test8_D
Mike Stump4ec04c42009-08-16 02:40:14 +0000279// CHECK-LP64-NEXT: .quad __ZN8test8_B19ftest8_B1Ev
280// CHECK-LP64-NEXT: .quad 40
281// CHECK-LP64-NEXT: .quad 24
Mike Stump7fa0d932009-08-20 02:11:48 +0000282// CHECK-LP64-NEXT: .quad 18446744073709551608
Mike Stump4ec04c42009-08-16 02:40:14 +0000283// CHECK-LP64-NEXT: .quad __ZTI7test8_D
284// CHECK-LP64-NEXT: .quad __ZN9test8_B2a10ftest8_B2aEv
285// CHECK-LP64-NEXT: .quad __ZN8test8_B29ftest8_B2Ev
Mike Stumpb46c92d2009-08-19 02:06:38 +0000286// CHECK-LP64-NEXT: .quad 18446744073709551600
Mike Stump4ec04c42009-08-16 02:40:14 +0000287// CHECK-LP64-NEXT: .quad __ZTI7test8_D
288// CHECK-LP64-NEXT: .quad __ZN9test8_B2b10ftest8_B2bEv
Mike Stumpb46c92d2009-08-19 02:06:38 +0000289// CHECK-LP64-NEXT: .quad 18446744073709551592
Mike Stump4ec04c42009-08-16 02:40:14 +0000290// CHECK-LP64-NEXT: .quad __ZTI7test8_D
291// CHECK-LP64-NEXT: .quad __ZN8test8_B39ftest8_B3Ev
292// CHECK-LP64-NEXT: .space 8
293// CHECK-LP64-NEXT: .quad 18446744073709551584
294// CHECK-LP64-NEXT: .quad __ZTI7test8_D
295// CHECK-LP64-NEXT: .quad __ZN10test8_B2aa11ftest8_B2aaEv
296// CHECK-LP64-NEXT: .space 8
297// CHECK-LP64-NEXT: .quad 18446744073709551568
298// CHECK-LP64-NEXT: .quad __ZTI7test8_D
299// CHECK-LP64-NEXT: .quad __ZN10test8_B2ab11ftest8_B2abEv
Mike Stumpd76264e2009-08-12 21:50:08 +0000300
Mike Stump22efb852009-11-13 22:12:05 +0000301// CHECK-LP64:__ZTC7test8_D8_8test8_B2:
302// CHECK-LP64-NEXT: .quad 40
303// CHECK-LP64-NEXT: .quad 24
304// CHECK-LP64-NEXT: .space 8
305// CHECK-LP64-NEXT: .quad __ZTI8test8_B2
306// CHECK-LP64-NEXT: .quad __ZN9test8_B2a10ftest8_B2aEv
307// CHECK-LP64-NEXT: .quad __ZN8test8_B29ftest8_B2Ev
308// CHECK-LP64-NEXT: .space 8
309// CHECK-LP64-NEXT: .quad 18446744073709551592
310// CHECK-LP64-NEXT: .quad __ZTI8test8_B2
311// CHECK-LP64-NEXT: .quad __ZN10test8_B2aa11ftest8_B2aaEv
312// CHECK-LP64-NEXT: .space 8
313// CHECK-LP64-NEXT: .quad 18446744073709551576
314// CHECK-LP64-NEXT: .quad __ZTI8test8_B2
315// CHECK-LP64-NEXT: .quad __ZN10test8_B2ab11ftest8_B2abEv
316
317// CHECK-LP64:__ZTC7test8_D8_9test8_B2a:
318// CHECK-LP64-NEXT: .quad 40
319// CHECK-LP64-NEXT: .quad 24
320// CHECK-LP64-NEXT: .space 8
321// CHECK-LP64-NEXT: .quad __ZTI9test8_B2a
322// CHECK-LP64-NEXT: .quad __ZN9test8_B2a10ftest8_B2aEv
323// CHECK-LP64-NEXT: .space 8
324// CHECK-LP64-NEXT: .quad 18446744073709551592
325// CHECK-LP64-NEXT: .quad __ZTI9test8_B2a
326// CHECK-LP64-NEXT: .quad __ZN10test8_B2aa11ftest8_B2aaEv
327// CHECK-LP64-NEXT: .space 8
328// CHECK-LP64-NEXT: .quad 18446744073709551576
329// CHECK-LP64-NEXT: .quad __ZTI9test8_B2a
330// CHECK-LP64-NEXT: .quad __ZN10test8_B2ab11ftest8_B2abEv
331
332// CHECK-LP64:__ZTT7test8_D:
333// CHECK-LP64-NEXT: .quad (__ZTV7test8_D) + 32
334// CHECK-LP64-NEXT: .quad (__ZTC7test8_D8_8test8_B2) + 32
335// CHECK-LP64-NEXT: .quad (__ZTC7test8_D8_9test8_B2a) + 32
336// CHECK-LP64-NEXT .quad (__ZTC7test8_D8_9test8_B2a) + 64
337// CHECK-LP64-NEXT .quad (__ZTC7test8_D8_9test8_B2a) + 96
338// CHECK-LP64-NEXT .quad (__ZTC7test8_D8_8test8_B2) + 72
339// CHECK-LP64-NEXT .quad (__ZTC7test8_D8_8test8_B2) + 104
340// CHECK-LP64-NEXT .quad (__ZTV7test8_D) + 72
341// CHECK-LP64: .quad (__ZTV7test8_D) + 160
342// CHECK-LP64: .quad (__ZTV7test8_D) + 192
343
Mike Stump49520942009-08-11 04:03:59 +0000344
Mike Stump09765ec2009-08-19 02:53:08 +0000345struct test9_B3 { virtual void funcB3(); int i; };
346struct test9_B2 : virtual test9_B3 { virtual void funcB2(); int i; };
347struct test9_B1 : virtual test9_B2 { virtual void funcB1(); int i; };
348
349struct test9_B23 { virtual void funcB23(); int i; };
350struct test9_B22 : virtual test9_B23 { virtual void funcB22(); int i; };
351struct test9_B21 : virtual test9_B22 { virtual void funcB21(); int i; };
352
353
354struct test9_B232 { virtual void funcB232(); int i; };
355struct test9_B231 { virtual void funcB231(); int i; };
356
357struct test9_B33 { virtual void funcB33(); int i; };
358struct test9_B32 : virtual test9_B33, virtual test9_B232 { virtual void funcB32(); int i; };
359struct test9_B31 : virtual test9_B32, virtual test9_B231 { virtual void funcB31(); int i; };
360
361struct test9_D : virtual test9_B1, virtual test9_B21, virtual test9_B31 {
362 virtual void funcD() { }
363};
364
365// CHECK-LP64: __ZTV7test9_D:
366// CHECK-LP64-NEXT: .quad 168
367// CHECK-LP64-NEXT: .quad 152
368// CHECK-LP64-NEXT: .quad 136
369// CHECK-LP64-NEXT: .quad 120
370// CHECK-LP64-NEXT: .quad 104
371// CHECK-LP64-NEXT: .quad 88
372// CHECK-LP64-NEXT: .quad 72
373// CHECK-LP64-NEXT: .quad 56
374// CHECK-LP64-NEXT: .quad 40
375// CHECK-LP64-NEXT: .quad 24
376// CHECK-LP64-NEXT: .quad 8
377// CHECK-LP64-NEXT: .space 8
378// CHECK-LP64-NEXT: .quad __ZTI7test9_D
379// CHECK-LP64-NEXT: .quad __ZN7test9_D5funcDEv
380// CHECK-LP64-NEXT: .space 8
381// CHECK-LP64-NEXT: .quad 32
382// CHECK-LP64-NEXT: .quad 16
383// CHECK-LP64-NEXT: .quad 18446744073709551608
384// CHECK-LP64-NEXT: .quad __ZTI7test9_D
385// CHECK-LP64-NEXT: .quad __ZN8test9_B16funcB1Ev
386// CHECK-LP64-NEXT: .space 8
387// CHECK-LP64-NEXT: .quad 16
388// CHECK-LP64-NEXT: .quad 18446744073709551592
389// CHECK-LP64-NEXT: .quad __ZTI7test9_D
390// CHECK-LP64-NEXT: .quad __ZN8test9_B26funcB2Ev
391// CHECK-LP64-NEXT: .space 8
392// CHECK-LP64-NEXT: .quad 18446744073709551576
393// CHECK-LP64-NEXT: .quad __ZTI7test9_D
394// CHECK-LP64-NEXT: .quad __ZN8test9_B36funcB3Ev
395// CHECK-LP64-NEXT: .space 8
396// CHECK-LP64-NEXT: .quad 32
397// CHECK-LP64-NEXT: .quad 16
398// CHECK-LP64-NEXT: .quad 18446744073709551560
399// CHECK-LP64-NEXT: .quad __ZTI7test9_D
400// CHECK-LP64-NEXT: .quad __ZN9test9_B217funcB21Ev
401// CHECK-LP64-NEXT: .space 8
402// CHECK-LP64-NEXT: .quad 16
403// CHECK-LP64-NEXT: .quad 18446744073709551544
404// CHECK-LP64-NEXT: .quad __ZTI7test9_D
405// CHECK-LP64-NEXT: .quad __ZN9test9_B227funcB22Ev
406// CHECK-LP64-NEXT: .space 8
407// CHECK-LP64-NEXT: .quad 18446744073709551528
408// CHECK-LP64-NEXT: .quad __ZTI7test9_D
409// CHECK-LP64-NEXT: .quad __ZN9test9_B237funcB23Ev
410// CHECK-LP64-NEXT: .space 8
411// CHECK-LP64-NEXT: .quad 64
412// CHECK-LP64-NEXT: .quad 48
413// CHECK-LP64-NEXT: .quad 32
414// CHECK-LP64-NEXT: .quad 16
415// CHECK-LP64-NEXT: .quad 18446744073709551512
416// CHECK-LP64-NEXT: .quad __ZTI7test9_D
417// CHECK-LP64-NEXT: .quad __ZN9test9_B317funcB31Ev
418// CHECK-LP64-NEXT: .space 8
419// CHECK-LP64-NEXT: .quad 32
420// CHECK-LP64-NEXT: .quad 16
421// CHECK-LP64-NEXT: .quad 18446744073709551496
422// CHECK-LP64-NEXT: .quad __ZTI7test9_D
423// CHECK-LP64-NEXT: .quad __ZN9test9_B327funcB32Ev
424// CHECK-LP64-NEXT: .space 8
425// CHECK-LP64-NEXT: .quad 18446744073709551480
426// CHECK-LP64-NEXT: .quad __ZTI7test9_D
427// CHECK-LP64-NEXT: .quad __ZN9test9_B337funcB33Ev
428// CHECK-LP64-NEXT: .space 8
429// CHECK-LP64-NEXT: .quad 18446744073709551464
430// CHECK-LP64-NEXT: .quad __ZTI7test9_D
431// CHECK-LP64-NEXT: .quad __ZN10test9_B2328funcB232Ev
432// CHECK-LP64-NEXT: .space 8
433// CHECK-LP64-NEXT: .quad 18446744073709551448
434// CHECK-LP64-NEXT: .quad __ZTI7test9_D
435// CHECK-LP64-NEXT: .quad __ZN10test9_B2318funcB231Ev
436
Mike Stump09765ec2009-08-19 02:53:08 +0000437
Mike Stumpb9837442009-08-20 07:22:17 +0000438struct test10_O { int i; };
439
440struct test10_B1 : virtual test10_O {
441 virtual void ftest10_B1() { }
442};
443
444struct test10_B2aa : virtual test10_O {
445 int i;
446};
447struct test10_B2ab : virtual test10_O {
448 int i;
449};
450struct test10_B2a : virtual test10_B2aa, virtual test10_B2ab,virtual test10_O {
451 virtual void ftest10_B2a() { }
452};
453struct test10_B2b : virtual test10_O {
454 virtual void ftest10_B2b() { }
455};
456struct test10_B2 : test10_B2a {
457 virtual void ftest10_B2() { }
458};
459class test10_D : test10_B1, test10_B2 {
460
461 void ftest10_B2aa() { }
462};
463
464// CHECK-LP64:__ZTV8test10_D:
465// CHECK-LP64-NEXT: .quad 40
466// CHECK-LP64-NEXT: .quad 24
467// CHECK-LP64-NEXT: .quad 16
468// CHECK-LP64-NEXT: .space 8
469// CHECK-LP64-NEXT: .quad __ZTI8test10_D
470// CHECK-LP64-NEXT: .quad __ZN9test10_B110ftest10_B1Ev
471// CHECK-LP64-NEXT: .quad 32
472// CHECK-LP64-NEXT: .quad 8
473// CHECK-LP64-NEXT: .quad 16
474// CHECK-LP64-NEXT: .quad 18446744073709551608
475// CHECK-LP64-NEXT: .quad __ZTI8test10_D
476// CHECK-LP64-NEXT: .quad __ZN10test10_B2a11ftest10_B2aEv
477// CHECK-LP64-NEXT: .quad __ZN9test10_B210ftest10_B2Ev
478// CHECK-LP64-NEXT: .quad 18446744073709551608
479// CHECK-LP64-NEXT: .quad 18446744073709551592
480// CHECK-LP64-NEXT: .quad __ZTI8test10_D
481// CHECK-LP64-NEXT: .quad 18446744073709551592
482// CHECK-LP64-NEXT: .quad 18446744073709551576
483// CHECK-LP64-NEXT: .quad __ZTI8test10_D
484
Mike Stumpb9837442009-08-20 07:22:17 +0000485
Mike Stumpb9871a22009-08-21 01:45:00 +0000486struct test11_B {
487 virtual void B1() { }
488 virtual void D() { }
489 virtual void B2() { }
490};
491
492struct test11_D : test11_B {
493 virtual void D1() { }
494 virtual void D() { }
495 virtual void D2() { }
496};
497
Mike Stumpb9871a22009-08-21 01:45:00 +0000498// CHECK-LP64:__ZTV8test11_D:
499// CHECK-LP64-NEXT: .space 8
500// CHECK-LP64-NEXT: .quad __ZTI8test11_D
501// CHECK-LP64-NEXT: .quad __ZN8test11_B2B1Ev
502// CHECK-LP64-NEXT: .quad __ZN8test11_D1DEv
503// CHECK-LP64-NEXT: .quad __ZN8test11_B2B2Ev
504// CHECK-LP64-NEXT: .quad __ZN8test11_D2D1Ev
505// CHECK-LP64-NEXT: .quad __ZN8test11_D2D2Ev
Mike Stumpb9837442009-08-20 07:22:17 +0000506
Mike Stumpdec025b2009-09-07 04:27:52 +0000507struct test13_B {
508 virtual void B1() { }
509 virtual void D() { }
510 virtual void Da();
511 virtual void Db() { }
512 virtual void Dc() { }
513 virtual void B2() { }
514 int i;
515};
516
517
518struct test13_NV1 {
519 virtual void fooNV1() { }
520 virtual void D() { }
521};
522
523
524struct test13_B2 : /* test13_NV1, */ virtual test13_B {
525 virtual void B2a() { }
526 virtual void B2() { }
527 virtual void D() { }
528 virtual void Da();
529 virtual void Dd() { }
530 virtual void B2b() { }
531 int i;
532};
533
534
535struct test13_D : test13_NV1, virtual test13_B2 {
536 virtual void D1() { }
537 virtual void D() { }
538 virtual void Db() { }
539 virtual void Dd() { }
540 virtual void D2() { }
541 virtual void fooNV1() { }
Mike Stumpd9878a12009-10-13 10:55:21 +0000542};
Mike Stumpdec025b2009-09-07 04:27:52 +0000543
544// CHECK-LP64:__ZTV8test13_D:
545// CHECK-LP64-NEXT: .quad 24
546// CHECK-LP64-NEXT: .quad 8
547// CHECK-LP64-NEXT: .space 8
548// CHECK-LP64-NEXT: .quad __ZTI8test13_D
549// CHECK-LP64-NEXT: .quad __ZN8test13_D6fooNV1Ev
550// CHECK-LP64-NEXT: .quad __ZN8test13_D1DEv
551// CHECK-LP64-NEXT: .quad __ZN8test13_D2D1Ev
552// CHECK-LP64-NEXT: .quad __ZN8test13_D2DbEv
553// CHECK-LP64-NEXT: .quad __ZN8test13_D2DdEv
554// CHECK-LP64-NEXT: .quad __ZN8test13_D2D2Ev
555// CHECK-LP64-NEXT: .space 8
556// CHECK-LP64-NEXT: .quad 18446744073709551608
557// CHECK-LP64-NEXT: .space 8
558// CHECK-LP64-NEXT: .quad 18446744073709551608
559// CHECK-LP64-NEXT: .space 8
560// CHECK-LP64-NEXT: .space 8
561// CHECK-LP64-NEXT: .quad 16
562// CHECK-LP64-NEXT: .quad 18446744073709551608
563// CHECK-LP64-NEXT: .quad __ZTI8test13_D
564// CHECK-LP64-NEXT: .quad __ZN9test13_B23B2aEv
565// CHECK-LP64-NEXT: .quad __ZN9test13_B22B2Ev
566// CHECK-LP64-NEXT: .quad __ZTv0_n48_N8test13_D1DEv
567// CHECK-LP64-NEXT: .quad __ZN9test13_B22DaEv
568// CHECK-LP64-NEXT: .quad __ZTv0_n64_N8test13_D2DdEv
569// CHECK-LP64-NEXT: .quad __ZN9test13_B23B2bEv
570// CHECK-LP64-NEXT: .quad 18446744073709551600
571// CHECK-LP64-NEXT: .space 8
572// CHECK-LP64-NEXT: .quad 18446744073709551592
573// CHECK-LP64-NEXT: .quad 18446744073709551600
574// CHECK-LP64-NEXT: .quad 18446744073709551592
575// CHECK-LP64-NEXT: .space 8
576// CHECK-LP64-NEXT: .quad 18446744073709551592
577// CHECK-LP64-NEXT: .quad __ZTI8test13_D
578// CHECK-LP64-NEXT: .quad __ZN8test13_B2B1Ev
579// CHECK-LP64-NEXT: .quad __ZTv0_n32_N8test13_D1DEv
580// CHECK-LP64-NEXT: .quad __ZTv0_n40_N9test13_B22DaEv
581// CHECK-LP64-NEXT: .quad __ZTv0_n48_N8test13_D2DbEv
582// CHECK-LP64-NEXT: .quad __ZN8test13_B2DcEv
583// CHECK-LP64-NEXT: .quad __ZTv0_n64_N9test13_B22B2Ev
584
Mike Stump09765ec2009-08-19 02:53:08 +0000585
Mike Stumpd9878a12009-10-13 10:55:21 +0000586class test14 {
587public:
588 virtual void initWithInt(int a);
589 static test14 *withInt(int a);
590};
591
592void test14::initWithInt(int a) { }
593
594test14 *test14::withInt(int a) {
595 test14 *me = new test14;
596 me->initWithInt(a);
597 return me;
598}
599
600
601struct test15_B {
602 virtual test15_B *foo1() { return 0; }
603 virtual test15_B *foo2() { return 0; }
604 virtual test15_B *foo3() { return 0; }
605 int i;
606};
607
608struct test15_NV1 {
609 virtual void fooNV1() { }
610 int i;
611};
612
613struct test15_B2 : test15_NV1, virtual test15_B {
614 virtual test15_B2 *foo1() { return 0; }
615 virtual test15_B2 *foo2() { return 0; }
616 int i;
617};
618
619struct test15_D : test15_NV1, virtual test15_B2 {
620 virtual test15_D *foo1() { return 0; }
621};
622
623// CHECK-LP64:__ZTV8test15_D:
624// CHECK-LP64-NEXT: .quad 32
625// CHECK-LP64-NEXT: .quad 16
626// CHECK-LP64-NEXT: .space 8
627// CHECK-LP64-NEXT: .quad __ZTI8test15_D
628// CHECK-LP64-NEXT: .quad __ZN10test15_NV16fooNV1Ev
629// CHECK-LP64-NEXT: .quad __ZN8test15_D4foo1Ev
630// CHECK-LP64-NEXT: .space 8
631// CHECK-LP64-NEXT: .quad 18446744073709551600
632// CHECK-LP64-NEXT: .space 8
633// CHECK-LP64-NEXT: .quad 16
634// CHECK-LP64-NEXT: .quad 18446744073709551600
635// CHECK-LP64-NEXT: .quad __ZTI8test15_D
636// CHECK-LP64-NEXT: .quad __ZN10test15_NV16fooNV1Ev
637// CHECK-LP64-NEXT: .quad __ZTcv0_n40_v0_n24_N8test15_D4foo1Ev
638// CHECK-LP64-NEXT: .quad __ZN9test15_B24foo2Ev
639// CHECK-LP64-NEXT: .space 8
640// CHECK-LP64-NEXT: .quad 18446744073709551600
641// CHECK-LP64-NEXT: .quad 18446744073709551584
642// CHECK-LP64-NEXT: .quad 18446744073709551584
643// CHECK-LP64-NEXT: .quad __ZTI8test15_D
644// CHECK-LP64-NEXT: .quad __ZTcv0_n24_v0_n32_N8test15_D4foo1Ev
645// CHECK-LP64-NEXT: .quad __ZTcv0_n32_v0_n24_N9test15_B24foo2Ev
646// CHECK-LP64-NEXT: .quad __ZN8test15_B4foo3Ev
647
Mike Stumpd9878a12009-10-13 10:55:21 +0000648
Mike Stump54150d92009-10-14 18:38:01 +0000649struct test16_NV1 {
650 virtual void fooNV1() { }
651virtual void foo_NV1() { }
652 int i;
653};
654
655struct test16_NV2 {
656 virtual test16_NV2* foo1() { return 0; }
657virtual void foo_NV2() { }
658virtual void foo_NV2b() { }
659 int i;
660};
661
662struct test16_B : public test16_NV1, test16_NV2 {
663 virtual test16_B *foo1() { return 0; }
664 virtual test16_B *foo2() { return 0; }
665 virtual test16_B *foo3() { return 0; }
666virtual void foo_B() { }
667 int i;
668};
669
670struct test16_B2 : test16_NV1, virtual test16_B {
671 virtual test16_B2 *foo1() { return 0; }
672 virtual test16_B2 *foo2() { return 0; }
673virtual void foo_B2() { }
674 int i;
675};
676
677struct test16_D : test16_NV1, virtual test16_B2 {
Mike Stump941e3f32009-11-05 05:01:19 +0000678 virtual void bar();
679 virtual test16_D *foo1();
Mike Stump54150d92009-10-14 18:38:01 +0000680};
681
Mike Stump941e3f32009-11-05 05:01:19 +0000682void test16_D::bar() { }
683
Mike Stump54150d92009-10-14 18:38:01 +0000684// CHECK-LP64: __ZTV8test16_D:
685// CHECK-LP64-NEXT: .quad 32
686// CHECK-LP64-NEXT: .quad 16
687// CHECK-LP64-NEXT: .space 8
688// CHECK-LP64-NEXT: .quad __ZTI8test16_D
689// CHECK-LP64-NEXT: .quad __ZN10test16_NV16fooNV1Ev
690// CHECK-LP64-NEXT: .quad __ZN10test16_NV17foo_NV1Ev
Mike Stump941e3f32009-11-05 05:01:19 +0000691// CHECK-LP64-NEXT: .quad __ZN8test16_D3barEv
Mike Stump54150d92009-10-14 18:38:01 +0000692// CHECK-LP64-NEXT: .quad __ZN8test16_D4foo1Ev
693// CHECK-LP64-NEXT: .space 8
694// CHECK-LP64-NEXT: .space 8
695// CHECK-LP64-NEXT: .quad 18446744073709551600
696// CHECK-LP64-NEXT: .space 8
697// CHECK-LP64-NEXT: .space 8
698// CHECK-LP64-NEXT: .quad 16
699// CHECK-LP64-NEXT: .quad 18446744073709551600
700// CHECK-LP64-NEXT: .quad __ZTI8test16_D
701// CHECK-LP64-NEXT: .quad __ZN10test16_NV16fooNV1Ev
702// CHECK-LP64-NEXT: .quad __ZN10test16_NV17foo_NV1Ev
703// CHECK-LP64-NEXT: .quad __ZTcv0_n48_v0_n24_N8test16_D4foo1Ev
704// CHECK-LP64-NEXT: .quad __ZN9test16_B24foo2Ev
705// CHECK-LP64-NEXT: .quad __ZN9test16_B26foo_B2Ev
706// CHECK-LP64-NEXT .quad 16
707// CHECK-LP64-NEXT .quad 16
708// CHECK-LP64-NEXT: .space 8
709// CHECK-LP64-NEXT: .space 8
710// CHECK-LP64: .quad 18446744073709551600
Mike Stump9e7e3c62009-11-06 23:27:42 +0000711// CHECK-LP64-NEXT: .quad 18446744073709551584
Mike Stump54150d92009-10-14 18:38:01 +0000712// CHECK-LP64-NEXT: .space 8
713// CHECK-LP64-NEXT: .space 8
714// CHECK-LP64-NEXT: .quad 18446744073709551584
715// CHECK-LP64-NEXT: .quad __ZTI8test16_D
716// CHECK-LP64-NEXT: .quad __ZN10test16_NV16fooNV1Ev
717// CHECK-LP64-NEXT: .quad __ZN10test16_NV17foo_NV1Ev
718// CHECK-LP64-NEXT: .quad __ZTcv0_n40_v0_n32_N8test16_D4foo1Ev
719// CHECK-LP64-NEXT: .quad __ZTcv0_n48_v0_n24_N9test16_B24foo2Ev
720// CHECK-LP64-NEXT: .quad __ZN8test16_B4foo3Ev
721// CHECK-LP64-NEXT: .quad __ZN8test16_B5foo_BEv
722// CHECK-LP64-NEXT: .quad 18446744073709551568
723// CHECK-LP64-NEXT: .quad __ZTI8test16_D
724// CHECK-LP64-NEXT .quad __ZTcvn16_n40_v16_n32_N8test16_D4foo1Ev
725// CHECK-LP64: .quad __ZN10test16_NV27foo_NV2Ev
726// CHECK-LP64-NEXT: .quad __ZN10test16_NV28foo_NV2bEv
727
Mike Stumpd9878a12009-10-13 10:55:21 +0000728
Mike Stump941e3f32009-11-05 05:01:19 +0000729// FIXME: This is the wrong thunk, but until these issues are fixed, better
730// than nothing.
Mike Stump599837a2009-11-06 00:18:25 +0000731// CHECK-LPLL64:define weak %class.test8_D* @_ZTcvn16_n72_v16_n32_N8test16_D4foo1Ev(%class.test8_D*) {
732// CHECK-LPLL64:entry:
733// CHECK-LPLL64: %retval = alloca %class.test8_D*
734// CHECK-LPLL64: %.addr = alloca %class.test8_D*
735// CHECK-LPLL64: store %class.test8_D* %0, %class.test8_D** %.addr
736// CHECK-LPLL64: %this = load %class.test8_D** %.addr
737// CHECK-LPLL64: %1 = bitcast %class.test8_D* %this to i8*
738// CHECK-LPLL64: %2 = getelementptr inbounds i8* %1, i64 -16
739// CHECK-LPLL64: %3 = bitcast i8* %2 to %class.test8_D*
740// CHECK-LPLL64: %4 = bitcast %class.test8_D* %3 to i8*
741// CHECK-LPLL64: %5 = bitcast %class.test8_D* %3 to i64**
742// CHECK-LPLL64: %vtable = load i64** %5
743// CHECK-LPLL64: %6 = getelementptr inbounds i64* %vtable, i64 -9
744// CHECK-LPLL64: %7 = load i64* %6
745// CHECK-LPLL64: %8 = getelementptr i8* %4, i64 %7
746// CHECK-LPLL64: %9 = bitcast i8* %8 to %class.test8_D*
747// CHECK-LPLL64: %call = call %class.test8_D* @_ZTch0_v16_n32_N8test16_D4foo1Ev(%class.test8_D* %9)
748// CHECK-LPLL64: store %class.test8_D* %call, %class.test8_D** %retval
749// CHECK-LPLL64: %10 = load %class.test8_D** %retval
750// CHECK-LPLL64: ret %class.test8_D* %10
751// CHECK-LPLL64:}
Mike Stump941e3f32009-11-05 05:01:19 +0000752
Mike Stumpa6604402009-11-13 18:53:35 +0000753// CHECK-LPLL64:define weak %class.test8_D* @_ZTch0_v16_n32_N8test16_D4foo1Ev(%class.test8_D*) {
Mike Stump599837a2009-11-06 00:18:25 +0000754// CHECK-LPLL64:entry:
755// CHECK-LPLL64: %retval = alloca %class.test8_D*
756// CHECK-LPLL64: %.addr = alloca %class.test8_D*
757// CHECK-LPLL64: store %class.test8_D* %0, %class.test8_D** %.addr
758// CHECK-LPLL64: %this = load %class.test8_D** %.addr
759// CHECK-LPLL64: %call = call %class.test8_D* @_ZN8test16_D4foo1Ev(%class.test8_D* %this)
760// CHECK-LPLL64: %1 = icmp ne %class.test8_D* %call, null
761// CHECK-LPLL64: br i1 %1, label %2, label %12
762// CHECK-LPLL64:; <label>:2
763// CHECK-LPLL64: %3 = bitcast %class.test8_D* %call to i8*
764// CHECK-LPLL64: %4 = getelementptr inbounds i8* %3, i64 16
765// CHECK-LPLL64: %5 = bitcast i8* %4 to %class.test8_D*
766// CHECK-LPLL64: %6 = bitcast %class.test8_D* %5 to i8*
767// CHECK-LPLL64: %7 = bitcast %class.test8_D* %5 to i64**
768// CHECK-LPLL64: %vtable = load i64** %7
769// CHECK-LPLL64: %8 = getelementptr inbounds i64* %vtable, i64 -4
770// CHECK-LPLL64: %9 = load i64* %8
771// CHECK-LPLL64: %10 = getelementptr i8* %6, i64 %9
772// CHECK-LPLL64: %11 = bitcast i8* %10 to %class.test8_D*
773// CHECK-LPLL64: br label %13
774// CHECK-LPLL64:; <label>:12
775// CHECK-LPLL64: br label %13
776// CHECK-LPLL64:; <label>:13
777// CHECK-LPLL64: %14 = phi %class.test8_D* [ %11, %2 ], [ %call, %12 ]
778// CHECK-LPLL64: store %class.test8_D* %14, %class.test8_D** %retval
779// CHECK-LPLL64: %15 = load %class.test8_D** %retval
780// CHECK-LPLL64: ret %class.test8_D* %15
781// CHECK-LPLL64:}
Mike Stump941e3f32009-11-05 05:01:19 +0000782
783
Mike Stump7809e0d2009-10-28 00:35:46 +0000784class test17_B1 {
785 virtual void foo() = 0;
786 virtual void bar() { }
787};
788
789class test17_B2 : public test17_B1 {
790 void foo() { }
791 virtual void bar() = 0;
792};
793
794class test17_D : public test17_B2 {
795 void bar() { }
Mike Stump62db2452009-11-03 19:28:52 +0000796};
Mike Stump7809e0d2009-10-28 00:35:46 +0000797
798
799// CHECK-LP64:__ZTV8test17_D:
800// CHECK-LP64-NEXT: .space 8
801// CHECK-LP64-NEXT: .quad __ZTI8test17_D
802// CHECK-LP64-NEXT: .quad __ZN9test17_B23fooEv
803// CHECK-LP64-NEXT: .quad __ZN8test17_D3barEv
804
805// CHECK-LP64:__ZTV9test17_B2:
806// CHECK-LP64-NEXT: .space 8
807// CHECK-LP64-NEXT: .quad __ZTI9test17_B2
808// CHECK-LP64-NEXT: .quad __ZN9test17_B23fooEv
809// CHECK-LP64-NEXT: .quad ___cxa_pure_virtual
810
811// CHECK-LP64:__ZTV9test17_B1:
812// CHECK-LP64-NEXT: .space 8
813// CHECK-LP64-NEXT: .quad __ZTI9test17_B1
814// CHECK-LP64-NEXT: .quad ___cxa_pure_virtual
815// CHECK-LP64-NEXT: .quad __ZN9test17_B13barEv
816
817
Mike Stump9c212892009-11-03 19:03:17 +0000818struct test18_NV1 {
819 virtual void fooNV1() { }
820virtual void foo_NV1() { }
821 int i;
822};
823
824struct test18_NV2 {
825 virtual test18_NV2& foo1() { return *this; }
826virtual void foo_NV2() { }
827virtual void foo_NV2b() { }
828 int i;
829};
830
831struct test18_B : public test18_NV1, test18_NV2 {
832 virtual test18_B& foo1() { return *this; }
833 virtual test18_B *foo2() { return 0; }
834 virtual test18_B *foo3() { return 0; }
835virtual void foo_B() { }
836 int i;
837};
838
839struct test18_B2 : test18_NV1, virtual test18_B {
840 virtual test18_B2& foo1() { return *this; }
841 virtual test18_B2 *foo2() { return 0; }
842virtual void foo_B2() { }
843 int i;
844};
845
846struct test18_D : test18_NV1, virtual test18_B2 {
847 virtual test18_D& foo1() { return *this; }
Mike Stump62db2452009-11-03 19:28:52 +0000848};
849
850
851struct test19_VB1 { };
852struct test19_B1 : public virtual test19_VB1 {
853 virtual void fB1() { }
854 virtual void foB1B2() { }
855 virtual void foB1B3() { }
856 virtual void foB1B4() { }
857};
858
859struct test19_VB2 { };
860struct test19_B2: public test19_B1, public virtual test19_VB2 {
861 virtual void foB1B2() { }
862 virtual void foB1B3() { }
863 virtual void foB1B4() { }
864
865 virtual void fB2() { }
866 virtual void foB2B3() { }
867 virtual void foB2B4() { }
868};
869
870struct test19_VB3 { };
871struct test19_B3: virtual public test19_B2, public virtual test19_VB3 {
872 virtual void foB1B3() { }
873 virtual void foB1B4() { }
874
875 virtual void foB2B3() { }
876 virtual void foB2B4() { }
877
878 virtual void fB3() { }
879 virtual void foB3B4() { }
880};
881
882struct test19_VB4 { };
883struct test19_B4: public test19_B3, public virtual test19_VB4 {
884 virtual void foB1B4() { }
885
886 virtual void foB2B4() { }
887
888 virtual void foB3B4() { }
889
890 virtual void fB4() { }
891};
892
893struct test19_D : virtual test19_B4 {
894};
895
896
897// CHECK-LP64: __ZTV8test19_D:
898// CHECK-LP64-NEXT: .space 8
899// CHECK-LP64-NEXT: .space 8
900// CHECK-LP64-NEXT: .space 8
901// CHECK-LP64-NEXT: .space 8
902// CHECK-LP64-NEXT: .space 8
903// CHECK-LP64-NEXT: .space 8
904// CHECK-LP64-NEXT: .space 8
905// CHECK-LP64-NEXT: .space 8
906// CHECK-LP64-NEXT: .space 8
907// CHECK-LP64-NEXT: .space 8
908// CHECK-LP64-NEXT: .space 8
909// CHECK-LP64-NEXT: .space 8
910// CHECK-LP64-NEXT: .space 8
911// CHECK-LP64-NEXT: .space 8
912// CHECK-LP64-NEXT: .space 8
913// CHECK-LP64-NEXT: .space 8
914// CHECK-LP64-NEXT: .space 8
915// CHECK-LP64-NEXT: .quad __ZTI8test19_D
Mike Stump9e7e3c62009-11-06 23:27:42 +0000916// CHECK-LP64-NEXT: .quad __ZN9test19_B13fB1Ev
917// CHECK-LP64-NEXT: .quad __ZN9test19_B26foB1B2Ev
918// CHECK-LP64-NEXT: .quad __ZN9test19_B36foB1B3Ev
919// CHECK-LP64-NEXT: .quad __ZN9test19_B46foB1B4Ev
920// CHECK-LP64-NEXT: .quad __ZN9test19_B23fB2Ev
921// CHECK-LP64-NEXT: .quad __ZN9test19_B36foB2B3Ev
922// CHECK-LP64-NEXT: .quad __ZN9test19_B46foB2B4Ev
923// CHECK-LP64-NEXT: .quad __ZN9test19_B33fB3Ev
924// CHECK-LP64-NEXT: .quad __ZN9test19_B46foB3B4Ev
925// CHECK-LP64-NEXT: .quad __ZN9test19_B43fB4Ev
Mike Stump62db2452009-11-03 19:28:52 +0000926
Mike Stump2cdcbdb2009-11-13 21:40:38 +0000927// CHECK-LP64: __ZTT8test19_D:
928// CHECK-LP64-NEXT: .quad (__ZTV8test19_D) + 144
929// CHECK-LP64-NEXT: .quad (__ZTV8test19_D) + 144
930// CHECK-LP64-NEXT .quad (__ZTV8test19_D) + 144
931// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B4) + 136
932// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B3) + 104
933// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B3) + 104
934// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B4) + 136
935// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B2) + 88
936// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B1) + 24
937
Mike Stump9c212892009-11-03 19:03:17 +0000938
Mike Stump99faefd2009-11-05 05:26:28 +0000939class test20_V {
940 virtual void foo1();
941};
942class test20_V1 {
943 virtual void foo2();
944};
945class test20_B : virtual test20_V {
946} b;
947class test20_B1 : virtual test20_V1 {
948};
949class test20_D : public test20_B, public test20_B1 {
Mike Stump33c530e2009-11-06 02:38:24 +0000950};
Mike Stump99faefd2009-11-05 05:26:28 +0000951
952// CHECK-LP64: __ZTV8test20_D:
953// CHECK-LP64-NEXT: .quad 8
954// CHECK-LP64-NEXT: .space 8
955// CHECK-LP64-NEXT: .space 8
956// CHECK-LP64-NEXT: .space 8
957// CHECK-LP64-NEXT: .quad __ZTI8test20_D
958// CHECK-LP64-NEXT: .quad __ZN8test20_V4foo1Ev
959// CHECK-LP64-NEXT: .space 8
960// CHECK-LP64-NEXT: .space 8
961// CHECK-LP64-NEXT: .quad 18446744073709551608
962// CHECK-LP64-NEXT: .quad __ZTI8test20_D
963// CHECK-LP64-NEXT: .quad __ZN9test20_V14foo2Ev
964
Mike Stump513225f2009-11-13 21:55:26 +0000965// CHECK-LP64: __ZTC8test20_D0_8test20_B:
966// CHECK-LP64-NEXT: .space 8
967// CHECK-LP64-NEXT: .space 8
968// CHECK-LP64-NEXT: .space 8
969// CHECK-LP64-NEXT: .quad __ZTI8test20_B
970// CHECK-LP64-NEXT: .quad __ZN8test20_V4foo1Ev
971
972// CHECK-LP64: __ZTC8test20_D8_9test20_B1:
973// CHECK-LP64-NEXT: .space 8
974// CHECK-LP64-NEXT: .space 8
975// CHECK-LP64-NEXT: .space 8
976// CHECK-LP64-NEXT: .quad __ZTI9test20_B1
977// CHECK-LP64-NEXT: .quad __ZN9test20_V14foo2Ev
978
Mike Stump2cdcbdb2009-11-13 21:40:38 +0000979// CHECK-LP64: __ZTT8test20_D:
980// CHECK-LP64-NEXT: .quad (__ZTV8test20_D) + 40
981// CHECK-LP64-NEXT: .quad (__ZTC8test20_D0_8test20_B) + 32
982// CHECK-LP64-NEXT: .quad (__ZTC8test20_D0_8test20_B) + 32
983// CHECK-LP64-NEXT: .quad (__ZTC8test20_D8_9test20_B1) + 32
984// CHECK-LP64-NEXT: .quad (__ZTC8test20_D8_9test20_B1) + 32
985// CHECK-LP64-NEXT .quad (__ZTV8test20_D) + 40
986// CHECK-LP64-NEXT .quad (__ZTV8test20_D) + 80
987// CHECK-LP64-NEXT .quad (__ZTV8test20_D) + 80
988
Mike Stump99faefd2009-11-05 05:26:28 +0000989
Mike Stump33c530e2009-11-06 02:38:24 +0000990class test21_V {
Mike Stumpa6604402009-11-13 18:53:35 +0000991 virtual void foo() { }
Mike Stump33c530e2009-11-06 02:38:24 +0000992};
993class test21_V1 {
Mike Stumpa6604402009-11-13 18:53:35 +0000994 virtual void foo() { }
Mike Stump33c530e2009-11-06 02:38:24 +0000995};
996class test21_B : virtual test21_V {
997};
998class test21_B1 : virtual test21_V1 {
999};
1000class test21_D : public test21_B, public test21_B1 {
1001 void foo() { }
1002};
1003
1004// CHECK-LP64: __ZTV8test21_D:
1005// CHECK-LP64-NEXT: .quad 8
1006// CHECK-LP64-NEXT: .space 8
1007// CHECK-LP64-NEXT: .space 8
1008// CHECK-LP64-NEXT: .space 8
1009// CHECK-LP64-NEXT: .quad __ZTI8test21_D
1010// CHECK-LP64-NEXT: .quad __ZN8test21_D3fooEv
1011// CHECK-LP64-NEXT: .space 8
1012// CHECK-LP64-NEXT: .quad 18446744073709551608
1013// CHECK-LP64-NEXT: .quad 18446744073709551608
1014// CHECK-LP64-NEXT: .quad __ZTI8test21_D
Mike Stump9e7e3c62009-11-06 23:27:42 +00001015// CHECK-LP64-NEXT: .quad __ZTv0_n24_N8test21_D3fooEv
Mike Stump33c530e2009-11-06 02:38:24 +00001016
Mike Stump513225f2009-11-13 21:55:26 +00001017// CHECK-LP64: __ZTC8test21_D0_8test21_B:
1018// CHECK-LP64-NEXT: .space 8
1019// CHECK-LP64-NEXT: .space 8
1020// CHECK-LP64-NEXT: .space 8
1021// CHECK-LP64-NEXT: .quad __ZTI8test21_B
1022// CHECK-LP64-NEXT: .quad __ZN8test21_V3fooEv
1023
1024// CHECK-LP64: __ZTC8test21_D8_9test21_B1:
1025// CHECK-LP64-NEXT: .space 8
1026// CHECK-LP64-NEXT: .space 8
1027// CHECK-LP64-NEXT: .space 8
1028// CHECK-LP64-NEXT: .quad __ZTI9test21_B1
1029// CHECK-LP64-NEXT: .quad __ZN9test21_V13fooEv
1030
Mike Stump9326c562009-11-13 19:36:46 +00001031// CHECK-LP64: __ZTT8test21_D:
1032// CHECK-LP64-NEXT: .quad (__ZTV8test21_D) + 40
1033// CHECK-LP64-NEXT: .quad (__ZTC8test21_D0_8test21_B) + 32
1034// CHECK-LP64-NEXT: .quad (__ZTC8test21_D0_8test21_B) + 32
1035// CHECK-LP64-NEXT: .quad (__ZTC8test21_D8_9test21_B1) + 32
1036// CHECK-LP64-NEXT: .quad (__ZTC8test21_D8_9test21_B1) + 32
1037// CHECK-LP64-NEXT .quad (__ZTV8test21_D) + 40
1038// CHECK-LP64-NEXT .quad (__ZTV8test21_D) + 80
1039// CHECK-LP64-NEXT .quad (__ZTV8test21_D) + 80
1040
Mike Stump33c530e2009-11-06 02:38:24 +00001041
Mike Stump7809e0d2009-10-28 00:35:46 +00001042
Mike Stump26899b02009-08-05 22:48:36 +00001043// CHECK-LP64: __ZTV1B:
Mike Stumpb46c92d2009-08-19 02:06:38 +00001044// CHECK-LP64-NEXT: .space 8
1045// CHECK-LP64-NEXT: .quad __ZTI1B
Mike Stump4ec04c42009-08-16 02:40:14 +00001046// CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev
1047// CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev
Mike Stump26899b02009-08-05 22:48:36 +00001048
Mike Stump06758d02009-08-04 20:37:29 +00001049// CHECK-LP64: __ZTV1A:
Mike Stump4ec04c42009-08-16 02:40:14 +00001050// CHECK-LP64-NEXT: .space 8
Mike Stumpb46c92d2009-08-19 02:06:38 +00001051// CHECK-LP64-NEXT: .quad __ZTI1A
Mike Stump4ec04c42009-08-16 02:40:14 +00001052// CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev
1053// CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev
1054// CHECK-LP64-NEXT: .quad __ZN1A4foo1Ev
1055// CHECK-LP64-NEXT: .quad __ZN1A4foo2Ev
Mike Stumpb46c92d2009-08-19 02:06:38 +00001056// CHECK-LP64-NEXT: .quad 18446744073709551600
Mike Stump4ec04c42009-08-16 02:40:14 +00001057// CHECK-LP64-NEXT: .quad __ZTI1A
1058// CHECK-LP64-NEXT: .quad __ZN1C4bee1Ev
1059// CHECK-LP64-NEXT: .quad __ZN1C4bee2Ev
Mike Stump06758d02009-08-04 20:37:29 +00001060
Mike Stump8a12b562009-08-06 15:50:11 +00001061// CHECK-LP64: __ZTV1F:
Mike Stump4ec04c42009-08-16 02:40:14 +00001062// CHECK-LP64-NEXT: .space 8
1063// CHECK-LP64-NEXT: .quad 16
1064// CHECK-LP64-NEXT: .space 8
1065// CHECK-LP64-NEXT: .space 8
Mike Stumpb46c92d2009-08-19 02:06:38 +00001066// CHECK-LP64-NEXT: .quad __ZTI1F
Mike Stump4ec04c42009-08-16 02:40:14 +00001067// CHECK-LP64-NEXT: .quad __ZN1D3booEv
1068// CHECK-LP64-NEXT: .quad __ZN1F3fooEv
1069// CHECK-LP64-NEXT: .space 8
1070// CHECK-LP64-NEXT: .space 8
1071// CHECK-LP64-NEXT: .space 8
1072// CHECK-LP64-NEXT: .space 8
1073// CHECK-LP64-NEXT: .space 8
1074// CHECK-LP64-NEXT: .quad 18446744073709551600
1075// CHECK-LP64-NEXT: .quad __ZTI1F
1076// CHECK-LP64-NEXT: .quad __ZN2D13barEv
1077// CHECK-LP64-NEXT: .quad __ZN2D14bar2Ev
1078// CHECK-LP64-NEXT: .quad __ZN2D14bar3Ev
1079// CHECK-LP64-NEXT: .quad __ZN2D14bar4Ev
1080// CHECK-LP64-NEXT: .quad __ZN2D14bar5Ev
Mike Stump49520942009-08-11 04:03:59 +00001081
Mike Stump33c530e2009-11-06 02:38:24 +00001082test21_D d21;
1083test20_D d20;
Mike Stump62db2452009-11-03 19:28:52 +00001084test19_D d19;
1085test18_D d18;
1086test17_D d17;
Mike Stump54150d92009-10-14 18:38:01 +00001087test16_D d16;
Mike Stumpd9878a12009-10-13 10:55:21 +00001088test15_D d15;
1089test13_D d13;
Mike Stumpb9871a22009-08-21 01:45:00 +00001090test11_D d11;
Mike Stumpb9837442009-08-20 07:22:17 +00001091test10_D d10;
Mike Stump09765ec2009-08-19 02:53:08 +00001092test9_D d9;
1093test8_D d8;
1094
Mike Stumpd76264e2009-08-12 21:50:08 +00001095test5_D d5;
Mike Stump34fae9c2009-08-12 18:50:26 +00001096test4_D d4;
1097test3_D d3;
Mike Stump78846782009-08-13 23:33:29 +00001098
1099test6_D d6;
1100test7_D d7;