blob: aa35895d473df47ca159df5199fc01d5b6f8b915 [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 Stumpe07b6e52010-01-22 22:06:55 +000020// CHECK-LPLL64:@_ZTV1B = constant [4 x i8*] [i8* null, i8* bitcast (%0* @_ZTI1B to i8*), i8* bitcast (void (%struct.B*)* @_ZN1B4bar1Ev to i8*), i8* bitcast (void (%struct.B*)* @_ZN1B4bar2Ev to i8*)]
Mike Stumpa84b4042009-11-20 00:02:19 +000021
Mike Stump6f376332009-08-05 22:37:18 +000022struct C {
23 virtual void bee1();
24 virtual void bee2();
25};
26void C::bee1() { }
27void C::bee2() { }
Mike Stump104ffaa2009-08-04 21:58:42 +000028
Mike Stump2effeca2009-08-06 00:38:46 +000029struct D {
30 virtual void boo();
31};
32void D::boo() { }
Mike Stump104ffaa2009-08-04 21:58:42 +000033
Mike Stumpc5708d92009-08-06 14:12:47 +000034struct D1 {
35 virtual void bar();
Mike Stump02cf1e22009-08-06 23:48:32 +000036 virtual void bar2();
37 virtual void bar3();
38 virtual void bar4();
39 virtual void bar5();
Mike Stumpc5708d92009-08-06 14:12:47 +000040 void *d1;
41};
42void D1::bar() { }
43
44class F : virtual public D1, virtual public D {
45public:
46 virtual void foo();
47 void *f;
48};
49void F::foo() { }
50
Mike Stumpe07b6e52010-01-22 22:06:55 +000051// CHECK-LPLL64:@_ZTV1F = constant [19 x i8*] [i8* null, i8* inttoptr (i64 16 to i8*), i8* null, i8* null, i8* bitcast (%1* @_ZTI1F to i8*), i8* bitcast (void (%class.test14*)* @_ZN1D3booEv to i8*), i8* bitcast (void (%class.F*)* @_ZN1F3fooEv to i8*), i8* null, i8* null, i8* null, i8* null, i8* null, i8* inttoptr (i64 -16 to i8*), i8* bitcast (%1* @_ZTI1F to i8*), i8* bitcast (void (%struct.D1*)* @_ZN2D13barEv to i8*), i8* bitcast (void (%struct.D1*)* @_ZN2D14bar2Ev to i8*), i8* bitcast (void (%struct.D1*)* @_ZN2D14bar3Ev to i8*), i8* bitcast (void (%struct.D1*)* @_ZN2D14bar4Ev to i8*), i8* bitcast (void (%struct.D1*)* @_ZN2D14bar5Ev to i8*)]
Mike Stumpa84b4042009-11-20 00:02:19 +000052
53
Mike Stump2effeca2009-08-06 00:38:46 +000054struct E {
55 int e;
56};
57
58static_assert (sizeof (C) == (sizeof(void *)), "vtable pointer layout");
59
Mike Stumpeb19fa92009-08-06 13:41:24 +000060class A : public E, public B, public C {
Mike Stump3dee6ef2009-07-30 00:22:38 +000061public:
Mike Stump06758d02009-08-04 20:37:29 +000062 virtual void foo1();
63 virtual void foo2();
64 A() { }
Mike Stump2effeca2009-08-06 00:38:46 +000065 int a;
66} *ap;
Mike Stump6f376332009-08-05 22:37:18 +000067void A::foo1() { }
68void A::foo2() { }
Mike Stump3dee6ef2009-07-30 00:22:38 +000069
Mike Stumpe07b6e52010-01-22 22:06:55 +000070// CHECK-LPLL64:@_ZTV1A = constant [10 x i8*] [i8* null, i8* bitcast (%2* @_ZTI1A to i8*), i8* bitcast (void (%struct.B*)* @_ZN1B4bar1Ev to i8*), i8* bitcast (void (%struct.B*)* @_ZN1B4bar2Ev to i8*), i8* bitcast (void (%class.A*)* @_ZN1A4foo1Ev to i8*), i8* bitcast (void (%class.A*)* @_ZN1A4foo2Ev to i8*), i8* inttoptr (i64 -16 to i8*), i8* bitcast (%2* @_ZTI1A to i8*), i8* bitcast (void (%class.test14*)* @_ZN1C4bee1Ev to i8*), i8* bitcast (void (%class.test14*)* @_ZN1C4bee2Ev to i8*)]
71
Mike Stump06758d02009-08-04 20:37:29 +000072int main() {
73 A a;
Mike Stump26899b02009-08-05 22:48:36 +000074 B b;
Mike Stump2effeca2009-08-06 00:38:46 +000075 ap->e = 1;
76 ap->b = 2;
Mike Stump06758d02009-08-04 20:37:29 +000077}
78
Mike Stump2effeca2009-08-06 00:38:46 +000079
Mike Stumpf0070db2009-08-26 20:46:33 +000080struct test12_A {
81 virtual void foo0() { }
82 virtual void foo();
83} *test12_pa;
84
85struct test12_B : public test12_A {
86 virtual void foo() { }
87} *test12_pb;
88
89struct test12_D : public test12_B {
90} *test12_pd;
Mike Stump49520942009-08-11 04:03:59 +000091
Mike Stump941e3f32009-11-05 05:01:19 +000092
Mike Stump94d0bce2009-08-13 00:34:14 +000093struct test6_B2 { virtual void funcB2(); char b[1000]; };
94struct test6_B1 : virtual test6_B2 { virtual void funcB1(); };
95
96struct test6_D : test6_B2, virtual test6_B1 {
97};
98
Anders Carlsson0d8bb8e2010-01-18 03:58:13 +000099// CHECK-LP64: .zerofill __DATA,__common,_d6,2024,4
Mike Stump94d0bce2009-08-13 00:34:14 +0000100
Mike Stump78846782009-08-13 23:33:29 +0000101struct test7_B2 { virtual void funcB2(); };
102struct test7_B1 : virtual test7_B2 { virtual void funcB1(); };
103
104struct test7_D : test7_B2, virtual test7_B1 {
105};
106
Anders Carlsson0d8bb8e2010-01-18 03:58:13 +0000107// CHECK-LP64: .zerofill __DATA,__common,_d7,16,3
Mike Stump94d0bce2009-08-13 00:34:14 +0000108
109
Mike Stump49520942009-08-11 04:03:59 +0000110struct test3_B3 { virtual void funcB3(); };
111struct test3_B2 : virtual test3_B3 { virtual void funcB2(); };
112struct test3_B1 : virtual test3_B2 { virtual void funcB1(); };
113
Mike Stumpf0070db2009-08-26 20:46:33 +0000114struct test3_D : virtual test3_B1 {
Mike Stump49520942009-08-11 04:03:59 +0000115 virtual void funcD() { }
116};
117
Mike Stumpe07b6e52010-01-22 22:06:55 +0000118// CHECK-LPLL64:@_ZTV7test3_D = weak_odr constant [12 x i8*] [i8* null, i8* null, i8* null, i8* null, i8* null, i8* null, i8* null, i8* bitcast (%3* @_ZTI7test3_D to i8*), i8* bitcast (void (%class.test14*)* @_ZN8test3_B36funcB3Ev to i8*), i8* bitcast (void (%class.test17_B2*)* @_ZN8test3_B26funcB2Ev to i8*), i8* bitcast (void (%class.test17_B2*)* @_ZN8test3_B16funcB1Ev to i8*), i8* bitcast (void (%class.test17_B2*)* @_ZN7test3_D5funcDEv to i8*)]
119
Mike Stump49520942009-08-11 04:03:59 +0000120
Mike Stump34fae9c2009-08-12 18:50:26 +0000121struct test4_D : virtual B, virtual C {
122};
123
Mike Stumpe07b6e52010-01-22 22:06:55 +0000124// CHECK-LPLL64:@_ZTV7test4_D = weak_odr constant [14 x i8*] [i8* null, i8* inttoptr (i64 8 to i8*), i8* null, i8* null, i8* null, i8* bitcast (%1* @_ZTI7test4_D to i8*), i8* bitcast (void (%class.test14*)* @_ZN1C4bee1Ev to i8*), i8* bitcast (void (%class.test14*)* @_ZN1C4bee2Ev to i8*), i8* null, i8* null, i8* inttoptr (i64 -8 to i8*), i8* bitcast (%1* @_ZTI7test4_D to i8*), i8* bitcast (void (%struct.B*)* @_ZN1B4bar1Ev to i8*), i8* bitcast (void (%struct.B*)* @_ZN1B4bar2Ev to i8*)]
Mike Stump34fae9c2009-08-12 18:50:26 +0000125
Mike Stump49520942009-08-11 04:03:59 +0000126
Mike Stumpd76264e2009-08-12 21:50:08 +0000127struct test5_B3 { virtual void funcB3(); };
128struct test5_B2 : virtual test5_B3 { virtual void funcB2(); };
129struct test5_B1 : virtual test5_B2 { virtual void funcB1(); };
130
131struct test5_B23 { virtual void funcB23(); };
132struct test5_B22 : virtual test5_B23 { virtual void funcB22(); };
133struct test5_B21 : virtual test5_B22 { virtual void funcB21(); };
134
135
136struct B232 { virtual void funcB232(); };
137struct B231 { virtual void funcB231(); };
138
139struct test5_B33 { virtual void funcB33(); };
140struct test5_B32 : virtual test5_B33, virtual B232 { virtual void funcB32(); };
141struct test5_B31 : virtual test5_B32, virtual B231 { virtual void funcB31(); };
142
143struct test5_D : virtual test5_B1, virtual test5_B21, virtual test5_B31 {
144 virtual void funcD() { }
145};
146
Mike Stumpe07b6e52010-01-22 22:06:55 +0000147// CHECK-LPLL64:@_ZTV7test5_D = weak_odr constant [50 x i8*] [i8* inttoptr (i64 32 to i8*), i8* inttoptr (i64 24 to i8*), i8* inttoptr (i64 16 to i8*), i8* inttoptr (i64 16 to i8*), i8* inttoptr (i64 16 to i8*), i8* inttoptr (i64 8 to i8*), i8* inttoptr (i64 8 to i8*), i8* inttoptr (i64 8 to i8*), i8* null, i8* null, i8* null, i8* null, i8* null, i8* null, i8* null, i8* bitcast (%2* @_ZTI7test5_D to i8*), i8* bitcast (void (%class.test14*)* @_ZN8test5_B36funcB3Ev to i8*), i8* bitcast (void (%class.test17_B2*)* @_ZN8test5_B26funcB2Ev to i8*), i8* bitcast (void (%class.test17_B2*)* @_ZN8test5_B16funcB1Ev to i8*), i8* bitcast (void (%struct.test10_B2*)* @_ZN7test5_D5funcDEv to i8*), i8* null, i8* null, i8* null, i8* null, i8* null, i8* inttoptr (i64 -8 to i8*), i8* bitcast (%2* @_ZTI7test5_D to i8*), i8* bitcast (void (%class.test14*)* @_ZN9test5_B237funcB23Ev to i8*), i8* bitcast (void (%class.test17_B2*)* @_ZN9test5_B227funcB22Ev to i8*), i8* bitcast (void (%class.test17_B2*)* @_ZN9test5_B217funcB21Ev to i8*), i8* null, i8* inttoptr (i64 16 to i8*), i8* null, i8* null, i8* inttoptr (i64 8 to i8*), i8* null, i8* null, i8* inttoptr (i64 -16 to i8*), i8* bitcast (%2* @_ZTI7test5_D to i8*), i8* bitcast (void (%class.test14*)* @_ZN9test5_B337funcB33Ev to i8*), i8* bitcast (void (%class.test20_D*)* @_ZN9test5_B327funcB32Ev to i8*), i8* bitcast (void (%class.test23_D*)* @_ZN9test5_B317funcB31Ev to i8*), i8* null, i8* inttoptr (i64 -24 to i8*), i8* bitcast (%2* @_ZTI7test5_D to i8*), i8* bitcast (void (%class.test14*)* @_ZN4B2328funcB232Ev to i8*), i8* null, i8* inttoptr (i64 -32 to i8*), i8* bitcast (%2* @_ZTI7test5_D to i8*), i8* bitcast (void (%class.test14*)* @_ZN4B2318funcB231Ev to i8*)]
Mike Stumpd76264e2009-08-12 21:50:08 +0000148
Mike Stump276b9f12009-08-16 01:46:26 +0000149struct test8_B1 {
150 virtual void ftest8_B1() { }
151};
152struct test8_B2aa {
153 virtual void ftest8_B2aa() { }
154 int i;
155};
156struct test8_B2ab {
157 virtual void ftest8_B2ab() { }
158 int i;
159};
160struct test8_B2a : virtual test8_B2aa, virtual test8_B2ab {
161 virtual void ftest8_B2a() { }
162};
163struct test8_B2b {
164 virtual void ftest8_B2b() { }
165};
166struct test8_B2 : test8_B2a, test8_B2b {
167 virtual void ftest8_B2() { }
168};
169struct test8_B3 {
170 virtual void ftest8_B3() { }
171};
172class test8_D : test8_B1, test8_B2, test8_B3 {
Mike Stump09765ec2009-08-19 02:53:08 +0000173};
Mike Stump276b9f12009-08-16 01:46:26 +0000174
Mike Stumpe07b6e52010-01-22 22:06:55 +0000175// CHECK-LPLL64:@_ZTV7test8_D = weak_odr constant [25 x i8*] [i8* inttoptr (i64 48 to i8*), i8* inttoptr (i64 32 to i8*), i8* null, i8* bitcast (%2* @_ZTI7test8_D to i8*), i8* bitcast (void (%class.test14*)* @_ZN8test8_B19ftest8_B1Ev to i8*), i8* inttoptr (i64 40 to i8*), i8* inttoptr (i64 24 to i8*), i8* inttoptr (i64 -8 to i8*), i8* bitcast (%2* @_ZTI7test8_D to i8*), i8* bitcast (void (%struct.test10_B2a*)* @_ZN9test8_B2a10ftest8_B2aEv to i8*), i8* bitcast (void (%struct.test15_D*)* @_ZN8test8_B29ftest8_B2Ev to i8*), i8* inttoptr (i64 -16 to i8*), i8* bitcast (%2* @_ZTI7test8_D to i8*), i8* bitcast (void (%class.test14*)* @_ZN9test8_B2b10ftest8_B2bEv to i8*), i8* inttoptr (i64 -24 to i8*), i8* bitcast (%2* @_ZTI7test8_D to i8*), i8* bitcast (void (%class.test14*)* @_ZN8test8_B39ftest8_B3Ev to i8*), i8* null, i8* inttoptr (i64 -32 to i8*), i8* bitcast (%2* @_ZTI7test8_D to i8*), i8* bitcast (void (%struct.B*)* @_ZN10test8_B2aa11ftest8_B2aaEv to i8*), i8* null, i8* inttoptr (i64 -48 to i8*), i8* bitcast (%2* @_ZTI7test8_D to i8*), i8* bitcast (void (%struct.B*)* @_ZN10test8_B2ab11ftest8_B2abEv to i8*)]
Mike Stumpd76264e2009-08-12 21:50:08 +0000176
Mike Stumpe07b6e52010-01-22 22:06:55 +0000177// CHECK-LPLL64:@_ZTC7test8_D8_8test8_B2 = internal constant [14 x i8*] [i8* inttoptr (i64 40 to i8*), i8* inttoptr (i64 24 to i8*), i8* null, i8* bitcast (%1* @_ZTI8test8_B2 to i8*), i8* bitcast (void (%struct.test10_B2a*)* @_ZN9test8_B2a10ftest8_B2aEv to i8*), i8* bitcast (void (%struct.test15_D*)* @_ZN8test8_B29ftest8_B2Ev to i8*), i8* null, i8* inttoptr (i64 -24 to i8*), i8* bitcast (%1* @_ZTI8test8_B2 to i8*), i8* bitcast (void (%struct.B*)* @_ZN10test8_B2aa11ftest8_B2aaEv to i8*), i8* null, i8* inttoptr (i64 -40 to i8*), i8* bitcast (%1* @_ZTI8test8_B2 to i8*), i8* bitcast (void (%struct.B*)* @_ZN10test8_B2ab11ftest8_B2abEv to i8*)] ; <[14 x i8*]*> [#uses=3]
Mike Stump22efb852009-11-13 22:12:05 +0000178
Mike Stumpe07b6e52010-01-22 22:06:55 +0000179// CHECK-LPLL64:@_ZTC7test8_D8_9test8_B2a = internal constant [13 x i8*] [i8* inttoptr (i64 40 to i8*), i8* inttoptr (i64 24 to i8*), i8* null, i8* bitcast (%1* @_ZTI9test8_B2a to i8*), i8* bitcast (void (%struct.test10_B2a*)* @_ZN9test8_B2a10ftest8_B2aEv to i8*), i8* null, i8* inttoptr (i64 -24 to i8*), i8* bitcast (%1* @_ZTI9test8_B2a to i8*), i8* bitcast (void (%struct.B*)* @_ZN10test8_B2aa11ftest8_B2aaEv to i8*), i8* null, i8* inttoptr (i64 -40 to i8*), i8* bitcast (%1* @_ZTI9test8_B2a to i8*), i8* bitcast (void (%struct.B*)* @_ZN10test8_B2ab11ftest8_B2abEv to i8*)] ; <[13 x i8*]*> [#uses=3]
Mike Stump22efb852009-11-13 22:12:05 +0000180
Mike Stumpe07b6e52010-01-22 22:06:55 +0000181// CHECK-LPLL64:@_ZTT7test8_D = weak_odr constant [10 x i8*] [i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTV7test8_D, i64 0, i64 4) to i8*), i8* bitcast (i8** getelementptr inbounds ([14 x i8*]* @_ZTC7test8_D8_8test8_B2, i64 0, i64 4) to i8*), i8* bitcast (i8** getelementptr inbounds ([13 x i8*]* @_ZTC7test8_D8_9test8_B2a, i64 0, i64 4) to i8*), i8* bitcast (i8** getelementptr inbounds ([13 x i8*]* @_ZTC7test8_D8_9test8_B2a, i64 0, i64 8) to i8*), i8* bitcast (i8** getelementptr inbounds ([13 x i8*]* @_ZTC7test8_D8_9test8_B2a, i64 0, i64 12) to i8*), i8* bitcast (i8** getelementptr inbounds ([14 x i8*]* @_ZTC7test8_D8_8test8_B2, i64 0, i64 9) to i8*), i8* bitcast (i8** getelementptr inbounds ([14 x i8*]* @_ZTC7test8_D8_8test8_B2, i64 0, i64 13) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTV7test8_D, i64 0, i64 9) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTV7test8_D, i64 0, i64 20) to i8*), i8* bitcast (i8** getelementptr inbounds ([25 x i8*]* @_ZTV7test8_D, i64 0, i64 24) to i8*)]
Mike Stump22efb852009-11-13 22:12:05 +0000182
Mike Stump49520942009-08-11 04:03:59 +0000183
Mike Stump09765ec2009-08-19 02:53:08 +0000184struct test9_B3 { virtual void funcB3(); int i; };
185struct test9_B2 : virtual test9_B3 { virtual void funcB2(); int i; };
186struct test9_B1 : virtual test9_B2 { virtual void funcB1(); int i; };
187
188struct test9_B23 { virtual void funcB23(); int i; };
189struct test9_B22 : virtual test9_B23 { virtual void funcB22(); int i; };
190struct test9_B21 : virtual test9_B22 { virtual void funcB21(); int i; };
191
192
193struct test9_B232 { virtual void funcB232(); int i; };
194struct test9_B231 { virtual void funcB231(); int i; };
195
196struct test9_B33 { virtual void funcB33(); int i; };
197struct test9_B32 : virtual test9_B33, virtual test9_B232 { virtual void funcB32(); int i; };
198struct test9_B31 : virtual test9_B32, virtual test9_B231 { virtual void funcB31(); int i; };
199
200struct test9_D : virtual test9_B1, virtual test9_B21, virtual test9_B31 {
201 virtual void funcD() { }
202};
203
204// CHECK-LP64: __ZTV7test9_D:
205// CHECK-LP64-NEXT: .quad 168
206// CHECK-LP64-NEXT: .quad 152
207// CHECK-LP64-NEXT: .quad 136
208// CHECK-LP64-NEXT: .quad 120
209// CHECK-LP64-NEXT: .quad 104
210// CHECK-LP64-NEXT: .quad 88
211// CHECK-LP64-NEXT: .quad 72
212// CHECK-LP64-NEXT: .quad 56
213// CHECK-LP64-NEXT: .quad 40
214// CHECK-LP64-NEXT: .quad 24
215// CHECK-LP64-NEXT: .quad 8
Chris Lattnerf79df052010-01-20 07:45:09 +0000216// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000217// CHECK-LP64-NEXT: .quad __ZTI7test9_D
218// CHECK-LP64-NEXT: .quad __ZN7test9_D5funcDEv
Chris Lattnerf79df052010-01-20 07:45:09 +0000219// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000220// CHECK-LP64-NEXT: .quad 32
221// CHECK-LP64-NEXT: .quad 16
222// CHECK-LP64-NEXT: .quad 18446744073709551608
223// CHECK-LP64-NEXT: .quad __ZTI7test9_D
224// CHECK-LP64-NEXT: .quad __ZN8test9_B16funcB1Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000225// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000226// CHECK-LP64-NEXT: .quad 16
227// CHECK-LP64-NEXT: .quad 18446744073709551592
228// CHECK-LP64-NEXT: .quad __ZTI7test9_D
229// CHECK-LP64-NEXT: .quad __ZN8test9_B26funcB2Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000230// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000231// CHECK-LP64-NEXT: .quad 18446744073709551576
232// CHECK-LP64-NEXT: .quad __ZTI7test9_D
233// CHECK-LP64-NEXT: .quad __ZN8test9_B36funcB3Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000234// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000235// CHECK-LP64-NEXT: .quad 32
236// CHECK-LP64-NEXT: .quad 16
237// CHECK-LP64-NEXT: .quad 18446744073709551560
238// CHECK-LP64-NEXT: .quad __ZTI7test9_D
239// CHECK-LP64-NEXT: .quad __ZN9test9_B217funcB21Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000240// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000241// CHECK-LP64-NEXT: .quad 16
242// CHECK-LP64-NEXT: .quad 18446744073709551544
243// CHECK-LP64-NEXT: .quad __ZTI7test9_D
244// CHECK-LP64-NEXT: .quad __ZN9test9_B227funcB22Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000245// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000246// CHECK-LP64-NEXT: .quad 18446744073709551528
247// CHECK-LP64-NEXT: .quad __ZTI7test9_D
248// CHECK-LP64-NEXT: .quad __ZN9test9_B237funcB23Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000249// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000250// CHECK-LP64-NEXT: .quad 64
251// CHECK-LP64-NEXT: .quad 48
252// CHECK-LP64-NEXT: .quad 32
253// CHECK-LP64-NEXT: .quad 16
254// CHECK-LP64-NEXT: .quad 18446744073709551512
255// CHECK-LP64-NEXT: .quad __ZTI7test9_D
256// CHECK-LP64-NEXT: .quad __ZN9test9_B317funcB31Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000257// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000258// CHECK-LP64-NEXT: .quad 32
259// CHECK-LP64-NEXT: .quad 16
260// CHECK-LP64-NEXT: .quad 18446744073709551496
261// CHECK-LP64-NEXT: .quad __ZTI7test9_D
262// CHECK-LP64-NEXT: .quad __ZN9test9_B327funcB32Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000263// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000264// CHECK-LP64-NEXT: .quad 18446744073709551480
265// CHECK-LP64-NEXT: .quad __ZTI7test9_D
266// CHECK-LP64-NEXT: .quad __ZN9test9_B337funcB33Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000267// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000268// CHECK-LP64-NEXT: .quad 18446744073709551464
269// CHECK-LP64-NEXT: .quad __ZTI7test9_D
270// CHECK-LP64-NEXT: .quad __ZN10test9_B2328funcB232Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000271// CHECK-LP64-NEXT: .quad 0
Mike Stump09765ec2009-08-19 02:53:08 +0000272// CHECK-LP64-NEXT: .quad 18446744073709551448
273// CHECK-LP64-NEXT: .quad __ZTI7test9_D
274// CHECK-LP64-NEXT: .quad __ZN10test9_B2318funcB231Ev
275
Mike Stump09765ec2009-08-19 02:53:08 +0000276
Mike Stumpb9837442009-08-20 07:22:17 +0000277struct test10_O { int i; };
278
279struct test10_B1 : virtual test10_O {
280 virtual void ftest10_B1() { }
281};
282
283struct test10_B2aa : virtual test10_O {
284 int i;
285};
286struct test10_B2ab : virtual test10_O {
287 int i;
288};
289struct test10_B2a : virtual test10_B2aa, virtual test10_B2ab,virtual test10_O {
290 virtual void ftest10_B2a() { }
291};
292struct test10_B2b : virtual test10_O {
293 virtual void ftest10_B2b() { }
294};
295struct test10_B2 : test10_B2a {
296 virtual void ftest10_B2() { }
297};
298class test10_D : test10_B1, test10_B2 {
299
300 void ftest10_B2aa() { }
301};
302
303// CHECK-LP64:__ZTV8test10_D:
304// CHECK-LP64-NEXT: .quad 40
305// CHECK-LP64-NEXT: .quad 24
306// CHECK-LP64-NEXT: .quad 16
Chris Lattnerf79df052010-01-20 07:45:09 +0000307// CHECK-LP64-NEXT: .quad 0
Mike Stumpb9837442009-08-20 07:22:17 +0000308// CHECK-LP64-NEXT: .quad __ZTI8test10_D
309// CHECK-LP64-NEXT: .quad __ZN9test10_B110ftest10_B1Ev
310// CHECK-LP64-NEXT: .quad 32
311// CHECK-LP64-NEXT: .quad 8
312// CHECK-LP64-NEXT: .quad 16
313// CHECK-LP64-NEXT: .quad 18446744073709551608
314// CHECK-LP64-NEXT: .quad __ZTI8test10_D
315// CHECK-LP64-NEXT: .quad __ZN10test10_B2a11ftest10_B2aEv
316// CHECK-LP64-NEXT: .quad __ZN9test10_B210ftest10_B2Ev
317// CHECK-LP64-NEXT: .quad 18446744073709551608
318// CHECK-LP64-NEXT: .quad 18446744073709551592
319// CHECK-LP64-NEXT: .quad __ZTI8test10_D
320// CHECK-LP64-NEXT: .quad 18446744073709551592
321// CHECK-LP64-NEXT: .quad 18446744073709551576
322// CHECK-LP64-NEXT: .quad __ZTI8test10_D
323
Mike Stumpb9837442009-08-20 07:22:17 +0000324
Mike Stumpb9871a22009-08-21 01:45:00 +0000325struct test11_B {
326 virtual void B1() { }
327 virtual void D() { }
328 virtual void B2() { }
329};
330
331struct test11_D : test11_B {
332 virtual void D1() { }
333 virtual void D() { }
334 virtual void D2() { }
335};
336
Mike Stumpb9871a22009-08-21 01:45:00 +0000337// CHECK-LP64:__ZTV8test11_D:
Chris Lattnerf79df052010-01-20 07:45:09 +0000338// CHECK-LP64-NEXT: .quad 0
Mike Stumpb9871a22009-08-21 01:45:00 +0000339// CHECK-LP64-NEXT: .quad __ZTI8test11_D
340// CHECK-LP64-NEXT: .quad __ZN8test11_B2B1Ev
341// CHECK-LP64-NEXT: .quad __ZN8test11_D1DEv
342// CHECK-LP64-NEXT: .quad __ZN8test11_B2B2Ev
343// CHECK-LP64-NEXT: .quad __ZN8test11_D2D1Ev
344// CHECK-LP64-NEXT: .quad __ZN8test11_D2D2Ev
Mike Stumpb9837442009-08-20 07:22:17 +0000345
Mike Stumpdec025b2009-09-07 04:27:52 +0000346struct test13_B {
347 virtual void B1() { }
348 virtual void D() { }
349 virtual void Da();
350 virtual void Db() { }
351 virtual void Dc() { }
352 virtual void B2() { }
353 int i;
354};
355
356
357struct test13_NV1 {
358 virtual void fooNV1() { }
359 virtual void D() { }
360};
361
362
363struct test13_B2 : /* test13_NV1, */ virtual test13_B {
364 virtual void B2a() { }
365 virtual void B2() { }
366 virtual void D() { }
367 virtual void Da();
368 virtual void Dd() { }
369 virtual void B2b() { }
370 int i;
371};
372
373
374struct test13_D : test13_NV1, virtual test13_B2 {
375 virtual void D1() { }
376 virtual void D() { }
377 virtual void Db() { }
378 virtual void Dd() { }
379 virtual void D2() { }
380 virtual void fooNV1() { }
Mike Stumpd9878a12009-10-13 10:55:21 +0000381};
Mike Stumpdec025b2009-09-07 04:27:52 +0000382
383// CHECK-LP64:__ZTV8test13_D:
384// CHECK-LP64-NEXT: .quad 24
385// CHECK-LP64-NEXT: .quad 8
Chris Lattnerf79df052010-01-20 07:45:09 +0000386// CHECK-LP64-NEXT: .quad 0
Mike Stumpdec025b2009-09-07 04:27:52 +0000387// CHECK-LP64-NEXT: .quad __ZTI8test13_D
388// CHECK-LP64-NEXT: .quad __ZN8test13_D6fooNV1Ev
389// CHECK-LP64-NEXT: .quad __ZN8test13_D1DEv
390// CHECK-LP64-NEXT: .quad __ZN8test13_D2D1Ev
391// CHECK-LP64-NEXT: .quad __ZN8test13_D2DbEv
392// CHECK-LP64-NEXT: .quad __ZN8test13_D2DdEv
393// CHECK-LP64-NEXT: .quad __ZN8test13_D2D2Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000394// CHECK-LP64-NEXT: .quad 0
Mike Stumpdec025b2009-09-07 04:27:52 +0000395// CHECK-LP64-NEXT: .quad 18446744073709551608
Chris Lattnerf79df052010-01-20 07:45:09 +0000396// CHECK-LP64-NEXT: .quad 0
Mike Stumpdec025b2009-09-07 04:27:52 +0000397// CHECK-LP64-NEXT: .quad 18446744073709551608
Chris Lattnerf79df052010-01-20 07:45:09 +0000398// CHECK-LP64-NEXT: .quad 0
399// CHECK-LP64-NEXT: .quad 0
Mike Stumpdec025b2009-09-07 04:27:52 +0000400// CHECK-LP64-NEXT: .quad 16
401// CHECK-LP64-NEXT: .quad 18446744073709551608
402// CHECK-LP64-NEXT: .quad __ZTI8test13_D
403// CHECK-LP64-NEXT: .quad __ZN9test13_B23B2aEv
404// CHECK-LP64-NEXT: .quad __ZN9test13_B22B2Ev
405// CHECK-LP64-NEXT: .quad __ZTv0_n48_N8test13_D1DEv
406// CHECK-LP64-NEXT: .quad __ZN9test13_B22DaEv
407// CHECK-LP64-NEXT: .quad __ZTv0_n64_N8test13_D2DdEv
408// CHECK-LP64-NEXT: .quad __ZN9test13_B23B2bEv
409// CHECK-LP64-NEXT: .quad 18446744073709551600
Chris Lattnerf79df052010-01-20 07:45:09 +0000410// CHECK-LP64-NEXT: .quad 0
Mike Stumpdec025b2009-09-07 04:27:52 +0000411// CHECK-LP64-NEXT: .quad 18446744073709551592
412// CHECK-LP64-NEXT: .quad 18446744073709551600
413// CHECK-LP64-NEXT: .quad 18446744073709551592
Chris Lattnerf79df052010-01-20 07:45:09 +0000414// CHECK-LP64-NEXT: .quad 0
Mike Stumpdec025b2009-09-07 04:27:52 +0000415// CHECK-LP64-NEXT: .quad 18446744073709551592
416// CHECK-LP64-NEXT: .quad __ZTI8test13_D
417// CHECK-LP64-NEXT: .quad __ZN8test13_B2B1Ev
418// CHECK-LP64-NEXT: .quad __ZTv0_n32_N8test13_D1DEv
419// CHECK-LP64-NEXT: .quad __ZTv0_n40_N9test13_B22DaEv
420// CHECK-LP64-NEXT: .quad __ZTv0_n48_N8test13_D2DbEv
421// CHECK-LP64-NEXT: .quad __ZN8test13_B2DcEv
422// CHECK-LP64-NEXT: .quad __ZTv0_n64_N9test13_B22B2Ev
423
Mike Stump09765ec2009-08-19 02:53:08 +0000424
Mike Stumpd9878a12009-10-13 10:55:21 +0000425class test14 {
426public:
427 virtual void initWithInt(int a);
428 static test14 *withInt(int a);
429};
430
431void test14::initWithInt(int a) { }
432
433test14 *test14::withInt(int a) {
434 test14 *me = new test14;
435 me->initWithInt(a);
436 return me;
437}
438
439
440struct test15_B {
441 virtual test15_B *foo1() { return 0; }
442 virtual test15_B *foo2() { return 0; }
443 virtual test15_B *foo3() { return 0; }
444 int i;
445};
446
447struct test15_NV1 {
448 virtual void fooNV1() { }
449 int i;
450};
451
452struct test15_B2 : test15_NV1, virtual test15_B {
453 virtual test15_B2 *foo1() { return 0; }
454 virtual test15_B2 *foo2() { return 0; }
455 int i;
456};
457
458struct test15_D : test15_NV1, virtual test15_B2 {
459 virtual test15_D *foo1() { return 0; }
460};
461
462// CHECK-LP64:__ZTV8test15_D:
463// CHECK-LP64-NEXT: .quad 32
464// CHECK-LP64-NEXT: .quad 16
Chris Lattnerf79df052010-01-20 07:45:09 +0000465// CHECK-LP64-NEXT: .quad 0
Mike Stumpd9878a12009-10-13 10:55:21 +0000466// CHECK-LP64-NEXT: .quad __ZTI8test15_D
467// CHECK-LP64-NEXT: .quad __ZN10test15_NV16fooNV1Ev
468// CHECK-LP64-NEXT: .quad __ZN8test15_D4foo1Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000469// CHECK-LP64-NEXT: .quad 0
Mike Stumpd9878a12009-10-13 10:55:21 +0000470// CHECK-LP64-NEXT: .quad 18446744073709551600
Chris Lattnerf79df052010-01-20 07:45:09 +0000471// CHECK-LP64-NEXT: .quad 0
Mike Stumpd9878a12009-10-13 10:55:21 +0000472// CHECK-LP64-NEXT: .quad 16
473// CHECK-LP64-NEXT: .quad 18446744073709551600
474// CHECK-LP64-NEXT: .quad __ZTI8test15_D
475// CHECK-LP64-NEXT: .quad __ZN10test15_NV16fooNV1Ev
476// CHECK-LP64-NEXT: .quad __ZTcv0_n40_v0_n24_N8test15_D4foo1Ev
477// CHECK-LP64-NEXT: .quad __ZN9test15_B24foo2Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000478// CHECK-LP64-NEXT: .quad 0
Mike Stumpd9878a12009-10-13 10:55:21 +0000479// CHECK-LP64-NEXT: .quad 18446744073709551600
480// CHECK-LP64-NEXT: .quad 18446744073709551584
481// CHECK-LP64-NEXT: .quad 18446744073709551584
482// CHECK-LP64-NEXT: .quad __ZTI8test15_D
483// CHECK-LP64-NEXT: .quad __ZTcv0_n24_v0_n32_N8test15_D4foo1Ev
484// CHECK-LP64-NEXT: .quad __ZTcv0_n32_v0_n24_N9test15_B24foo2Ev
485// CHECK-LP64-NEXT: .quad __ZN8test15_B4foo3Ev
486
Mike Stumpd9878a12009-10-13 10:55:21 +0000487
Mike Stump54150d92009-10-14 18:38:01 +0000488struct test16_NV1 {
489 virtual void fooNV1() { }
490virtual void foo_NV1() { }
491 int i;
492};
493
494struct test16_NV2 {
495 virtual test16_NV2* foo1() { return 0; }
496virtual void foo_NV2() { }
497virtual void foo_NV2b() { }
498 int i;
499};
500
501struct test16_B : public test16_NV1, test16_NV2 {
502 virtual test16_B *foo1() { return 0; }
503 virtual test16_B *foo2() { return 0; }
504 virtual test16_B *foo3() { return 0; }
505virtual void foo_B() { }
506 int i;
507};
508
509struct test16_B2 : test16_NV1, virtual test16_B {
510 virtual test16_B2 *foo1() { return 0; }
511 virtual test16_B2 *foo2() { return 0; }
512virtual void foo_B2() { }
513 int i;
514};
515
516struct test16_D : test16_NV1, virtual test16_B2 {
Mike Stumpa84b4042009-11-20 00:02:19 +0000517 virtual void bar() { }
518 virtual test16_D *foo1() { return 0; }
Mike Stump54150d92009-10-14 18:38:01 +0000519};
520
521// CHECK-LP64: __ZTV8test16_D:
522// CHECK-LP64-NEXT: .quad 32
523// CHECK-LP64-NEXT: .quad 16
Chris Lattnerf79df052010-01-20 07:45:09 +0000524// CHECK-LP64-NEXT: .quad 0
Mike Stump54150d92009-10-14 18:38:01 +0000525// CHECK-LP64-NEXT: .quad __ZTI8test16_D
526// CHECK-LP64-NEXT: .quad __ZN10test16_NV16fooNV1Ev
527// CHECK-LP64-NEXT: .quad __ZN10test16_NV17foo_NV1Ev
Mike Stump941e3f32009-11-05 05:01:19 +0000528// CHECK-LP64-NEXT: .quad __ZN8test16_D3barEv
Mike Stump54150d92009-10-14 18:38:01 +0000529// CHECK-LP64-NEXT: .quad __ZN8test16_D4foo1Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000530// CHECK-LP64-NEXT: .quad 0
531// CHECK-LP64-NEXT: .quad 0
Mike Stump54150d92009-10-14 18:38:01 +0000532// CHECK-LP64-NEXT: .quad 18446744073709551600
Chris Lattnerf79df052010-01-20 07:45:09 +0000533// CHECK-LP64-NEXT: .quad 0
534// CHECK-LP64-NEXT: .quad 0
Mike Stump54150d92009-10-14 18:38:01 +0000535// CHECK-LP64-NEXT: .quad 16
536// CHECK-LP64-NEXT: .quad 18446744073709551600
537// CHECK-LP64-NEXT: .quad __ZTI8test16_D
538// CHECK-LP64-NEXT: .quad __ZN10test16_NV16fooNV1Ev
539// CHECK-LP64-NEXT: .quad __ZN10test16_NV17foo_NV1Ev
540// CHECK-LP64-NEXT: .quad __ZTcv0_n48_v0_n24_N8test16_D4foo1Ev
541// CHECK-LP64-NEXT: .quad __ZN9test16_B24foo2Ev
542// CHECK-LP64-NEXT: .quad __ZN9test16_B26foo_B2Ev
543// CHECK-LP64-NEXT .quad 16
544// CHECK-LP64-NEXT .quad 16
Chris Lattnerf79df052010-01-20 07:45:09 +0000545// CHECK-LP64-NEXT: .quad 0
546// CHECK-LP64-NEXT: .quad 0
Mike Stump54150d92009-10-14 18:38:01 +0000547// CHECK-LP64: .quad 18446744073709551600
Mike Stump9e7e3c62009-11-06 23:27:42 +0000548// CHECK-LP64-NEXT: .quad 18446744073709551584
Chris Lattnerf79df052010-01-20 07:45:09 +0000549// CHECK-LP64-NEXT: .quad 0
550// CHECK-LP64-NEXT: .quad 0
Mike Stump54150d92009-10-14 18:38:01 +0000551// CHECK-LP64-NEXT: .quad 18446744073709551584
552// CHECK-LP64-NEXT: .quad __ZTI8test16_D
553// CHECK-LP64-NEXT: .quad __ZN10test16_NV16fooNV1Ev
554// CHECK-LP64-NEXT: .quad __ZN10test16_NV17foo_NV1Ev
555// CHECK-LP64-NEXT: .quad __ZTcv0_n40_v0_n32_N8test16_D4foo1Ev
556// CHECK-LP64-NEXT: .quad __ZTcv0_n48_v0_n24_N9test16_B24foo2Ev
557// CHECK-LP64-NEXT: .quad __ZN8test16_B4foo3Ev
558// CHECK-LP64-NEXT: .quad __ZN8test16_B5foo_BEv
559// CHECK-LP64-NEXT: .quad 18446744073709551568
560// CHECK-LP64-NEXT: .quad __ZTI8test16_D
561// CHECK-LP64-NEXT .quad __ZTcvn16_n40_v16_n32_N8test16_D4foo1Ev
562// CHECK-LP64: .quad __ZN10test16_NV27foo_NV2Ev
563// CHECK-LP64-NEXT: .quad __ZN10test16_NV28foo_NV2bEv
564
Mike Stumpd9878a12009-10-13 10:55:21 +0000565
Mike Stump941e3f32009-11-05 05:01:19 +0000566
567
Mike Stump7809e0d2009-10-28 00:35:46 +0000568class test17_B1 {
569 virtual void foo() = 0;
570 virtual void bar() { }
571};
572
573class test17_B2 : public test17_B1 {
574 void foo() { }
575 virtual void bar() = 0;
576};
577
578class test17_D : public test17_B2 {
579 void bar() { }
Mike Stump62db2452009-11-03 19:28:52 +0000580};
Mike Stump7809e0d2009-10-28 00:35:46 +0000581
582
583// CHECK-LP64:__ZTV8test17_D:
Chris Lattnerf79df052010-01-20 07:45:09 +0000584// CHECK-LP64-NEXT: .quad 0
Mike Stump7809e0d2009-10-28 00:35:46 +0000585// CHECK-LP64-NEXT: .quad __ZTI8test17_D
586// CHECK-LP64-NEXT: .quad __ZN9test17_B23fooEv
587// CHECK-LP64-NEXT: .quad __ZN8test17_D3barEv
588
589// CHECK-LP64:__ZTV9test17_B2:
Chris Lattnerf79df052010-01-20 07:45:09 +0000590// CHECK-LP64-NEXT: .quad 0
Mike Stump7809e0d2009-10-28 00:35:46 +0000591// CHECK-LP64-NEXT: .quad __ZTI9test17_B2
592// CHECK-LP64-NEXT: .quad __ZN9test17_B23fooEv
593// CHECK-LP64-NEXT: .quad ___cxa_pure_virtual
594
595// CHECK-LP64:__ZTV9test17_B1:
Chris Lattnerf79df052010-01-20 07:45:09 +0000596// CHECK-LP64-NEXT: .quad 0
Mike Stump7809e0d2009-10-28 00:35:46 +0000597// CHECK-LP64-NEXT: .quad __ZTI9test17_B1
598// CHECK-LP64-NEXT: .quad ___cxa_pure_virtual
599// CHECK-LP64-NEXT: .quad __ZN9test17_B13barEv
600
601
Mike Stump9c212892009-11-03 19:03:17 +0000602struct test18_NV1 {
603 virtual void fooNV1() { }
604virtual void foo_NV1() { }
605 int i;
606};
607
608struct test18_NV2 {
609 virtual test18_NV2& foo1() { return *this; }
610virtual void foo_NV2() { }
611virtual void foo_NV2b() { }
612 int i;
613};
614
615struct test18_B : public test18_NV1, test18_NV2 {
616 virtual test18_B& foo1() { return *this; }
617 virtual test18_B *foo2() { return 0; }
618 virtual test18_B *foo3() { return 0; }
619virtual void foo_B() { }
620 int i;
621};
622
623struct test18_B2 : test18_NV1, virtual test18_B {
624 virtual test18_B2& foo1() { return *this; }
625 virtual test18_B2 *foo2() { return 0; }
626virtual void foo_B2() { }
627 int i;
628};
629
630struct test18_D : test18_NV1, virtual test18_B2 {
631 virtual test18_D& foo1() { return *this; }
Mike Stump62db2452009-11-03 19:28:52 +0000632};
633
634
635struct test19_VB1 { };
636struct test19_B1 : public virtual test19_VB1 {
637 virtual void fB1() { }
638 virtual void foB1B2() { }
639 virtual void foB1B3() { }
640 virtual void foB1B4() { }
641};
642
643struct test19_VB2 { };
644struct test19_B2: public test19_B1, public virtual test19_VB2 {
645 virtual void foB1B2() { }
646 virtual void foB1B3() { }
647 virtual void foB1B4() { }
648
649 virtual void fB2() { }
650 virtual void foB2B3() { }
651 virtual void foB2B4() { }
652};
653
654struct test19_VB3 { };
655struct test19_B3: virtual public test19_B2, public virtual test19_VB3 {
656 virtual void foB1B3() { }
657 virtual void foB1B4() { }
658
659 virtual void foB2B3() { }
660 virtual void foB2B4() { }
661
662 virtual void fB3() { }
663 virtual void foB3B4() { }
664};
665
666struct test19_VB4 { };
667struct test19_B4: public test19_B3, public virtual test19_VB4 {
668 virtual void foB1B4() { }
669
670 virtual void foB2B4() { }
671
672 virtual void foB3B4() { }
673
674 virtual void fB4() { }
675};
676
677struct test19_D : virtual test19_B4 {
678};
679
680
681// CHECK-LP64: __ZTV8test19_D:
Chris Lattnerf79df052010-01-20 07:45:09 +0000682// CHECK-LP64-NEXT: .quad 0
683// CHECK-LP64-NEXT: .quad 0
684// CHECK-LP64-NEXT: .quad 0
685// CHECK-LP64-NEXT: .quad 0
686// CHECK-LP64-NEXT: .quad 0
687// CHECK-LP64-NEXT: .quad 0
688// CHECK-LP64-NEXT: .quad 0
689// CHECK-LP64-NEXT: .quad 0
690// CHECK-LP64-NEXT: .quad 0
691// CHECK-LP64-NEXT: .quad 0
692// CHECK-LP64-NEXT: .quad 0
693// CHECK-LP64-NEXT: .quad 0
694// CHECK-LP64-NEXT: .quad 0
695// CHECK-LP64-NEXT: .quad 0
696// CHECK-LP64-NEXT: .quad 0
697// CHECK-LP64-NEXT: .quad 0
698// CHECK-LP64-NEXT: .quad 0
Mike Stump62db2452009-11-03 19:28:52 +0000699// CHECK-LP64-NEXT: .quad __ZTI8test19_D
Mike Stump9e7e3c62009-11-06 23:27:42 +0000700// CHECK-LP64-NEXT: .quad __ZN9test19_B13fB1Ev
701// CHECK-LP64-NEXT: .quad __ZN9test19_B26foB1B2Ev
702// CHECK-LP64-NEXT: .quad __ZN9test19_B36foB1B3Ev
703// CHECK-LP64-NEXT: .quad __ZN9test19_B46foB1B4Ev
704// CHECK-LP64-NEXT: .quad __ZN9test19_B23fB2Ev
705// CHECK-LP64-NEXT: .quad __ZN9test19_B36foB2B3Ev
706// CHECK-LP64-NEXT: .quad __ZN9test19_B46foB2B4Ev
707// CHECK-LP64-NEXT: .quad __ZN9test19_B33fB3Ev
708// CHECK-LP64-NEXT: .quad __ZN9test19_B46foB3B4Ev
709// CHECK-LP64-NEXT: .quad __ZN9test19_B43fB4Ev
Mike Stump62db2452009-11-03 19:28:52 +0000710
Mike Stump2cdcbdb2009-11-13 21:40:38 +0000711// CHECK-LP64: __ZTT8test19_D:
712// CHECK-LP64-NEXT: .quad (__ZTV8test19_D) + 144
713// CHECK-LP64-NEXT: .quad (__ZTV8test19_D) + 144
714// CHECK-LP64-NEXT .quad (__ZTV8test19_D) + 144
715// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B4) + 136
716// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B3) + 104
717// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B3) + 104
718// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B4) + 136
719// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B2) + 88
720// CHECK-LP64-NEXT .quad (__ZTC8test19_D0_9test19_B1) + 24
721
Mike Stump9c212892009-11-03 19:03:17 +0000722
Mike Stump99faefd2009-11-05 05:26:28 +0000723class test20_V {
724 virtual void foo1();
725};
726class test20_V1 {
727 virtual void foo2();
728};
729class test20_B : virtual test20_V {
730} b;
731class test20_B1 : virtual test20_V1 {
732};
733class test20_D : public test20_B, public test20_B1 {
Mike Stump33c530e2009-11-06 02:38:24 +0000734};
Mike Stump99faefd2009-11-05 05:26:28 +0000735
736// CHECK-LP64: __ZTV8test20_D:
737// CHECK-LP64-NEXT: .quad 8
Chris Lattnerf79df052010-01-20 07:45:09 +0000738// CHECK-LP64-NEXT: .quad 0
739// CHECK-LP64-NEXT: .quad 0
740// CHECK-LP64-NEXT: .quad 0
Mike Stump99faefd2009-11-05 05:26:28 +0000741// CHECK-LP64-NEXT: .quad __ZTI8test20_D
742// CHECK-LP64-NEXT: .quad __ZN8test20_V4foo1Ev
Chris Lattnerf79df052010-01-20 07:45:09 +0000743// CHECK-LP64-NEXT: .quad 0
744// CHECK-LP64-NEXT: .quad 0
Mike Stump99faefd2009-11-05 05:26:28 +0000745// CHECK-LP64-NEXT: .quad 18446744073709551608
746// CHECK-LP64-NEXT: .quad __ZTI8test20_D
747// CHECK-LP64-NEXT: .quad __ZN9test20_V14foo2Ev
748
Mike Stump513225f2009-11-13 21:55:26 +0000749// CHECK-LP64: __ZTC8test20_D0_8test20_B:
Chris Lattnerf79df052010-01-20 07:45:09 +0000750// CHECK-LP64-NEXT: .quad 0
751// CHECK-LP64-NEXT: .quad 0
752// CHECK-LP64-NEXT: .quad 0
Mike Stump513225f2009-11-13 21:55:26 +0000753// CHECK-LP64-NEXT: .quad __ZTI8test20_B
754// CHECK-LP64-NEXT: .quad __ZN8test20_V4foo1Ev
755
756// CHECK-LP64: __ZTC8test20_D8_9test20_B1:
Chris Lattnerf79df052010-01-20 07:45:09 +0000757// CHECK-LP64-NEXT: .quad 0
758// CHECK-LP64-NEXT: .quad 0
759// CHECK-LP64-NEXT: .quad 0
Mike Stump513225f2009-11-13 21:55:26 +0000760// CHECK-LP64-NEXT: .quad __ZTI9test20_B1
761// CHECK-LP64-NEXT: .quad __ZN9test20_V14foo2Ev
762
Mike Stump2cdcbdb2009-11-13 21:40:38 +0000763// CHECK-LP64: __ZTT8test20_D:
764// CHECK-LP64-NEXT: .quad (__ZTV8test20_D) + 40
765// CHECK-LP64-NEXT: .quad (__ZTC8test20_D0_8test20_B) + 32
766// CHECK-LP64-NEXT: .quad (__ZTC8test20_D0_8test20_B) + 32
767// CHECK-LP64-NEXT: .quad (__ZTC8test20_D8_9test20_B1) + 32
768// CHECK-LP64-NEXT: .quad (__ZTC8test20_D8_9test20_B1) + 32
769// CHECK-LP64-NEXT .quad (__ZTV8test20_D) + 40
770// CHECK-LP64-NEXT .quad (__ZTV8test20_D) + 80
771// CHECK-LP64-NEXT .quad (__ZTV8test20_D) + 80
772
Mike Stump99faefd2009-11-05 05:26:28 +0000773
Mike Stump33c530e2009-11-06 02:38:24 +0000774class test21_V {
Mike Stumpa6604402009-11-13 18:53:35 +0000775 virtual void foo() { }
Mike Stump33c530e2009-11-06 02:38:24 +0000776};
777class test21_V1 {
Mike Stumpa6604402009-11-13 18:53:35 +0000778 virtual void foo() { }
Mike Stump33c530e2009-11-06 02:38:24 +0000779};
780class test21_B : virtual test21_V {
781};
782class test21_B1 : virtual test21_V1 {
783};
784class test21_D : public test21_B, public test21_B1 {
785 void foo() { }
786};
787
788// CHECK-LP64: __ZTV8test21_D:
789// CHECK-LP64-NEXT: .quad 8
Chris Lattnerf79df052010-01-20 07:45:09 +0000790// CHECK-LP64-NEXT: .quad 0
791// CHECK-LP64-NEXT: .quad 0
792// CHECK-LP64-NEXT: .quad 0
Mike Stump33c530e2009-11-06 02:38:24 +0000793// CHECK-LP64-NEXT: .quad __ZTI8test21_D
794// CHECK-LP64-NEXT: .quad __ZN8test21_D3fooEv
Chris Lattnerf79df052010-01-20 07:45:09 +0000795// CHECK-LP64-NEXT: .quad 0
Mike Stump33c530e2009-11-06 02:38:24 +0000796// CHECK-LP64-NEXT: .quad 18446744073709551608
797// CHECK-LP64-NEXT: .quad 18446744073709551608
798// CHECK-LP64-NEXT: .quad __ZTI8test21_D
Mike Stump9e7e3c62009-11-06 23:27:42 +0000799// CHECK-LP64-NEXT: .quad __ZTv0_n24_N8test21_D3fooEv
Mike Stump33c530e2009-11-06 02:38:24 +0000800
Mike Stump513225f2009-11-13 21:55:26 +0000801// CHECK-LP64: __ZTC8test21_D0_8test21_B:
Chris Lattnerf79df052010-01-20 07:45:09 +0000802// CHECK-LP64-NEXT: .quad 0
803// CHECK-LP64-NEXT: .quad 0
804// CHECK-LP64-NEXT: .quad 0
Mike Stump513225f2009-11-13 21:55:26 +0000805// CHECK-LP64-NEXT: .quad __ZTI8test21_B
806// CHECK-LP64-NEXT: .quad __ZN8test21_V3fooEv
807
808// CHECK-LP64: __ZTC8test21_D8_9test21_B1:
Chris Lattnerf79df052010-01-20 07:45:09 +0000809// CHECK-LP64-NEXT: .quad 0
810// CHECK-LP64-NEXT: .quad 0
811// CHECK-LP64-NEXT: .quad 0
Mike Stump513225f2009-11-13 21:55:26 +0000812// CHECK-LP64-NEXT: .quad __ZTI9test21_B1
813// CHECK-LP64-NEXT: .quad __ZN9test21_V13fooEv
814
Mike Stump9326c562009-11-13 19:36:46 +0000815// CHECK-LP64: __ZTT8test21_D:
816// CHECK-LP64-NEXT: .quad (__ZTV8test21_D) + 40
817// CHECK-LP64-NEXT: .quad (__ZTC8test21_D0_8test21_B) + 32
818// CHECK-LP64-NEXT: .quad (__ZTC8test21_D0_8test21_B) + 32
819// CHECK-LP64-NEXT: .quad (__ZTC8test21_D8_9test21_B1) + 32
820// CHECK-LP64-NEXT: .quad (__ZTC8test21_D8_9test21_B1) + 32
821// CHECK-LP64-NEXT .quad (__ZTV8test21_D) + 40
822// CHECK-LP64-NEXT .quad (__ZTV8test21_D) + 80
823// CHECK-LP64-NEXT .quad (__ZTV8test21_D) + 80
824
Mike Stump33c530e2009-11-06 02:38:24 +0000825
Mike Stumpfc9f16c2010-01-22 06:45:05 +0000826struct test22_s1 { virtual void dtor() { } };
827struct test22_s2 { virtual void dtor() { } };
828struct test22_s3 : test22_s1, test22_s2 { virtual void dtor() { } };
829struct test22_D : test22_s3 { virtual void dtor() { } };
Mike Stump7809e0d2009-10-28 00:35:46 +0000830
Mike Stumpfc9f16c2010-01-22 06:45:05 +0000831// CHECK-LP64: __ZTV8test22_D:
832// CHECK-LP64-NEXT: .quad 0
833// CHECK-LP64-NEXT: .quad __ZTI8test22_D
834// CHECK-LP64-NEXT: .quad __ZN8test22_D4dtorEv
835// CHECK-LP64-NEXT: .quad 18446744073709551608
836// CHECK-LP64-NEXT: .quad __ZTI8test22_D
837// CHECK-LP64-NEXT: .quad __ZThn8_N8test22_D4dtorEv
838
839
Mike Stump6ebee072010-01-22 20:27:17 +0000840class test23_s1 {
841 virtual void fun1(char *t) { }
842};
843class test23_s2 {
844 virtual void fun2(char *t) { }
845};
846class test23_s3 {
847 virtual void fun3(char *t) { }
848};
849class test23_s4: virtual test23_s1, test23_s2, test23_s3 {
850 virtual void fun4(char *t) { }
851};
852class test23_D: virtual test23_s4 {
853 virtual void fun5(char *t) { }
854};
855
856
857// CHECK-LP64: __ZTV8test23_D:
858// CHECK-LP64-NEXT: .quad 0
859// CHECK-LP64-NEXT: .quad 8
860// CHECK-LP64-NEXT: .quad 0
861// CHECK-LP64-NEXT: .quad 0
862// CHECK-LP64-NEXT: .quad __ZTI8test23_D
863// CHECK-LP64-NEXT: .quad __ZN9test23_s14fun1EPc
864// CHECK-LP64-NEXT: .quad __ZN8test23_D4fun5EPc
865// CHECK-LP64-NEXT .quad 8
866// CHECK-LP64: .quad 0
867// CHECK-LP64-NEXT: .quad 0
868// CHECK-LP64: .quad 18446744073709551608
869// CHECK-LP64-NEXT: .quad 18446744073709551608
870// CHECK-LP64-NEXT: .quad __ZTI8test23_D
871// CHECK-LP64-NEXT: .quad __ZN9test23_s24fun2EPc
872// CHECK-LP64-NEXT: .quad __ZN9test23_s44fun4EPc
873// CHECK-LP64-NEXT: .quad 18446744073709551600
874// CHECK-LP64-NEXT: .quad __ZTI8test23_D
875// CHECK-LP64-NEXT: .quad __ZN9test23_s34fun3EPc
876
877
878test23_D d23;
Mike Stumpfc9f16c2010-01-22 06:45:05 +0000879test22_D d22;
Mike Stump33c530e2009-11-06 02:38:24 +0000880test21_D d21;
881test20_D d20;
Mike Stump62db2452009-11-03 19:28:52 +0000882test19_D d19;
883test18_D d18;
884test17_D d17;
Mike Stump54150d92009-10-14 18:38:01 +0000885test16_D d16;
Mike Stumpd9878a12009-10-13 10:55:21 +0000886test15_D d15;
887test13_D d13;
Mike Stumpb9871a22009-08-21 01:45:00 +0000888test11_D d11;
Mike Stumpb9837442009-08-20 07:22:17 +0000889test10_D d10;
Mike Stump09765ec2009-08-19 02:53:08 +0000890test9_D d9;
891test8_D d8;
892
Mike Stumpd76264e2009-08-12 21:50:08 +0000893test5_D d5;
Mike Stump34fae9c2009-08-12 18:50:26 +0000894test4_D d4;
895test3_D d3;
Mike Stump78846782009-08-13 23:33:29 +0000896
897test6_D d6;
898test7_D d7;
Mike Stumpe07b6e52010-01-22 22:06:55 +0000899
900
901int j;
902void *vp;
903void test2() {
904 F f;
905 static int sz = (char *)(&f.f) - (char *)(&f);
906 vp = &sz;
907 j = sz;
908 // FIXME: These should result in a frontend constant a la fold, no run time
909 // initializer
910 // CHECK-LPLL64: define void @_Z5test2v()
911 // CHECK-LPLL64: = getelementptr inbounds %class.F* %f, i32 0, i32 1
912}
913
914static_assert(sizeof(F) == sizeof(void*)*4, "invalid vbase size");
915
916
917void test12_foo() {
918 test12_pa->foo0();
919 test12_pb->foo0();
920 test12_pd->foo0();
921 test12_pa->foo();
922 test12_pb->foo();
923 test12_pd->foo();
924 test12_pa->test12_A::foo();
925}
926
927
928// CHECK-LPLL64:define void @_Z10test12_foov() nounwind {
929// CHECK-LPLL64: call void %
930// CHECK-LPLL64: call void %
931// CHECK-LPLL64: call void %
932// CHECK-LPLL64: call void %
933// CHECK-LPLL64: call void %
934// CHECK-LPLL64: call void %
935// CHECK-LPLL64: call void @_ZN8test12_A3fooEv(%class.test14* %{{.*}})
936
937
938// FIXME: This is the wrong thunk, but until these issues are fixed, better
939// than nothing.
940// CHECK-LPLL64:define weak %class.test8_D* @_ZTcvn16_n72_v16_n32_N8test16_D4foo1Ev(%class.test8_D*)
941// CHECK-LPLL64: %{{retval|2}} = alloca %class.test8_D*
942// CHECK-LPLL64: %.addr = alloca %class.test8_D*
943// CHECK-LPLL64: store %class.test8_D* %0, %class.test8_D** %.addr
944// CHECK-LPLL64: %{{this|3}} = load %class.test8_D** %.addr
945// CHECK-LPLL64: %{{1|4}} = bitcast %class.test8_D* %{{this|3}} to i8*
946// CHECK-LPLL64: %{{2|5}} = getelementptr inbounds i8* %{{1|4}}, i64 -16
947// CHECK-LPLL64: %{{3|6}} = bitcast i8* %{{2|5}} to %class.test8_D*
948// CHECK-LPLL64: %{{4|7}} = bitcast %class.test8_D* %{{3|6}} to i8*
949// CHECK-LPLL64: %{{5|8}} = bitcast %class.test8_D* %3 to i64**
950// CHECK-LPLL64: %{{vtable|9}} = load i64** %{{5|8}}
951// CHECK-LPLL64: %{{6|10}} = getelementptr inbounds i64* %{{vtable|9}}, i64 -9
952// CHECK-LPLL64: %{{7|11}} = load i64* %{{6|10}}
953// CHECK-LPLL64: %{{8|12}} = getelementptr i8* %{{4|7}}, i64 %{{7|11}}
954// CHECK-LPLL64: %{{9|13}} = bitcast i8* %{{8|12}} to %class.test8_D*
955// CHECK-LPLL64: %{{call|14}} = call %class.test8_D* @_ZTch0_v16_n32_N8test16_D4foo1Ev(%class.test8_D* %{{9|13}})
956// CHECK-LPLL64: store %class.test8_D* %{{call|14}}, %class.test8_D** %{{retval|2}}
957// CHECK-LPLL64: %{{10|15}} = load %class.test8_D** %{{retval|2}}
958// CHECK-LPLL64: ret %class.test8_D* %{{10|15}}
959// CHECK-LPLL64:}
960
961// CHECK-LPLL64:define weak %class.test8_D* @_ZTch0_v16_n32_N8test16_D4foo1Ev(%{{class.test8_D|.*}}*)
962// CHECK-LPLL64: %{{retval|2}} = alloca %class.test8_D*
963// CHECK-LPLL64: %.addr = alloca %class.test8_D*
964// CHECK-LPLL64: store %class.test8_D* %0, %class.test8_D** %.addr
965// CHECK-LPLL64: %{{this|3}} = load %class.test8_D** %.addr
966// CHECK-LPLL64: %{{call|4}} = call %class.test8_D* @_ZN8test16_D4foo1Ev(%class.test8_D* %{{this|3}})
967// CHECK-LPLL64: %{{1|5}} = icmp ne %class.test8_D* %{{call|4}}, null
968// CHECK-LPLL64: br i1 %{{1|5}}, label %{{2|6}}, label %{{12|17}}
969// CHECK-LPLL64:; <label>:{{2|6}}
970// CHECK-LPLL64: %{{3|7}} = bitcast %class.test8_D* %{{call|4}} to i8*
971// CHECK-LPLL64: %{{4|8}} = getelementptr inbounds i8* %{{3|7}}, i64 16
972// CHECK-LPLL64: %{{5|9}} = bitcast i8* %4 to %class.test8_D*
973// CHECK-LPLL64: %{{6|10}} = bitcast %class.test8_D* %{{5|9}} to i8*
974// CHECK-LPLL64: %{{7|11}} = bitcast %class.test8_D* %{{5|9}} to i64**
975// CHECK-LPLL64: %{{vtable|12}} = load i64** %{{7|11}}
976// CHECK-LPLL64: %{{8|13}} = getelementptr inbounds i64* %vtable, i64 -4
977// CHECK-LPLL64: %{{9|14}} = load i64* %{{8|13}}
978// CHECK-LPLL64: %{{10|15}} = getelementptr i8* %{{6|10}}, i64 %{{9|14}}
979// CHECK-LPLL64: %{{11|16}} = bitcast i8* %{{10|15}} to %class.test8_D*
980// CHECK-LPLL64: br label %{{13|18}}
981// CHECK-LPLL64:; <label>:{{12|17}}
982// CHECK-LPLL64: br label %{{13|18}}
983// CHECK-LPLL64:; <label>:{{13|18}}
984// CHECK-LPLL64: %{{14|19}} = phi %class.test8_D* [ %{{11|16}}, %{{2|6}} ], [ %{{call|4}}, %{{12|17}} ]
985// CHECK-LPLL64: store %class.test8_D* %{{14|19}}, %class.test8_D** %{{retval|2}}
986// CHECK-LPLL64: %{{15|20}} = load %class.test8_D** %{{retval|2}}
987// CHECK-LPLL64: ret %class.test8_D* %{{15|20}}
988// CHECK-LPLL64:}