blob: 35548de04360e3d6a637f9ec310093a9baafe66d [file] [log] [blame]
Mike Stumpc5708d92009-08-06 14:12:47 +00001// RUN: clang-cc -triple x86_64-apple-darwin -frtti=0 -std=c++0x -O3 -S %s -o %t-64.s &&
Mike Stump06758d02009-08-04 20:37:29 +00002// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s &&
Mike Stumpc5708d92009-08-06 14:12:47 +00003// RUN: clang-cc -triple i386-apple-darwin -frtti=0 -std=c++0x -O3 -S %s -o %t-32.s &&
Mike Stump06758d02009-08-04 20:37:29 +00004// RUN: FileCheck -check-prefix LP32 -input-file=%t-32.s %s &&
5// RUN: true
Mike Stump3dee6ef2009-07-30 00:22:38 +00006
Mike Stump104ffaa2009-08-04 21:58:42 +00007struct B {
8 virtual void bar1();
9 virtual void bar2();
Mike Stump2effeca2009-08-06 00:38:46 +000010 int b;
Mike Stump104ffaa2009-08-04 21:58:42 +000011};
Mike Stump6f376332009-08-05 22:37:18 +000012void B::bar1() { }
13void B::bar2() { }
14
15struct C {
16 virtual void bee1();
17 virtual void bee2();
18};
19void C::bee1() { }
20void C::bee2() { }
Mike Stump104ffaa2009-08-04 21:58:42 +000021
Mike Stump2effeca2009-08-06 00:38:46 +000022struct D {
23 virtual void boo();
24};
25void D::boo() { }
Mike Stump104ffaa2009-08-04 21:58:42 +000026
Mike Stumpc5708d92009-08-06 14:12:47 +000027struct D1 {
28 virtual void bar();
29 void *d1;
30};
31void D1::bar() { }
32
33class F : virtual public D1, virtual public D {
34public:
35 virtual void foo();
36 void *f;
37};
38void F::foo() { }
39
40int j;
41void test2() {
42 F f;
43 static int sz = (char *)(&f.f) - (char *)(&f);
44 j = sz;
45 // CHECK-LP32: movl $4, __ZZ5test2vE2sz
46 // CHECK-LP64: movl $8, __ZZ5test2vE2sz(%rip)
47}
48
49static_assert(sizeof(F) == sizeof(void*)*4, "invalid vbase size");
50
Mike Stump2effeca2009-08-06 00:38:46 +000051struct E {
52 int e;
53};
54
55static_assert (sizeof (C) == (sizeof(void *)), "vtable pointer layout");
56
Mike Stumpeb19fa92009-08-06 13:41:24 +000057class A : public E, public B, public C {
Mike Stump3dee6ef2009-07-30 00:22:38 +000058public:
Mike Stump06758d02009-08-04 20:37:29 +000059 virtual void foo1();
60 virtual void foo2();
61 A() { }
Mike Stump2effeca2009-08-06 00:38:46 +000062 int a;
63} *ap;
Mike Stump6f376332009-08-05 22:37:18 +000064void A::foo1() { }
65void A::foo2() { }
Mike Stump3dee6ef2009-07-30 00:22:38 +000066
Mike Stump06758d02009-08-04 20:37:29 +000067int main() {
68 A a;
Mike Stump26899b02009-08-05 22:48:36 +000069 B b;
Mike Stump2effeca2009-08-06 00:38:46 +000070 ap->e = 1;
71 ap->b = 2;
Mike Stump06758d02009-08-04 20:37:29 +000072}
73
Mike Stump2effeca2009-08-06 00:38:46 +000074// CHECK-LP32: main:
75// CHECK-LP32: movl $1, 8(%eax)
76// CHECK-LP32: movl $2, 4(%eax)
77
78// CHECK-LP64: main:
79// CHECK-LP64: movl $1, 12(%rax)
80// CHECK-LP64: movl $2, 8(%rax)
81
Mike Stump26899b02009-08-05 22:48:36 +000082// CHECK-LP64: __ZTV1B:
83// CHECK-LP64: .space 8
84// CHECK-LP64: .space 8
85// CHECK-LP64: .quad __ZN1B4bar1Ev
86// CHECK-LP64: .quad __ZN1B4bar2Ev
87
88// CHECK-LP32: __ZTV1B:
89// CHECK-LP32: .space 4
90// CHECK-LP32: .space 4
91// CHECK-LP32: .long __ZN1B4bar1Ev
92// CHECK-LP32: .long __ZN1B4bar2Ev
93
Mike Stump06758d02009-08-04 20:37:29 +000094// CHECK-LP64: __ZTV1A:
95// CHECK-LP64: .space 8
96// CHECK-LP64: .space 8
Mike Stump104ffaa2009-08-04 21:58:42 +000097// CHECK-LP64: .quad __ZN1B4bar1Ev
98// CHECK-LP64: .quad __ZN1B4bar2Ev
Mike Stump06758d02009-08-04 20:37:29 +000099// CHECK-LP64: .quad __ZN1A4foo1Ev
100// CHECK-LP64: .quad __ZN1A4foo2Ev
Mike Stump2effeca2009-08-06 00:38:46 +0000101// CHECK-LP64: .quad 18446744073709551600
Mike Stump6f376332009-08-05 22:37:18 +0000102// CHECK-LP64: .space 8
103// CHECK-LP64: .quad __ZN1C4bee1Ev
104// CHECK-LP64: .quad __ZN1C4bee2Ev
Mike Stump06758d02009-08-04 20:37:29 +0000105
106// CHECK-LP32: __ZTV1A:
107// CHECK-LP32: .space 4
108// CHECK-LP32: .space 4
Mike Stump104ffaa2009-08-04 21:58:42 +0000109// CHECK-LP32: .long __ZN1B4bar1Ev
110// CHECK-LP32: .long __ZN1B4bar2Ev
Mike Stump06758d02009-08-04 20:37:29 +0000111// CHECK-LP32: .long __ZN1A4foo1Ev
112// CHECK-LP32: .long __ZN1A4foo2Ev
Mike Stump2effeca2009-08-06 00:38:46 +0000113// CHECK-LP32: .long 4294967284
Mike Stump6f376332009-08-05 22:37:18 +0000114// CHECK-LP32: .space 4
115// CHECK-LP32: .long __ZN1C4bee1Ev
116// CHECK-LP32: .long __ZN1C4bee2Ev