blob: 20ea1d5301a73994c09e1a3b3e1518a111ef1c2b [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++0x -O0 -S %s -o %t-64.s
Daniel Dunbar4fcfde42009-11-08 01:45:36 +00002// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s
Mike Stump49520942009-08-11 04:03:59 +00003
Daniel Dunbara5728872009-12-15 20:14:24 +00004// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++0x -emit-llvm %s -o %t-64.ll
Daniel Dunbar4fcfde42009-11-08 01:45:36 +00005// RUN: FileCheck -check-prefix LPLL64 --input-file=%t-64.ll %s
Mike Stump49520942009-08-11 04:03:59 +00006
Mike Stumpa84b4042009-11-20 00:02:19 +00007
8// CHECK-LP64: main:
9// CHECK-LP64: movl $1, 12(%rax)
10// CHECK-LP64: movl $2, 8(%rax)
11
Mike Stump104ffaa2009-08-04 21:58:42 +000012struct B {
13 virtual void bar1();
14 virtual void bar2();
Mike Stump2effeca2009-08-06 00:38:46 +000015 int b;
Mike Stump104ffaa2009-08-04 21:58:42 +000016};
Mike Stump6f376332009-08-05 22:37:18 +000017void B::bar1() { }
18void B::bar2() { }
19
Mike Stumpa84b4042009-11-20 00:02:19 +000020// CHECK-LP64: __ZTV1B:
Chris Lattnerf79df052010-01-20 07:45:09 +000021// CHECK-LP64-NEXT: .quad 0
Mike Stumpa84b4042009-11-20 00:02:19 +000022// CHECK-LP64-NEXT: .quad __ZTI1B
23// CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev
24// CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev
25
Mike Stump6f376332009-08-05 22:37:18 +000026struct C {
27 virtual void bee1();
28 virtual void bee2();
29};
30void C::bee1() { }
31void C::bee2() { }
Mike Stump104ffaa2009-08-04 21:58:42 +000032
Mike Stump2effeca2009-08-06 00:38:46 +000033struct D {
34 virtual void boo();
35};
36void D::boo() { }
Mike Stump104ffaa2009-08-04 21:58:42 +000037
Mike Stumpc5708d92009-08-06 14:12:47 +000038struct D1 {
39 virtual void bar();
Mike Stump02cf1e22009-08-06 23:48:32 +000040 virtual void bar2();
41 virtual void bar3();
42 virtual void bar4();
43 virtual void bar5();
Mike Stumpc5708d92009-08-06 14:12:47 +000044 void *d1;
45};
46void D1::bar() { }
47
48class F : virtual public D1, virtual public D {
49public:
50 virtual void foo();
51 void *f;
52};
53void F::foo() { }
54
Mike Stumpa84b4042009-11-20 00:02:19 +000055// CHECK-LP64: __ZTV1F:
Chris Lattnerf79df052010-01-20 07:45:09 +000056// CHECK-LP64-NEXT: .quad 0
Mike Stumpa84b4042009-11-20 00:02:19 +000057// CHECK-LP64-NEXT: .quad 16
Chris Lattnerf79df052010-01-20 07:45:09 +000058// CHECK-LP64-NEXT: .quad 0
59// CHECK-LP64-NEXT: .quad 0
Mike Stumpa84b4042009-11-20 00:02:19 +000060// CHECK-LP64-NEXT: .quad __ZTI1F
61// CHECK-LP64-NEXT: .quad __ZN1D3booEv
62// CHECK-LP64-NEXT: .quad __ZN1F3fooEv
Chris Lattnerf79df052010-01-20 07:45:09 +000063// CHECK-LP64-NEXT: .quad 0
64// CHECK-LP64-NEXT: .quad 0
65// CHECK-LP64-NEXT: .quad 0
66// CHECK-LP64-NEXT: .quad 0
67// CHECK-LP64-NEXT: .quad 0
Mike Stumpa84b4042009-11-20 00:02:19 +000068// CHECK-LP64-NEXT: .quad 18446744073709551600
69// CHECK-LP64-NEXT: .quad __ZTI1F
70// CHECK-LP64-NEXT: .quad __ZN2D13barEv
71// CHECK-LP64-NEXT: .quad __ZN2D14bar2Ev
72// CHECK-LP64-NEXT: .quad __ZN2D14bar3Ev
73// CHECK-LP64-NEXT: .quad __ZN2D14bar4Ev
74// CHECK-LP64-NEXT: .quad __ZN2D14bar5Ev
75
76
Mike Stumpc5708d92009-08-06 14:12:47 +000077int j;
Mike Stump941e3f32009-11-05 05:01:19 +000078void *vp;
Mike Stumpc5708d92009-08-06 14:12:47 +000079void test2() {
80 F f;
81 static int sz = (char *)(&f.f) - (char *)(&f);
Mike Stump941e3f32009-11-05 05:01:19 +000082 vp = &sz;
Mike Stumpc5708d92009-08-06 14:12:47 +000083 j = sz;
Mike Stump37148f42009-08-06 14:16:19 +000084 // FIXME: These should result in a frontend constant a la fold, no run time
85 // initializer
Mike Stump599837a2009-11-06 00:18:25 +000086 // CHECK-LPLL64: define void @_Z5test2v()
87 // CHECK-LPLL64: = getelementptr inbounds %class.F* %f, i32 0, i32 1
Mike Stumpc5708d92009-08-06 14:12:47 +000088}
Mike Stump8a12b562009-08-06 15:50:11 +000089
Mike Stumpc5708d92009-08-06 14:12:47 +000090static_assert(sizeof(F) == sizeof(void*)*4, "invalid vbase size");
91
Mike Stump2effeca2009-08-06 00:38:46 +000092struct E {
93 int e;
94};
95
96static_assert (sizeof (C) == (sizeof(void *)), "vtable pointer layout");
97
Mike Stumpeb19fa92009-08-06 13:41:24 +000098class A : public E, public B, public C {
Mike Stump3dee6ef2009-07-30 00:22:38 +000099public:
Mike Stump06758d02009-08-04 20:37:29 +0000100 virtual void foo1();
101 virtual void foo2();
102 A() { }
Mike Stump2effeca2009-08-06 00:38:46 +0000103 int a;
104} *ap;
Mike Stump6f376332009-08-05 22:37:18 +0000105void A::foo1() { }
106void A::foo2() { }
Mike Stump3dee6ef2009-07-30 00:22:38 +0000107
Mike Stump06758d02009-08-04 20:37:29 +0000108int main() {
109 A a;
Mike Stump26899b02009-08-05 22:48:36 +0000110 B b;
Mike Stump2effeca2009-08-06 00:38:46 +0000111 ap->e = 1;
112 ap->b = 2;
Mike Stump06758d02009-08-04 20:37:29 +0000113}
114
Mike Stumpa84b4042009-11-20 00:02:19 +0000115// CHECK-LP64: __ZTV1A:
Chris Lattnerf79df052010-01-20 07:45:09 +0000116// CHECK-LP64-NEXT: .quad 0
Mike Stumpa84b4042009-11-20 00:02:19 +0000117// CHECK-LP64-NEXT: .quad __ZTI1A
118// CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev
119// CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev
120// CHECK-LP64-NEXT: .quad __ZN1A4foo1Ev
121// CHECK-LP64-NEXT: .quad __ZN1A4foo2Ev
122// CHECK-LP64-NEXT: .quad 18446744073709551600
123// CHECK-LP64-NEXT: .quad __ZTI1A
124// CHECK-LP64-NEXT: .quad __ZN1C4bee1Ev
125// CHECK-LP64-NEXT: .quad __ZN1C4bee2Ev
126
Mike Stump2effeca2009-08-06 00:38:46 +0000127
Mike Stumpf0070db2009-08-26 20:46:33 +0000128struct test12_A {
129 virtual void foo0() { }
130 virtual void foo();
131} *test12_pa;
132
133struct test12_B : public test12_A {
134 virtual void foo() { }
135} *test12_pb;
136
137struct test12_D : public test12_B {
138} *test12_pd;
139void test12_foo() {
140 test12_pa->foo0();
141 test12_pb->foo0();
142 test12_pd->foo0();
143 test12_pa->foo();
144 test12_pb->foo();
145 test12_pd->foo();
146 test12_pa->test12_A::foo();
147}
148
Mike Stump599837a2009-11-06 00:18:25 +0000149// CHECK-LPLL64:define void @_Z10test12_foov() nounwind {
Anders Carlsson4b3e5be2009-12-16 17:27:20 +0000150// CHECK-LPLL64: call void %
151// CHECK-LPLL64: call void %
152// CHECK-LPLL64: call void %
153// CHECK-LPLL64: call void %
154// CHECK-LPLL64: call void %
155// CHECK-LPLL64: call void %
Mike Stump1d9e0aa2010-01-13 20:43:31 +0000156// CHECK-LPLL64: call void @_ZN8test12_A3fooEv(%class.test14* %{{.*}})
Mike Stump49520942009-08-11 04:03:59 +0000157
Mike Stump941e3f32009-11-05 05:01:19 +0000158
Mike Stump94d0bce2009-08-13 00:34:14 +0000159struct test6_B2 { virtual void funcB2(); char b[1000]; };
160struct test6_B1 : virtual test6_B2 { virtual void funcB1(); };
161
162struct test6_D : test6_B2, virtual test6_B1 {
163};
164
Anders Carlsson0d8bb8e2010-01-18 03:58:13 +0000165// CHECK-LP64: .zerofill __DATA,__common,_d6,2024,4
Mike Stump94d0bce2009-08-13 00:34:14 +0000166
Mike Stump78846782009-08-13 23:33:29 +0000167struct test7_B2 { virtual void funcB2(); };
168struct test7_B1 : virtual test7_B2 { virtual void funcB1(); };
169
170struct test7_D : test7_B2, virtual test7_B1 {
171};
172
Anders Carlsson0d8bb8e2010-01-18 03:58:13 +0000173// CHECK-LP64: .zerofill __DATA,__common,_d7,16,3
Mike Stump94d0bce2009-08-13 00:34:14 +0000174
175
Mike Stump49520942009-08-11 04:03:59 +0000176struct test3_B3 { virtual void funcB3(); };
177struct test3_B2 : virtual test3_B3 { virtual void funcB2(); };
178struct test3_B1 : virtual test3_B2 { virtual void funcB1(); };
179
Mike Stumpf0070db2009-08-26 20:46:33 +0000180struct test3_D : virtual test3_B1 {
Mike Stump49520942009-08-11 04:03:59 +0000181 virtual void funcD() { }
182};
183
Mike Stump49520942009-08-11 04:03:59 +0000184// CHECK-LP64:__ZTV7test3_D:
Chris Lattnerf79df052010-01-20 07:45:09 +0000185// CHECK-LP64-NEXT: .quad 0
186// CHECK-LP64-NEXT: .quad 0
187// CHECK-LP64-NEXT: .quad 0
188// CHECK-LP64-NEXT: .quad 0
189// CHECK-LP64-NEXT: .quad 0
190// CHECK-LP64-NEXT: .quad 0
191// CHECK-LP64-NEXT: .quad 0
Mike Stump666a91e2009-08-21 18:05:02 +0000192// CHECK-LP64-NEXT: .quad __ZTI7test3_D
Mike Stump4ec04c42009-08-16 02:40:14 +0000193// CHECK-LP64-NEXT: .quad __ZN8test3_B36funcB3Ev
194// CHECK-LP64-NEXT: .quad __ZN8test3_B26funcB2Ev
195// CHECK-LP64-NEXT: .quad __ZN8test3_B16funcB1Ev
196// CHECK-LP64-NEXT: .quad __ZN7test3_D5funcDEv
Mike Stump49520942009-08-11 04:03:59 +0000197
Mike Stump34fae9c2009-08-12 18:50:26 +0000198struct test4_D : virtual B, virtual C {
199};
200
Mike Stump34fae9c2009-08-12 18:50:26 +0000201// CHECK-LP64:__ZTV7test4_D:
Chris Lattnerf79df052010-01-20 07:45:09 +0000202// CHECK-LP64-NEXT: .quad 0
Mike Stump4ec04c42009-08-16 02:40:14 +0000203// CHECK-LP64-NEXT: .quad 8
Chris Lattnerf79df052010-01-20 07:45:09 +0000204// CHECK-LP64-NEXT: .quad 0
205// CHECK-LP64-NEXT: .quad 0
206// CHECK-LP64-NEXT: .quad 0
Mike Stump4ec04c42009-08-16 02:40:14 +0000207// CHECK-LP64-NEXT: .quad __ZTI7test4_D
208// CHECK-LP64-NEXT: .quad __ZN1C4bee1Ev
209// CHECK-LP64-NEXT: .quad __ZN1C4bee2Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000210// CHECK-LP64-NEXT: .quad 0
211// CHECK-LP64-NEXT: .quad 0
Mike Stump4ec04c42009-08-16 02:40:14 +0000212// CHECK-LP64-NEXT: .quad 18446744073709551608
213// CHECK-LP64-NEXT: .quad __ZTI7test4_D
214// CHECK-LP64-NEXT: .quad __ZN1B4bar1Ev
215// CHECK-LP64-NEXT: .quad __ZN1B4bar2Ev
Mike Stump34fae9c2009-08-12 18:50:26 +0000216
Mike Stump49520942009-08-11 04:03:59 +0000217
Mike Stumpd76264e2009-08-12 21:50:08 +0000218struct test5_B3 { virtual void funcB3(); };
219struct test5_B2 : virtual test5_B3 { virtual void funcB2(); };
220struct test5_B1 : virtual test5_B2 { virtual void funcB1(); };
221
222struct test5_B23 { virtual void funcB23(); };
223struct test5_B22 : virtual test5_B23 { virtual void funcB22(); };
224struct test5_B21 : virtual test5_B22 { virtual void funcB21(); };
225
226
227struct B232 { virtual void funcB232(); };
228struct B231 { virtual void funcB231(); };
229
230struct test5_B33 { virtual void funcB33(); };
231struct test5_B32 : virtual test5_B33, virtual B232 { virtual void funcB32(); };
232struct test5_B31 : virtual test5_B32, virtual B231 { virtual void funcB31(); };
233
234struct test5_D : virtual test5_B1, virtual test5_B21, virtual test5_B31 {
235 virtual void funcD() { }
236};
237
Mike Stumpd76264e2009-08-12 21:50:08 +0000238// CHECK-LP64:__ZTV7test5_D:
Mike Stump4ec04c42009-08-16 02:40:14 +0000239// CHECK-LP64-NEXT: .quad 32
240// CHECK-LP64-NEXT: .quad 24
Mike Stumpfe3010d2009-08-16 19:04:13 +0000241// CHECK-LP64-NEXT: .quad 16
242// CHECK-LP64-NEXT: .quad 16
243// CHECK-LP64-NEXT: .quad 16
244// CHECK-LP64-NEXT: .quad 8
245// CHECK-LP64-NEXT: .quad 8
246// CHECK-LP64-NEXT: .quad 8
Chris Lattnerf79df052010-01-20 07:45:09 +0000247// CHECK-LP64-NEXT: .quad 0
248// CHECK-LP64-NEXT: .quad 0
249// CHECK-LP64-NEXT: .quad 0
250// CHECK-LP64-NEXT: .quad 0
251// CHECK-LP64-NEXT: .quad 0
252// CHECK-LP64-NEXT: .quad 0
253// CHECK-LP64-NEXT: .quad 0
Mike Stumpb9837442009-08-20 07:22:17 +0000254// CHECK-LP64-NEXT: .quad __ZTI7test5_D
Mike Stump4ec04c42009-08-16 02:40:14 +0000255// CHECK-LP64-NEXT: .quad __ZN8test5_B36funcB3Ev
256// CHECK-LP64-NEXT: .quad __ZN8test5_B26funcB2Ev
257// CHECK-LP64-NEXT: .quad __ZN8test5_B16funcB1Ev
258// CHECK-LP64-NEXT: .quad __ZN7test5_D5funcDEv
Chris Lattnerf79df052010-01-20 07:45:09 +0000259// CHECK-LP64-NEXT: .quad 0
260// CHECK-LP64-NEXT: .quad 0
261// CHECK-LP64-NEXT: .quad 0
262// CHECK-LP64-NEXT: .quad 0
263// CHECK-LP64-NEXT: .quad 0
Mike Stumpbf3fe202009-08-27 01:09:45 +0000264// CHECK-LP64-NEXT: .quad 18446744073709551608
Mike Stumpfe3010d2009-08-16 19:04:13 +0000265// CHECK-LP64-NEXT: .quad __ZTI7test5_D
Mike Stump4ec04c42009-08-16 02:40:14 +0000266// CHECK-LP64-NEXT: .quad __ZN9test5_B237funcB23Ev
267// CHECK-LP64-NEXT: .quad __ZN9test5_B227funcB22Ev
268// CHECK-LP64-NEXT: .quad __ZN9test5_B217funcB21Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000269// CHECK-LP64-NEXT: .quad 0
Mike Stump6a9612f2009-10-31 20:06:59 +0000270// CHECK-LP64-NEXT: .quad 16
Chris Lattnerf79df052010-01-20 07:45:09 +0000271// CHECK-LP64-NEXT: .quad 0
272// CHECK-LP64-NEXT: .quad 0
Mike Stump6a9612f2009-10-31 20:06:59 +0000273// CHECK-LP64-NEXT: .quad 8
Chris Lattnerf79df052010-01-20 07:45:09 +0000274// CHECK-LP64-NEXT: .quad 0
275// CHECK-LP64-NEXT: .quad 0
Mike Stump74be00b2009-09-01 22:01:25 +0000276// CHECK-LP64-NEXT: .quad 18446744073709551600
Mike Stumpfe3010d2009-08-16 19:04:13 +0000277// CHECK-LP64-NEXT: .quad __ZTI7test5_D
Mike Stump4ec04c42009-08-16 02:40:14 +0000278// CHECK-LP64-NEXT: .quad __ZN9test5_B337funcB33Ev
279// CHECK-LP64-NEXT: .quad __ZN9test5_B327funcB32Ev
280// CHECK-LP64-NEXT: .quad __ZN9test5_B317funcB31Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000281// CHECK-LP64-NEXT: .quad 0
Mike Stump4ec04c42009-08-16 02:40:14 +0000282// CHECK-LP64-NEXT: .quad 18446744073709551592
283// CHECK-LP64-NEXT: .quad __ZTI7test5_D
284// CHECK-LP64-NEXT: .quad __ZN4B2328funcB232Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000285// CHECK-LP64-NEXT: .quad 0
Mike Stumpb9837442009-08-20 07:22:17 +0000286// CHECK-LP64-NEXT: .quad 18446744073709551584
Mike Stump4ec04c42009-08-16 02:40:14 +0000287// CHECK-LP64-NEXT: .quad __ZTI7test5_D
288// CHECK-LP64-NEXT: .quad __ZN4B2318funcB231Ev
Mike Stumpd76264e2009-08-12 21:50:08 +0000289
Mike Stump276b9f12009-08-16 01:46:26 +0000290struct test8_B1 {
291 virtual void ftest8_B1() { }
292};
293struct test8_B2aa {
294 virtual void ftest8_B2aa() { }
295 int i;
296};
297struct test8_B2ab {
298 virtual void ftest8_B2ab() { }
299 int i;
300};
301struct test8_B2a : virtual test8_B2aa, virtual test8_B2ab {
302 virtual void ftest8_B2a() { }
303};
304struct test8_B2b {
305 virtual void ftest8_B2b() { }
306};
307struct test8_B2 : test8_B2a, test8_B2b {
308 virtual void ftest8_B2() { }
309};
310struct test8_B3 {
311 virtual void ftest8_B3() { }
312};
313class test8_D : test8_B1, test8_B2, test8_B3 {
Mike Stump09765ec2009-08-19 02:53:08 +0000314};
Mike Stump276b9f12009-08-16 01:46:26 +0000315
Mike Stump276b9f12009-08-16 01:46:26 +0000316// CHECK-LP64:__ZTV7test8_D:
Mike Stump4ec04c42009-08-16 02:40:14 +0000317// CHECK-LP64-NEXT: .quad 48
318// CHECK-LP64-NEXT: .quad 32
Chris Lattnerf79df052010-01-20 07:45:09 +0000319// CHECK-LP64-NEXT: .quad 0
Mike Stumpb46c92d2009-08-19 02:06:38 +0000320// CHECK-LP64-NEXT: .quad __ZTI7test8_D
Mike Stump4ec04c42009-08-16 02:40:14 +0000321// CHECK-LP64-NEXT: .quad __ZN8test8_B19ftest8_B1Ev
322// CHECK-LP64-NEXT: .quad 40
323// CHECK-LP64-NEXT: .quad 24
Mike Stump7fa0d932009-08-20 02:11:48 +0000324// CHECK-LP64-NEXT: .quad 18446744073709551608
Mike Stump4ec04c42009-08-16 02:40:14 +0000325// CHECK-LP64-NEXT: .quad __ZTI7test8_D
326// CHECK-LP64-NEXT: .quad __ZN9test8_B2a10ftest8_B2aEv
327// CHECK-LP64-NEXT: .quad __ZN8test8_B29ftest8_B2Ev
Mike Stumpb46c92d2009-08-19 02:06:38 +0000328// CHECK-LP64-NEXT: .quad 18446744073709551600
Mike Stump4ec04c42009-08-16 02:40:14 +0000329// CHECK-LP64-NEXT: .quad __ZTI7test8_D
330// CHECK-LP64-NEXT: .quad __ZN9test8_B2b10ftest8_B2bEv
Mike Stumpb46c92d2009-08-19 02:06:38 +0000331// CHECK-LP64-NEXT: .quad 18446744073709551592
Mike Stump4ec04c42009-08-16 02:40:14 +0000332// CHECK-LP64-NEXT: .quad __ZTI7test8_D
333// CHECK-LP64-NEXT: .quad __ZN8test8_B39ftest8_B3Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000334// CHECK-LP64-NEXT: .quad 0
Mike Stump4ec04c42009-08-16 02:40:14 +0000335// CHECK-LP64-NEXT: .quad 18446744073709551584
336// CHECK-LP64-NEXT: .quad __ZTI7test8_D
337// CHECK-LP64-NEXT: .quad __ZN10test8_B2aa11ftest8_B2aaEv
Chris Lattnerf79df052010-01-20 07:45:09 +0000338// CHECK-LP64-NEXT: .quad 0
Mike Stump4ec04c42009-08-16 02:40:14 +0000339// CHECK-LP64-NEXT: .quad 18446744073709551568
340// CHECK-LP64-NEXT: .quad __ZTI7test8_D
341// CHECK-LP64-NEXT: .quad __ZN10test8_B2ab11ftest8_B2abEv
Mike Stumpd76264e2009-08-12 21:50:08 +0000342
Mike Stump22efb852009-11-13 22:12:05 +0000343// CHECK-LP64:__ZTC7test8_D8_8test8_B2:
344// CHECK-LP64-NEXT: .quad 40
345// CHECK-LP64-NEXT: .quad 24
Chris Lattnerf79df052010-01-20 07:45:09 +0000346// CHECK-LP64-NEXT: .quad 0
Mike Stump22efb852009-11-13 22:12:05 +0000347// CHECK-LP64-NEXT: .quad __ZTI8test8_B2
348// CHECK-LP64-NEXT: .quad __ZN9test8_B2a10ftest8_B2aEv
349// CHECK-LP64-NEXT: .quad __ZN8test8_B29ftest8_B2Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000350// CHECK-LP64-NEXT: .quad 0
Mike Stump22efb852009-11-13 22:12:05 +0000351// CHECK-LP64-NEXT: .quad 18446744073709551592
352// CHECK-LP64-NEXT: .quad __ZTI8test8_B2
353// CHECK-LP64-NEXT: .quad __ZN10test8_B2aa11ftest8_B2aaEv
Chris Lattnerf79df052010-01-20 07:45:09 +0000354// CHECK-LP64-NEXT: .quad 0
Mike Stump22efb852009-11-13 22:12:05 +0000355// CHECK-LP64-NEXT: .quad 18446744073709551576
356// CHECK-LP64-NEXT: .quad __ZTI8test8_B2
357// CHECK-LP64-NEXT: .quad __ZN10test8_B2ab11ftest8_B2abEv
358
359// CHECK-LP64:__ZTC7test8_D8_9test8_B2a:
360// CHECK-LP64-NEXT: .quad 40
361// CHECK-LP64-NEXT: .quad 24
Chris Lattnerf79df052010-01-20 07:45:09 +0000362// CHECK-LP64-NEXT: .quad 0
Mike Stump22efb852009-11-13 22:12:05 +0000363// CHECK-LP64-NEXT: .quad __ZTI9test8_B2a
364// CHECK-LP64-NEXT: .quad __ZN9test8_B2a10ftest8_B2aEv
Chris Lattnerf79df052010-01-20 07:45:09 +0000365// CHECK-LP64-NEXT: .quad 0
Mike Stump22efb852009-11-13 22:12:05 +0000366// CHECK-LP64-NEXT: .quad 18446744073709551592
367// CHECK-LP64-NEXT: .quad __ZTI9test8_B2a
368// CHECK-LP64-NEXT: .quad __ZN10test8_B2aa11ftest8_B2aaEv
Chris Lattnerf79df052010-01-20 07:45:09 +0000369// CHECK-LP64-NEXT: .quad 0
Mike Stump22efb852009-11-13 22:12:05 +0000370// CHECK-LP64-NEXT: .quad 18446744073709551576
371// CHECK-LP64-NEXT: .quad __ZTI9test8_B2a
372// CHECK-LP64-NEXT: .quad __ZN10test8_B2ab11ftest8_B2abEv
373
374// CHECK-LP64:__ZTT7test8_D:
375// CHECK-LP64-NEXT: .quad (__ZTV7test8_D) + 32
376// CHECK-LP64-NEXT: .quad (__ZTC7test8_D8_8test8_B2) + 32
377// CHECK-LP64-NEXT: .quad (__ZTC7test8_D8_9test8_B2a) + 32
Anders Carlsson20314ff2010-01-18 04:25:18 +0000378// CHECK-LP64-NEXT: .quad (__ZTC7test8_D8_9test8_B2a) + 64
379// CHECK-LP64-NEXT: .quad (__ZTC7test8_D8_9test8_B2a) + 96
380// CHECK-LP64-NEXT: .quad (__ZTC7test8_D8_8test8_B2) + 72
381// CHECK-LP64-NEXT: .quad (__ZTC7test8_D8_8test8_B2) + 104
382// CHECK-LP64-NEXT: .quad (__ZTV7test8_D) + 72
383// CHECK-LP64-NEXT: .quad (__ZTV7test8_D) + 160
384// CHECK-LP64-NEXT: .quad (__ZTV7test8_D) + 192
Mike Stump22efb852009-11-13 22:12:05 +0000385
Mike Stump49520942009-08-11 04:03:59 +0000386
Mike Stump09765ec2009-08-19 02:53:08 +0000387struct test9_B3 { virtual void funcB3(); int i; };
388struct test9_B2 : virtual test9_B3 { virtual void funcB2(); int i; };
389struct test9_B1 : virtual test9_B2 { virtual void funcB1(); int i; };
390
391struct test9_B23 { virtual void funcB23(); int i; };
392struct test9_B22 : virtual test9_B23 { virtual void funcB22(); int i; };
393struct test9_B21 : virtual test9_B22 { virtual void funcB21(); int i; };
394
395
396struct test9_B232 { virtual void funcB232(); int i; };
397struct test9_B231 { virtual void funcB231(); int i; };
398
399struct test9_B33 { virtual void funcB33(); int i; };
400struct test9_B32 : virtual test9_B33, virtual test9_B232 { virtual void funcB32(); int i; };
401struct test9_B31 : virtual test9_B32, virtual test9_B231 { virtual void funcB31(); int i; };
402
403struct test9_D : virtual test9_B1, virtual test9_B21, virtual test9_B31 {
404 virtual void funcD() { }
405};
406
407// CHECK-LP64: __ZTV7test9_D:
408// CHECK-LP64-NEXT: .quad 168
409// CHECK-LP64-NEXT: .quad 152
410// CHECK-LP64-NEXT: .quad 136
411// CHECK-LP64-NEXT: .quad 120
412// CHECK-LP64-NEXT: .quad 104
413// CHECK-LP64-NEXT: .quad 88
414// CHECK-LP64-NEXT: .quad 72
415// CHECK-LP64-NEXT: .quad 56
416// CHECK-LP64-NEXT: .quad 40
417// CHECK-LP64-NEXT: .quad 24
418// CHECK-LP64-NEXT: .quad 8
Chris Lattnerf79df052010-01-20 07:45:09 +0000419// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000420// CHECK-LP64-NEXT: .quad __ZTI7test9_D
421// CHECK-LP64-NEXT: .quad __ZN7test9_D5funcDEv
Chris Lattnerf79df052010-01-20 07:45:09 +0000422// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000423// CHECK-LP64-NEXT: .quad 32
424// CHECK-LP64-NEXT: .quad 16
425// CHECK-LP64-NEXT: .quad 18446744073709551608
426// CHECK-LP64-NEXT: .quad __ZTI7test9_D
427// CHECK-LP64-NEXT: .quad __ZN8test9_B16funcB1Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000428// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000429// CHECK-LP64-NEXT: .quad 16
430// CHECK-LP64-NEXT: .quad 18446744073709551592
431// CHECK-LP64-NEXT: .quad __ZTI7test9_D
432// CHECK-LP64-NEXT: .quad __ZN8test9_B26funcB2Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000433// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000434// CHECK-LP64-NEXT: .quad 18446744073709551576
435// CHECK-LP64-NEXT: .quad __ZTI7test9_D
436// CHECK-LP64-NEXT: .quad __ZN8test9_B36funcB3Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000437// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000438// CHECK-LP64-NEXT: .quad 32
439// CHECK-LP64-NEXT: .quad 16
440// CHECK-LP64-NEXT: .quad 18446744073709551560
441// CHECK-LP64-NEXT: .quad __ZTI7test9_D
442// CHECK-LP64-NEXT: .quad __ZN9test9_B217funcB21Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000443// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000444// CHECK-LP64-NEXT: .quad 16
445// CHECK-LP64-NEXT: .quad 18446744073709551544
446// CHECK-LP64-NEXT: .quad __ZTI7test9_D
447// CHECK-LP64-NEXT: .quad __ZN9test9_B227funcB22Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000448// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000449// CHECK-LP64-NEXT: .quad 18446744073709551528
450// CHECK-LP64-NEXT: .quad __ZTI7test9_D
451// CHECK-LP64-NEXT: .quad __ZN9test9_B237funcB23Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000452// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000453// CHECK-LP64-NEXT: .quad 64
454// CHECK-LP64-NEXT: .quad 48
455// CHECK-LP64-NEXT: .quad 32
456// CHECK-LP64-NEXT: .quad 16
457// CHECK-LP64-NEXT: .quad 18446744073709551512
458// CHECK-LP64-NEXT: .quad __ZTI7test9_D
459// CHECK-LP64-NEXT: .quad __ZN9test9_B317funcB31Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000460// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000461// CHECK-LP64-NEXT: .quad 32
462// CHECK-LP64-NEXT: .quad 16
463// CHECK-LP64-NEXT: .quad 18446744073709551496
464// CHECK-LP64-NEXT: .quad __ZTI7test9_D
465// CHECK-LP64-NEXT: .quad __ZN9test9_B327funcB32Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000466// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000467// CHECK-LP64-NEXT: .quad 18446744073709551480
468// CHECK-LP64-NEXT: .quad __ZTI7test9_D
469// CHECK-LP64-NEXT: .quad __ZN9test9_B337funcB33Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000470// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000471// CHECK-LP64-NEXT: .quad 18446744073709551464
472// CHECK-LP64-NEXT: .quad __ZTI7test9_D
473// CHECK-LP64-NEXT: .quad __ZN10test9_B2328funcB232Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000474// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000475// CHECK-LP64-NEXT: .quad 18446744073709551448
476// CHECK-LP64-NEXT: .quad __ZTI7test9_D
477// CHECK-LP64-NEXT: .quad __ZN10test9_B2318funcB231Ev
478
Mike Stump09765ec2009-08-19 02:53:08 +0000479
Mike Stumpb9837442009-08-20 07:22:17 +0000480struct test10_O { int i; };
481
482struct test10_B1 : virtual test10_O {
483 virtual void ftest10_B1() { }
484};
485
486struct test10_B2aa : virtual test10_O {
487 int i;
488};
489struct test10_B2ab : virtual test10_O {
490 int i;
491};
492struct test10_B2a : virtual test10_B2aa, virtual test10_B2ab,virtual test10_O {
493 virtual void ftest10_B2a() { }
494};
495struct test10_B2b : virtual test10_O {
496 virtual void ftest10_B2b() { }
497};
498struct test10_B2 : test10_B2a {
499 virtual void ftest10_B2() { }
500};
501class test10_D : test10_B1, test10_B2 {
502
503 void ftest10_B2aa() { }
504};
505
506// CHECK-LP64:__ZTV8test10_D:
507// CHECK-LP64-NEXT: .quad 40
508// CHECK-LP64-NEXT: .quad 24
509// CHECK-LP64-NEXT: .quad 16
Chris Lattnerf79df052010-01-20 07:45:09 +0000510// CHECK-LP64-NEXT: .quad 0
Mike Stumpb9837442009-08-20 07:22:17 +0000511// CHECK-LP64-NEXT: .quad __ZTI8test10_D
512// CHECK-LP64-NEXT: .quad __ZN9test10_B110ftest10_B1Ev
513// CHECK-LP64-NEXT: .quad 32
514// CHECK-LP64-NEXT: .quad 8
515// CHECK-LP64-NEXT: .quad 16
516// CHECK-LP64-NEXT: .quad 18446744073709551608
517// CHECK-LP64-NEXT: .quad __ZTI8test10_D
518// CHECK-LP64-NEXT: .quad __ZN10test10_B2a11ftest10_B2aEv
519// CHECK-LP64-NEXT: .quad __ZN9test10_B210ftest10_B2Ev
520// CHECK-LP64-NEXT: .quad 18446744073709551608
521// CHECK-LP64-NEXT: .quad 18446744073709551592
522// CHECK-LP64-NEXT: .quad __ZTI8test10_D
523// CHECK-LP64-NEXT: .quad 18446744073709551592
524// CHECK-LP64-NEXT: .quad 18446744073709551576
525// CHECK-LP64-NEXT: .quad __ZTI8test10_D
526
Mike Stumpb9837442009-08-20 07:22:17 +0000527
Mike Stumpb9871a22009-08-21 01:45:00 +0000528struct test11_B {
529 virtual void B1() { }
530 virtual void D() { }
531 virtual void B2() { }
532};
533
534struct test11_D : test11_B {
535 virtual void D1() { }
536 virtual void D() { }
537 virtual void D2() { }
538};
539
Mike Stumpb9871a22009-08-21 01:45:00 +0000540// CHECK-LP64:__ZTV8test11_D:
Chris Lattnerf79df052010-01-20 07:45:09 +0000541// CHECK-LP64-NEXT: .quad 0
Mike Stumpb9871a22009-08-21 01:45:00 +0000542// CHECK-LP64-NEXT: .quad __ZTI8test11_D
543// CHECK-LP64-NEXT: .quad __ZN8test11_B2B1Ev
544// CHECK-LP64-NEXT: .quad __ZN8test11_D1DEv
545// CHECK-LP64-NEXT: .quad __ZN8test11_B2B2Ev
546// CHECK-LP64-NEXT: .quad __ZN8test11_D2D1Ev
547// CHECK-LP64-NEXT: .quad __ZN8test11_D2D2Ev
Mike Stumpb9837442009-08-20 07:22:17 +0000548
Mike Stumpdec025b2009-09-07 04:27:52 +0000549struct test13_B {
550 virtual void B1() { }
551 virtual void D() { }
552 virtual void Da();
553 virtual void Db() { }
554 virtual void Dc() { }
555 virtual void B2() { }
556 int i;
557};
558
559
560struct test13_NV1 {
561 virtual void fooNV1() { }
562 virtual void D() { }
563};
564
565
566struct test13_B2 : /* test13_NV1, */ virtual test13_B {
567 virtual void B2a() { }
568 virtual void B2() { }
569 virtual void D() { }
570 virtual void Da();
571 virtual void Dd() { }
572 virtual void B2b() { }
573 int i;
574};
575
576
577struct test13_D : test13_NV1, virtual test13_B2 {
578 virtual void D1() { }
579 virtual void D() { }
580 virtual void Db() { }
581 virtual void Dd() { }
582 virtual void D2() { }
583 virtual void fooNV1() { }
Mike Stumpd9878a12009-10-13 10:55:21 +0000584};
Mike Stumpdec025b2009-09-07 04:27:52 +0000585
586// CHECK-LP64:__ZTV8test13_D:
587// CHECK-LP64-NEXT: .quad 24
588// CHECK-LP64-NEXT: .quad 8
Chris Lattnerf79df052010-01-20 07:45:09 +0000589// CHECK-LP64-NEXT: .quad 0
Mike Stumpdec025b2009-09-07 04:27:52 +0000590// CHECK-LP64-NEXT: .quad __ZTI8test13_D
591// CHECK-LP64-NEXT: .quad __ZN8test13_D6fooNV1Ev
592// CHECK-LP64-NEXT: .quad __ZN8test13_D1DEv
593// CHECK-LP64-NEXT: .quad __ZN8test13_D2D1Ev
594// CHECK-LP64-NEXT: .quad __ZN8test13_D2DbEv
595// CHECK-LP64-NEXT: .quad __ZN8test13_D2DdEv
596// CHECK-LP64-NEXT: .quad __ZN8test13_D2D2Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000597// CHECK-LP64-NEXT: .quad 0
Mike Stumpdec025b2009-09-07 04:27:52 +0000598// CHECK-LP64-NEXT: .quad 18446744073709551608
Chris Lattnerf79df052010-01-20 07:45:09 +0000599// CHECK-LP64-NEXT: .quad 0
Mike Stumpdec025b2009-09-07 04:27:52 +0000600// CHECK-LP64-NEXT: .quad 18446744073709551608
Chris Lattnerf79df052010-01-20 07:45:09 +0000601// CHECK-LP64-NEXT: .quad 0
602// CHECK-LP64-NEXT: .quad 0
Mike Stumpdec025b2009-09-07 04:27:52 +0000603// CHECK-LP64-NEXT: .quad 16
604// CHECK-LP64-NEXT: .quad 18446744073709551608
605// CHECK-LP64-NEXT: .quad __ZTI8test13_D
606// CHECK-LP64-NEXT: .quad __ZN9test13_B23B2aEv
607// CHECK-LP64-NEXT: .quad __ZN9test13_B22B2Ev
608// CHECK-LP64-NEXT: .quad __ZTv0_n48_N8test13_D1DEv
609// CHECK-LP64-NEXT: .quad __ZN9test13_B22DaEv
610// CHECK-LP64-NEXT: .quad __ZTv0_n64_N8test13_D2DdEv
611// CHECK-LP64-NEXT: .quad __ZN9test13_B23B2bEv
612// CHECK-LP64-NEXT: .quad 18446744073709551600
Chris Lattnerf79df052010-01-20 07:45:09 +0000613// CHECK-LP64-NEXT: .quad 0
Mike Stumpdec025b2009-09-07 04:27:52 +0000614// CHECK-LP64-NEXT: .quad 18446744073709551592
615// CHECK-LP64-NEXT: .quad 18446744073709551600
616// CHECK-LP64-NEXT: .quad 18446744073709551592
Chris Lattnerf79df052010-01-20 07:45:09 +0000617// CHECK-LP64-NEXT: .quad 0
Mike Stumpdec025b2009-09-07 04:27:52 +0000618// CHECK-LP64-NEXT: .quad 18446744073709551592
619// CHECK-LP64-NEXT: .quad __ZTI8test13_D
620// CHECK-LP64-NEXT: .quad __ZN8test13_B2B1Ev
621// CHECK-LP64-NEXT: .quad __ZTv0_n32_N8test13_D1DEv
622// CHECK-LP64-NEXT: .quad __ZTv0_n40_N9test13_B22DaEv
623// CHECK-LP64-NEXT: .quad __ZTv0_n48_N8test13_D2DbEv
624// CHECK-LP64-NEXT: .quad __ZN8test13_B2DcEv
625// CHECK-LP64-NEXT: .quad __ZTv0_n64_N9test13_B22B2Ev
626
Mike Stump09765ec2009-08-19 02:53:08 +0000627
Mike Stumpd9878a12009-10-13 10:55:21 +0000628class test14 {
629public:
630 virtual void initWithInt(int a);
631 static test14 *withInt(int a);
632};
633
634void test14::initWithInt(int a) { }
635
636test14 *test14::withInt(int a) {
637 test14 *me = new test14;
638 me->initWithInt(a);
639 return me;
640}
641
642
643struct test15_B {
644 virtual test15_B *foo1() { return 0; }
645 virtual test15_B *foo2() { return 0; }
646 virtual test15_B *foo3() { return 0; }
647 int i;
648};
649
650struct test15_NV1 {
651 virtual void fooNV1() { }
652 int i;
653};
654
655struct test15_B2 : test15_NV1, virtual test15_B {
656 virtual test15_B2 *foo1() { return 0; }
657 virtual test15_B2 *foo2() { return 0; }
658 int i;
659};
660
661struct test15_D : test15_NV1, virtual test15_B2 {
662 virtual test15_D *foo1() { return 0; }
663};
664
665// CHECK-LP64:__ZTV8test15_D:
666// CHECK-LP64-NEXT: .quad 32
667// CHECK-LP64-NEXT: .quad 16
Chris Lattnerf79df052010-01-20 07:45:09 +0000668// CHECK-LP64-NEXT: .quad 0
Mike Stumpd9878a12009-10-13 10:55:21 +0000669// CHECK-LP64-NEXT: .quad __ZTI8test15_D
670// CHECK-LP64-NEXT: .quad __ZN10test15_NV16fooNV1Ev
671// CHECK-LP64-NEXT: .quad __ZN8test15_D4foo1Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000672// CHECK-LP64-NEXT: .quad 0
Mike Stumpd9878a12009-10-13 10:55:21 +0000673// CHECK-LP64-NEXT: .quad 18446744073709551600
Chris Lattnerf79df052010-01-20 07:45:09 +0000674// CHECK-LP64-NEXT: .quad 0
Mike Stumpd9878a12009-10-13 10:55:21 +0000675// CHECK-LP64-NEXT: .quad 16
676// CHECK-LP64-NEXT: .quad 18446744073709551600
677// CHECK-LP64-NEXT: .quad __ZTI8test15_D
678// CHECK-LP64-NEXT: .quad __ZN10test15_NV16fooNV1Ev
679// CHECK-LP64-NEXT: .quad __ZTcv0_n40_v0_n24_N8test15_D4foo1Ev
680// CHECK-LP64-NEXT: .quad __ZN9test15_B24foo2Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000681// CHECK-LP64-NEXT: .quad 0
Mike Stumpd9878a12009-10-13 10:55:21 +0000682// CHECK-LP64-NEXT: .quad 18446744073709551600
683// CHECK-LP64-NEXT: .quad 18446744073709551584
684// CHECK-LP64-NEXT: .quad 18446744073709551584
685// CHECK-LP64-NEXT: .quad __ZTI8test15_D
686// CHECK-LP64-NEXT: .quad __ZTcv0_n24_v0_n32_N8test15_D4foo1Ev
687// CHECK-LP64-NEXT: .quad __ZTcv0_n32_v0_n24_N9test15_B24foo2Ev
688// CHECK-LP64-NEXT: .quad __ZN8test15_B4foo3Ev
689
Mike Stumpd9878a12009-10-13 10:55:21 +0000690
Mike Stump54150d92009-10-14 18:38:01 +0000691struct test16_NV1 {
692 virtual void fooNV1() { }
693virtual void foo_NV1() { }
694 int i;
695};
696
697struct test16_NV2 {
698 virtual test16_NV2* foo1() { return 0; }
699virtual void foo_NV2() { }
700virtual void foo_NV2b() { }
701 int i;
702};
703
704struct test16_B : public test16_NV1, test16_NV2 {
705 virtual test16_B *foo1() { return 0; }
706 virtual test16_B *foo2() { return 0; }
707 virtual test16_B *foo3() { return 0; }
708virtual void foo_B() { }
709 int i;
710};
711
712struct test16_B2 : test16_NV1, virtual test16_B {
713 virtual test16_B2 *foo1() { return 0; }
714 virtual test16_B2 *foo2() { return 0; }
715virtual void foo_B2() { }
716 int i;
717};
718
719struct test16_D : test16_NV1, virtual test16_B2 {
Mike Stumpa84b4042009-11-20 00:02:19 +0000720 virtual void bar() { }
721 virtual test16_D *foo1() { return 0; }
Mike Stump54150d92009-10-14 18:38:01 +0000722};
723
724// CHECK-LP64: __ZTV8test16_D:
725// CHECK-LP64-NEXT: .quad 32
726// CHECK-LP64-NEXT: .quad 16
Chris Lattnerf79df052010-01-20 07:45:09 +0000727// CHECK-LP64-NEXT: .quad 0
Mike Stump54150d92009-10-14 18:38:01 +0000728// CHECK-LP64-NEXT: .quad __ZTI8test16_D
729// CHECK-LP64-NEXT: .quad __ZN10test16_NV16fooNV1Ev
730// CHECK-LP64-NEXT: .quad __ZN10test16_NV17foo_NV1Ev
Mike Stump941e3f32009-11-05 05:01:19 +0000731// CHECK-LP64-NEXT: .quad __ZN8test16_D3barEv
Mike Stump54150d92009-10-14 18:38:01 +0000732// CHECK-LP64-NEXT: .quad __ZN8test16_D4foo1Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000733// CHECK-LP64-NEXT: .quad 0
734// CHECK-LP64-NEXT: .quad 0
Mike Stump54150d92009-10-14 18:38:01 +0000735// CHECK-LP64-NEXT: .quad 18446744073709551600
Chris Lattnerf79df052010-01-20 07:45:09 +0000736// CHECK-LP64-NEXT: .quad 0
737// CHECK-LP64-NEXT: .quad 0
Mike Stump54150d92009-10-14 18:38:01 +0000738// CHECK-LP64-NEXT: .quad 16
739// CHECK-LP64-NEXT: .quad 18446744073709551600
740// CHECK-LP64-NEXT: .quad __ZTI8test16_D
741// CHECK-LP64-NEXT: .quad __ZN10test16_NV16fooNV1Ev
742// CHECK-LP64-NEXT: .quad __ZN10test16_NV17foo_NV1Ev
743// CHECK-LP64-NEXT: .quad __ZTcv0_n48_v0_n24_N8test16_D4foo1Ev
744// CHECK-LP64-NEXT: .quad __ZN9test16_B24foo2Ev
745// CHECK-LP64-NEXT: .quad __ZN9test16_B26foo_B2Ev
746// CHECK-LP64-NEXT .quad 16
747// CHECK-LP64-NEXT .quad 16
Chris Lattnerf79df052010-01-20 07:45:09 +0000748// CHECK-LP64-NEXT: .quad 0
749// CHECK-LP64-NEXT: .quad 0
Mike Stump54150d92009-10-14 18:38:01 +0000750// CHECK-LP64: .quad 18446744073709551600
Mike Stump9e7e3c62009-11-06 23:27:42 +0000751// CHECK-LP64-NEXT: .quad 18446744073709551584
Chris Lattnerf79df052010-01-20 07:45:09 +0000752// CHECK-LP64-NEXT: .quad 0
753// CHECK-LP64-NEXT: .quad 0
Mike Stump54150d92009-10-14 18:38:01 +0000754// CHECK-LP64-NEXT: .quad 18446744073709551584
755// CHECK-LP64-NEXT: .quad __ZTI8test16_D
756// CHECK-LP64-NEXT: .quad __ZN10test16_NV16fooNV1Ev
757// CHECK-LP64-NEXT: .quad __ZN10test16_NV17foo_NV1Ev
758// CHECK-LP64-NEXT: .quad __ZTcv0_n40_v0_n32_N8test16_D4foo1Ev
759// CHECK-LP64-NEXT: .quad __ZTcv0_n48_v0_n24_N9test16_B24foo2Ev
760// CHECK-LP64-NEXT: .quad __ZN8test16_B4foo3Ev
761// CHECK-LP64-NEXT: .quad __ZN8test16_B5foo_BEv
762// CHECK-LP64-NEXT: .quad 18446744073709551568
763// CHECK-LP64-NEXT: .quad __ZTI8test16_D
764// CHECK-LP64-NEXT .quad __ZTcvn16_n40_v16_n32_N8test16_D4foo1Ev
765// CHECK-LP64: .quad __ZN10test16_NV27foo_NV2Ev
766// CHECK-LP64-NEXT: .quad __ZN10test16_NV28foo_NV2bEv
767
Mike Stumpd9878a12009-10-13 10:55:21 +0000768
Mike Stump941e3f32009-11-05 05:01:19 +0000769// FIXME: This is the wrong thunk, but until these issues are fixed, better
770// than nothing.
Eli Friedman72649ed2009-12-06 22:01:30 +0000771// CHECK-LPLL64:define weak %class.test8_D* @_ZTcvn16_n72_v16_n32_N8test16_D4foo1Ev(%class.test8_D*)
Mike Stump1d9e0aa2010-01-13 20:43:31 +0000772// CHECK-LPLL64: %{{retval|2}} = alloca %class.test8_D*
Mike Stump599837a2009-11-06 00:18:25 +0000773// CHECK-LPLL64: %.addr = alloca %class.test8_D*
774// CHECK-LPLL64: store %class.test8_D* %0, %class.test8_D** %.addr
Mike Stump1d9e0aa2010-01-13 20:43:31 +0000775// CHECK-LPLL64: %{{this|3}} = load %class.test8_D** %.addr
776// CHECK-LPLL64: %{{1|4}} = bitcast %class.test8_D* %{{this|3}} to i8*
777// CHECK-LPLL64: %{{2|5}} = getelementptr inbounds i8* %{{1|4}}, i64 -16
778// CHECK-LPLL64: %{{3|6}} = bitcast i8* %{{2|5}} to %class.test8_D*
779// CHECK-LPLL64: %{{4|7}} = bitcast %class.test8_D* %{{3|6}} to i8*
780// CHECK-LPLL64: %{{5|8}} = bitcast %class.test8_D* %3 to i64**
781// CHECK-LPLL64: %{{vtable|9}} = load i64** %{{5|8}}
782// CHECK-LPLL64: %{{6|10}} = getelementptr inbounds i64* %{{vtable|9}}, i64 -9
783// CHECK-LPLL64: %{{7|11}} = load i64* %{{6|10}}
784// CHECK-LPLL64: %{{8|12}} = getelementptr i8* %{{4|7}}, i64 %{{7|11}}
785// CHECK-LPLL64: %{{9|13}} = bitcast i8* %{{8|12}} to %class.test8_D*
786// CHECK-LPLL64: %{{call|14}} = call %class.test8_D* @_ZTch0_v16_n32_N8test16_D4foo1Ev(%class.test8_D* %{{9|13}})
787// CHECK-LPLL64: store %class.test8_D* %{{call|14}}, %class.test8_D** %{{retval|2}}
788// CHECK-LPLL64: %{{10|15}} = load %class.test8_D** %{{retval|2}}
789// CHECK-LPLL64: ret %class.test8_D* %{{10|15}}
Mike Stump599837a2009-11-06 00:18:25 +0000790// CHECK-LPLL64:}
Mike Stump941e3f32009-11-05 05:01:19 +0000791
Mike Stump1d9e0aa2010-01-13 20:43:31 +0000792// CHECK-LPLL64:define weak %class.test8_D* @_ZTch0_v16_n32_N8test16_D4foo1Ev(%{{class.test8_D|.*}}*)
793// CHECK-LPLL64: %{{retval|2}} = alloca %class.test8_D*
Mike Stump599837a2009-11-06 00:18:25 +0000794// CHECK-LPLL64: %.addr = alloca %class.test8_D*
795// CHECK-LPLL64: store %class.test8_D* %0, %class.test8_D** %.addr
Mike Stump1d9e0aa2010-01-13 20:43:31 +0000796// CHECK-LPLL64: %{{this|3}} = load %class.test8_D** %.addr
797// CHECK-LPLL64: %{{call|4}} = call %class.test8_D* @_ZN8test16_D4foo1Ev(%class.test8_D* %{{this|3}})
798// CHECK-LPLL64: %{{1|5}} = icmp ne %class.test8_D* %{{call|4}}, null
799// CHECK-LPLL64: br i1 %{{1|5}}, label %{{2|6}}, label %{{12|17}}
800// CHECK-LPLL64:; <label>:{{2|6}}
801// CHECK-LPLL64: %{{3|7}} = bitcast %class.test8_D* %{{call|4}} to i8*
802// CHECK-LPLL64: %{{4|8}} = getelementptr inbounds i8* %{{3|7}}, i64 16
803// CHECK-LPLL64: %{{5|9}} = bitcast i8* %4 to %class.test8_D*
804// CHECK-LPLL64: %{{6|10}} = bitcast %class.test8_D* %{{5|9}} to i8*
805// CHECK-LPLL64: %{{7|11}} = bitcast %class.test8_D* %{{5|9}} to i64**
806// CHECK-LPLL64: %{{vtable|12}} = load i64** %{{7|11}}
807// CHECK-LPLL64: %{{8|13}} = getelementptr inbounds i64* %vtable, i64 -4
808// CHECK-LPLL64: %{{9|14}} = load i64* %{{8|13}}
809// CHECK-LPLL64: %{{10|15}} = getelementptr i8* %{{6|10}}, i64 %{{9|14}}
810// CHECK-LPLL64: %{{11|16}} = bitcast i8* %{{10|15}} to %class.test8_D*
811// CHECK-LPLL64: br label %{{13|18}}
812// CHECK-LPLL64:; <label>:{{12|17}}
813// CHECK-LPLL64: br label %{{13|18}}
814// CHECK-LPLL64:; <label>:{{13|18}}
815// CHECK-LPLL64: %{{14|19}} = phi %class.test8_D* [ %{{11|16}}, %{{2|6}} ], [ %{{call|4}}, %{{12|17}} ]
816// CHECK-LPLL64: store %class.test8_D* %{{14|19}}, %class.test8_D** %{{retval|2}}
817// CHECK-LPLL64: %{{15|20}} = load %class.test8_D** %{{retval|2}}
818// CHECK-LPLL64: ret %class.test8_D* %{{15|20}}
Mike Stump599837a2009-11-06 00:18:25 +0000819// CHECK-LPLL64:}
Mike Stump941e3f32009-11-05 05:01:19 +0000820
821
Mike Stump7809e0d2009-10-28 00:35:46 +0000822class test17_B1 {
823 virtual void foo() = 0;
824 virtual void bar() { }
825};
826
827class test17_B2 : public test17_B1 {
828 void foo() { }
829 virtual void bar() = 0;
830};
831
832class test17_D : public test17_B2 {
833 void bar() { }
Mike Stump62db2452009-11-03 19:28:52 +0000834};
Mike Stump7809e0d2009-10-28 00:35:46 +0000835
836
837// CHECK-LP64:__ZTV8test17_D:
Chris Lattnerf79df052010-01-20 07:45:09 +0000838// CHECK-LP64-NEXT: .quad 0
Mike Stump7809e0d2009-10-28 00:35:46 +0000839// CHECK-LP64-NEXT: .quad __ZTI8test17_D
840// CHECK-LP64-NEXT: .quad __ZN9test17_B23fooEv
841// CHECK-LP64-NEXT: .quad __ZN8test17_D3barEv
842
843// CHECK-LP64:__ZTV9test17_B2:
Chris Lattnerf79df052010-01-20 07:45:09 +0000844// CHECK-LP64-NEXT: .quad 0
Mike Stump7809e0d2009-10-28 00:35:46 +0000845// CHECK-LP64-NEXT: .quad __ZTI9test17_B2
846// CHECK-LP64-NEXT: .quad __ZN9test17_B23fooEv
847// CHECK-LP64-NEXT: .quad ___cxa_pure_virtual
848
849// CHECK-LP64:__ZTV9test17_B1:
Chris Lattnerf79df052010-01-20 07:45:09 +0000850// CHECK-LP64-NEXT: .quad 0
Mike Stump7809e0d2009-10-28 00:35:46 +0000851// CHECK-LP64-NEXT: .quad __ZTI9test17_B1
852// CHECK-LP64-NEXT: .quad ___cxa_pure_virtual
853// CHECK-LP64-NEXT: .quad __ZN9test17_B13barEv
854
855
Mike Stump9c212892009-11-03 19:03:17 +0000856struct test18_NV1 {
857 virtual void fooNV1() { }
858virtual void foo_NV1() { }
859 int i;
860};
861
862struct test18_NV2 {
863 virtual test18_NV2& foo1() { return *this; }
864virtual void foo_NV2() { }
865virtual void foo_NV2b() { }
866 int i;
867};
868
869struct test18_B : public test18_NV1, test18_NV2 {
870 virtual test18_B& foo1() { return *this; }
871 virtual test18_B *foo2() { return 0; }
872 virtual test18_B *foo3() { return 0; }
873virtual void foo_B() { }
874 int i;
875};
876
877struct test18_B2 : test18_NV1, virtual test18_B {
878 virtual test18_B2& foo1() { return *this; }
879 virtual test18_B2 *foo2() { return 0; }
880virtual void foo_B2() { }
881 int i;
882};
883
884struct test18_D : test18_NV1, virtual test18_B2 {
885 virtual test18_D& foo1() { return *this; }
Mike Stump62db2452009-11-03 19:28:52 +0000886};
887
888
889struct test19_VB1 { };
890struct test19_B1 : public virtual test19_VB1 {
891 virtual void fB1() { }
892 virtual void foB1B2() { }
893 virtual void foB1B3() { }
894 virtual void foB1B4() { }
895};
896
897struct test19_VB2 { };
898struct test19_B2: public test19_B1, public virtual test19_VB2 {
899 virtual void foB1B2() { }
900 virtual void foB1B3() { }
901 virtual void foB1B4() { }
902
903 virtual void fB2() { }
904 virtual void foB2B3() { }
905 virtual void foB2B4() { }
906};
907
908struct test19_VB3 { };
909struct test19_B3: virtual public test19_B2, public virtual test19_VB3 {
910 virtual void foB1B3() { }
911 virtual void foB1B4() { }
912
913 virtual void foB2B3() { }
914 virtual void foB2B4() { }
915
916 virtual void fB3() { }
917 virtual void foB3B4() { }
918};
919
920struct test19_VB4 { };
921struct test19_B4: public test19_B3, public virtual test19_VB4 {
922 virtual void foB1B4() { }
923
924 virtual void foB2B4() { }
925
926 virtual void foB3B4() { }
927
928 virtual void fB4() { }
929};
930
931struct test19_D : virtual test19_B4 {
932};
933
934
935// CHECK-LP64: __ZTV8test19_D:
Chris Lattnerf79df052010-01-20 07:45:09 +0000936// CHECK-LP64-NEXT: .quad 0
937// CHECK-LP64-NEXT: .quad 0
938// CHECK-LP64-NEXT: .quad 0
939// CHECK-LP64-NEXT: .quad 0
940// CHECK-LP64-NEXT: .quad 0
941// CHECK-LP64-NEXT: .quad 0
942// CHECK-LP64-NEXT: .quad 0
943// CHECK-LP64-NEXT: .quad 0
944// CHECK-LP64-NEXT: .quad 0
945// CHECK-LP64-NEXT: .quad 0
946// CHECK-LP64-NEXT: .quad 0
947// CHECK-LP64-NEXT: .quad 0
948// CHECK-LP64-NEXT: .quad 0
949// CHECK-LP64-NEXT: .quad 0
950// CHECK-LP64-NEXT: .quad 0
951// CHECK-LP64-NEXT: .quad 0
952// CHECK-LP64-NEXT: .quad 0
Mike Stump62db2452009-11-03 19:28:52 +0000953// CHECK-LP64-NEXT: .quad __ZTI8test19_D
Mike Stump9e7e3c62009-11-06 23:27:42 +0000954// CHECK-LP64-NEXT: .quad __ZN9test19_B13fB1Ev
955// CHECK-LP64-NEXT: .quad __ZN9test19_B26foB1B2Ev
956// CHECK-LP64-NEXT: .quad __ZN9test19_B36foB1B3Ev
957// CHECK-LP64-NEXT: .quad __ZN9test19_B46foB1B4Ev
958// CHECK-LP64-NEXT: .quad __ZN9test19_B23fB2Ev
959// CHECK-LP64-NEXT: .quad __ZN9test19_B36foB2B3Ev
960// CHECK-LP64-NEXT: .quad __ZN9test19_B46foB2B4Ev
961// CHECK-LP64-NEXT: .quad __ZN9test19_B33fB3Ev
962// CHECK-LP64-NEXT: .quad __ZN9test19_B46foB3B4Ev
963// CHECK-LP64-NEXT: .quad __ZN9test19_B43fB4Ev
Mike Stump62db2452009-11-03 19:28:52 +0000964
Mike Stump2cdcbdb2009-11-13 21:40:38 +0000965// CHECK-LP64: __ZTT8test19_D:
966// CHECK-LP64-NEXT: .quad (__ZTV8test19_D) + 144
967// CHECK-LP64-NEXT: .quad (__ZTV8test19_D) + 144
968// CHECK-LP64-NEXT .quad (__ZTV8test19_D) + 144
969// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B4) + 136
970// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B3) + 104
971// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B3) + 104
972// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B4) + 136
973// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B2) + 88
974// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B1) + 24
975
Mike Stump9c212892009-11-03 19:03:17 +0000976
Mike Stump99faefd2009-11-05 05:26:28 +0000977class test20_V {
978 virtual void foo1();
979};
980class test20_V1 {
981 virtual void foo2();
982};
983class test20_B : virtual test20_V {
984} b;
985class test20_B1 : virtual test20_V1 {
986};
987class test20_D : public test20_B, public test20_B1 {
Mike Stump33c530e2009-11-06 02:38:24 +0000988};
Mike Stump99faefd2009-11-05 05:26:28 +0000989
990// CHECK-LP64: __ZTV8test20_D:
991// CHECK-LP64-NEXT: .quad 8
Chris Lattnerf79df052010-01-20 07:45:09 +0000992// CHECK-LP64-NEXT: .quad 0
993// CHECK-LP64-NEXT: .quad 0
994// CHECK-LP64-NEXT: .quad 0
Mike Stump99faefd2009-11-05 05:26:28 +0000995// CHECK-LP64-NEXT: .quad __ZTI8test20_D
996// CHECK-LP64-NEXT: .quad __ZN8test20_V4foo1Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000997// CHECK-LP64-NEXT: .quad 0
998// CHECK-LP64-NEXT: .quad 0
Mike Stump99faefd2009-11-05 05:26:28 +0000999// CHECK-LP64-NEXT: .quad 18446744073709551608
1000// CHECK-LP64-NEXT: .quad __ZTI8test20_D
1001// CHECK-LP64-NEXT: .quad __ZN9test20_V14foo2Ev
1002
Mike Stump513225f2009-11-13 21:55:26 +00001003// CHECK-LP64: __ZTC8test20_D0_8test20_B:
Chris Lattnerf79df052010-01-20 07:45:09 +00001004// CHECK-LP64-NEXT: .quad 0
1005// CHECK-LP64-NEXT: .quad 0
1006// CHECK-LP64-NEXT: .quad 0
Mike Stump513225f2009-11-13 21:55:26 +00001007// CHECK-LP64-NEXT: .quad __ZTI8test20_B
1008// CHECK-LP64-NEXT: .quad __ZN8test20_V4foo1Ev
1009
1010// CHECK-LP64: __ZTC8test20_D8_9test20_B1:
Chris Lattnerf79df052010-01-20 07:45:09 +00001011// CHECK-LP64-NEXT: .quad 0
1012// CHECK-LP64-NEXT: .quad 0
1013// CHECK-LP64-NEXT: .quad 0
Mike Stump513225f2009-11-13 21:55:26 +00001014// CHECK-LP64-NEXT: .quad __ZTI9test20_B1
1015// CHECK-LP64-NEXT: .quad __ZN9test20_V14foo2Ev
1016
Mike Stump2cdcbdb2009-11-13 21:40:38 +00001017// CHECK-LP64: __ZTT8test20_D:
1018// CHECK-LP64-NEXT: .quad (__ZTV8test20_D) + 40
1019// CHECK-LP64-NEXT: .quad (__ZTC8test20_D0_8test20_B) + 32
1020// CHECK-LP64-NEXT: .quad (__ZTC8test20_D0_8test20_B) + 32
1021// CHECK-LP64-NEXT: .quad (__ZTC8test20_D8_9test20_B1) + 32
1022// CHECK-LP64-NEXT: .quad (__ZTC8test20_D8_9test20_B1) + 32
1023// CHECK-LP64-NEXT .quad (__ZTV8test20_D) + 40
1024// CHECK-LP64-NEXT .quad (__ZTV8test20_D) + 80
1025// CHECK-LP64-NEXT .quad (__ZTV8test20_D) + 80
1026
Mike Stump99faefd2009-11-05 05:26:28 +00001027
Mike Stump33c530e2009-11-06 02:38:24 +00001028class test21_V {
Mike Stumpa6604402009-11-13 18:53:35 +00001029 virtual void foo() { }
Mike Stump33c530e2009-11-06 02:38:24 +00001030};
1031class test21_V1 {
Mike Stumpa6604402009-11-13 18:53:35 +00001032 virtual void foo() { }
Mike Stump33c530e2009-11-06 02:38:24 +00001033};
1034class test21_B : virtual test21_V {
1035};
1036class test21_B1 : virtual test21_V1 {
1037};
1038class test21_D : public test21_B, public test21_B1 {
1039 void foo() { }
1040};
1041
1042// CHECK-LP64: __ZTV8test21_D:
1043// CHECK-LP64-NEXT: .quad 8
Chris Lattnerf79df052010-01-20 07:45:09 +00001044// CHECK-LP64-NEXT: .quad 0
1045// CHECK-LP64-NEXT: .quad 0
1046// CHECK-LP64-NEXT: .quad 0
Mike Stump33c530e2009-11-06 02:38:24 +00001047// CHECK-LP64-NEXT: .quad __ZTI8test21_D
1048// CHECK-LP64-NEXT: .quad __ZN8test21_D3fooEv
Chris Lattnerf79df052010-01-20 07:45:09 +00001049// CHECK-LP64-NEXT: .quad 0
Mike Stump33c530e2009-11-06 02:38:24 +00001050// CHECK-LP64-NEXT: .quad 18446744073709551608
1051// CHECK-LP64-NEXT: .quad 18446744073709551608
1052// CHECK-LP64-NEXT: .quad __ZTI8test21_D
Mike Stump9e7e3c62009-11-06 23:27:42 +00001053// CHECK-LP64-NEXT: .quad __ZTv0_n24_N8test21_D3fooEv
Mike Stump33c530e2009-11-06 02:38:24 +00001054
Mike Stump513225f2009-11-13 21:55:26 +00001055// CHECK-LP64: __ZTC8test21_D0_8test21_B:
Chris Lattnerf79df052010-01-20 07:45:09 +00001056// CHECK-LP64-NEXT: .quad 0
1057// CHECK-LP64-NEXT: .quad 0
1058// CHECK-LP64-NEXT: .quad 0
Mike Stump513225f2009-11-13 21:55:26 +00001059// CHECK-LP64-NEXT: .quad __ZTI8test21_B
1060// CHECK-LP64-NEXT: .quad __ZN8test21_V3fooEv
1061
1062// CHECK-LP64: __ZTC8test21_D8_9test21_B1:
Chris Lattnerf79df052010-01-20 07:45:09 +00001063// CHECK-LP64-NEXT: .quad 0
1064// CHECK-LP64-NEXT: .quad 0
1065// CHECK-LP64-NEXT: .quad 0
Mike Stump513225f2009-11-13 21:55:26 +00001066// CHECK-LP64-NEXT: .quad __ZTI9test21_B1
1067// CHECK-LP64-NEXT: .quad __ZN9test21_V13fooEv
1068
Mike Stump9326c562009-11-13 19:36:46 +00001069// CHECK-LP64: __ZTT8test21_D:
1070// CHECK-LP64-NEXT: .quad (__ZTV8test21_D) + 40
1071// CHECK-LP64-NEXT: .quad (__ZTC8test21_D0_8test21_B) + 32
1072// CHECK-LP64-NEXT: .quad (__ZTC8test21_D0_8test21_B) + 32
1073// CHECK-LP64-NEXT: .quad (__ZTC8test21_D8_9test21_B1) + 32
1074// CHECK-LP64-NEXT: .quad (__ZTC8test21_D8_9test21_B1) + 32
1075// CHECK-LP64-NEXT .quad (__ZTV8test21_D) + 40
1076// CHECK-LP64-NEXT .quad (__ZTV8test21_D) + 80
1077// CHECK-LP64-NEXT .quad (__ZTV8test21_D) + 80
1078
Mike Stump33c530e2009-11-06 02:38:24 +00001079
Mike Stump7809e0d2009-10-28 00:35:46 +00001080
Mike Stump33c530e2009-11-06 02:38:24 +00001081test21_D d21;
1082test20_D d20;
Mike Stump62db2452009-11-03 19:28:52 +00001083test19_D d19;
1084test18_D d18;
1085test17_D d17;
Mike Stump54150d92009-10-14 18:38:01 +00001086test16_D d16;
Mike Stumpd9878a12009-10-13 10:55:21 +00001087test15_D d15;
1088test13_D d13;
Mike Stumpb9871a22009-08-21 01:45:00 +00001089test11_D d11;
Mike Stumpb9837442009-08-20 07:22:17 +00001090test10_D d10;
Mike Stump09765ec2009-08-19 02:53:08 +00001091test9_D d9;
1092test8_D d8;
1093
Mike Stumpd76264e2009-08-12 21:50:08 +00001094test5_D d5;
Mike Stump34fae9c2009-08-12 18:50:26 +00001095test4_D d4;
1096test3_D d3;
Mike Stump78846782009-08-13 23:33:29 +00001097
1098test6_D d6;
1099test7_D d7;