1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
// RUN: clang-cc -triple x86_64-apple-darwin -frtti=0 -std=c++0x -O3 -S %s -o %t-64.s &&
// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s &&
// RUN: clang-cc -triple i386-apple-darwin -frtti=0 -std=c++0x -O3 -S %s -o %t-32.s &&
// RUN: FileCheck -check-prefix LP32 -input-file=%t-32.s %s &&
// RUN: true
struct B {
virtual void bar1();
virtual void bar2();
int b;
};
void B::bar1() { }
void B::bar2() { }
struct C {
virtual void bee1();
virtual void bee2();
};
void C::bee1() { }
void C::bee2() { }
struct D {
virtual void boo();
};
void D::boo() { }
struct D1 {
virtual void bar();
void *d1;
};
void D1::bar() { }
class F : virtual public D1, virtual public D {
public:
virtual void foo();
void *f;
};
void F::foo() { }
int j;
void test2() {
F f;
static int sz = (char *)(&f.f) - (char *)(&f);
j = sz;
// FIXME: These should result in a frontend constant a la fold, no run time
// initializer
// CHECK-LP32: movl $4, __ZZ5test2vE2sz
// CHECK-LP64: movl $8, __ZZ5test2vE2sz(%rip)
}
static_assert(sizeof(F) == sizeof(void*)*4, "invalid vbase size");
struct E {
int e;
};
static_assert (sizeof (C) == (sizeof(void *)), "vtable pointer layout");
class A : public E, public B, public C {
public:
virtual void foo1();
virtual void foo2();
A() { }
int a;
} *ap;
void A::foo1() { }
void A::foo2() { }
int main() {
A a;
B b;
ap->e = 1;
ap->b = 2;
}
// CHECK-LP32: main:
// CHECK-LP32: movl $1, 8(%eax)
// CHECK-LP32: movl $2, 4(%eax)
// CHECK-LP64: main:
// CHECK-LP64: movl $1, 12(%rax)
// CHECK-LP64: movl $2, 8(%rax)
// CHECK-LP64: __ZTV1B:
// CHECK-LP64: .space 8
// CHECK-LP64: .space 8
// CHECK-LP64: .quad __ZN1B4bar1Ev
// CHECK-LP64: .quad __ZN1B4bar2Ev
// CHECK-LP32: __ZTV1B:
// CHECK-LP32: .space 4
// CHECK-LP32: .space 4
// CHECK-LP32: .long __ZN1B4bar1Ev
// CHECK-LP32: .long __ZN1B4bar2Ev
// CHECK-LP64: __ZTV1A:
// CHECK-LP64: .space 8
// CHECK-LP64: .space 8
// CHECK-LP64: .quad __ZN1B4bar1Ev
// CHECK-LP64: .quad __ZN1B4bar2Ev
// CHECK-LP64: .quad __ZN1A4foo1Ev
// CHECK-LP64: .quad __ZN1A4foo2Ev
// CHECK-LP64: .quad 18446744073709551600
// CHECK-LP64: .space 8
// CHECK-LP64: .quad __ZN1C4bee1Ev
// CHECK-LP64: .quad __ZN1C4bee2Ev
// CHECK-LP32: __ZTV1A:
// CHECK-LP32: .space 4
// CHECK-LP32: .space 4
// CHECK-LP32: .long __ZN1B4bar1Ev
// CHECK-LP32: .long __ZN1B4bar2Ev
// CHECK-LP32: .long __ZN1A4foo1Ev
// CHECK-LP32: .long __ZN1A4foo2Ev
// CHECK-LP32: .long 4294967284
// CHECK-LP32: .space 4
// CHECK-LP32: .long __ZN1C4bee1Ev
// CHECK-LP32: .long __ZN1C4bee2Ev
// CHECK-LP32: __ZTV1F:
// CHECK-LP32 .space 4
// CHECK-LP32 .long 8
// CHECK-LP32 .space 4
// CHECK-LP32: .space 4
// CHECK-LP32: .space 4
// CHECK-LP32 .long __ZN1D3booEv
// CHECK-LP32 .long __ZN1F3fooEv
// CHECK-LP32 .space 4
// CHECK-LP32 .long -8
// CHECK-LP32 .space 4
// CHECK-LP32: .long __ZN2D13barEv
// CHECK-LP64: __ZTV1F:
// CHECK-LP64 .space 8
// CHECK-LP64 .quad 16
// CHECK-LP64 .space 8
// CHECK-LP64: .space 8
// CHECK-LP64: .space 8
// CHECK-LP64 .quad __ZN1D3booEv
// CHECK-LP64 .quad __ZN1F3fooEv
// CHECK-LP64 .space 8
// CHECK-LP64 .space -16
// CHECK-LP64 .space 8
// CHECK-LP64: .quad __ZN2D13barEv
|