1 | // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm-only -fdump-vtable-layouts 2>&1 | FileCheck %s |
2 | |
3 | // A collection of big class hierarchies and their vtables. |
4 | |
5 | namespace Test1 { |
6 | |
7 | class C0 |
8 | { |
9 | }; |
10 | class C1 |
11 | : virtual public C0 |
12 | { |
13 | int k0; |
14 | }; |
15 | class C2 |
16 | : public C0 |
17 | , virtual public C1 |
18 | { |
19 | int k0; |
20 | }; |
21 | class C3 |
22 | : virtual public C0 |
23 | , virtual public C1 |
24 | , public C2 |
25 | { |
26 | int k0; |
27 | int k1; |
28 | int k2; |
29 | int k3; |
30 | }; |
31 | class C4 |
32 | : public C2 |
33 | , virtual public C3 |
34 | , public C0 |
35 | { |
36 | int k0; |
37 | }; |
38 | class C5 |
39 | : public C0 |
40 | , virtual public C4 |
41 | , public C2 |
42 | , public C1 |
43 | , virtual public C3 |
44 | { |
45 | int k0; |
46 | }; |
47 | class C6 |
48 | : virtual public C3 |
49 | , public C0 |
50 | , public C5 |
51 | , public C4 |
52 | , public C1 |
53 | { |
54 | int k0; |
55 | }; |
56 | class C7 |
57 | : virtual public C5 |
58 | , virtual public C6 |
59 | , virtual public C3 |
60 | , public C4 |
61 | , virtual public C2 |
62 | { |
63 | int k0; |
64 | int k1; |
65 | }; |
66 | class C8 |
67 | : public C7 |
68 | , public C5 |
69 | , public C3 |
70 | , virtual public C4 |
71 | , public C1 |
72 | , public C2 |
73 | { |
74 | int k0; |
75 | int k1; |
76 | }; |
77 | |
78 | // CHECK: Vtable for 'Test1::C9' (87 entries). |
79 | // CHECK-NEXT: 0 | vbase_offset (344) |
80 | // CHECK-NEXT: 1 | vbase_offset (312) |
81 | // CHECK-NEXT: 2 | vbase_offset (184) |
82 | // CHECK-NEXT: 3 | vbase_offset (168) |
83 | // CHECK-NEXT: 4 | vbase_offset (120) |
84 | // CHECK-NEXT: 5 | vbase_offset (48) |
85 | // CHECK-NEXT: 6 | vbase_offset (148) |
86 | // CHECK-NEXT: 7 | vbase_offset (152) |
87 | // CHECK-NEXT: 8 | offset_to_top (0) |
88 | // CHECK-NEXT: 9 | Test1::C9 RTTI |
89 | // CHECK-NEXT: -- (Test1::C2, 0) vtable address -- |
90 | // CHECK-NEXT: -- (Test1::C9, 0) vtable address -- |
91 | // CHECK-NEXT: 10 | void Test1::C9::f() |
92 | // CHECK-NEXT: 11 | vbase_offset (104) |
93 | // CHECK-NEXT: 12 | vbase_offset (132) |
94 | // CHECK-NEXT: 13 | vbase_offset (136) |
95 | // CHECK-NEXT: 14 | offset_to_top (-16) |
96 | // CHECK-NEXT: 15 | Test1::C9 RTTI |
97 | // CHECK-NEXT: -- (Test1::C2, 16) vtable address -- |
98 | // CHECK-NEXT: -- (Test1::C4, 16) vtable address -- |
99 | // CHECK-NEXT: 16 | vbase_offset (72) |
100 | // CHECK-NEXT: 17 | vbase_offset (120) |
101 | // CHECK-NEXT: 18 | vbase_offset (100) |
102 | // CHECK-NEXT: 19 | vbase_offset (104) |
103 | // CHECK-NEXT: 20 | offset_to_top (-48) |
104 | // CHECK-NEXT: 21 | Test1::C9 RTTI |
105 | // CHECK-NEXT: -- (Test1::C2, 48) vtable address -- |
106 | // CHECK-NEXT: -- (Test1::C5, 48) vtable address -- |
107 | // CHECK-NEXT: -- (Test1::C6, 48) vtable address -- |
108 | // CHECK-NEXT: 22 | vbase_offset (84) |
109 | // CHECK-NEXT: 23 | offset_to_top (-64) |
110 | // CHECK-NEXT: 24 | Test1::C9 RTTI |
111 | // CHECK-NEXT: -- (Test1::C1, 64) vtable address -- |
112 | // CHECK-NEXT: 25 | vbase_offset (32) |
113 | // CHECK-NEXT: 26 | vbase_offset (60) |
114 | // CHECK-NEXT: 27 | vbase_offset (64) |
115 | // CHECK-NEXT: 28 | offset_to_top (-88) |
116 | // CHECK-NEXT: 29 | Test1::C9 RTTI |
117 | // CHECK-NEXT: -- (Test1::C2, 88) vtable address -- |
118 | // CHECK-NEXT: -- (Test1::C4, 88) vtable address -- |
119 | // CHECK-NEXT: 30 | vbase_offset (44) |
120 | // CHECK-NEXT: 31 | offset_to_top (-104) |
121 | // CHECK-NEXT: 32 | Test1::C9 RTTI |
122 | // CHECK-NEXT: -- (Test1::C1, 104) vtable address -- |
123 | // CHECK-NEXT: 33 | vbase_offset (28) |
124 | // CHECK-NEXT: 34 | vbase_offset (32) |
125 | // CHECK-NEXT: 35 | offset_to_top (-120) |
126 | // CHECK-NEXT: 36 | Test1::C9 RTTI |
127 | // CHECK-NEXT: -- (Test1::C2, 120) vtable address -- |
128 | // CHECK-NEXT: -- (Test1::C3, 120) vtable address -- |
129 | // CHECK-NEXT: 37 | vbase_offset (-4) |
130 | // CHECK-NEXT: 38 | offset_to_top (-152) |
131 | // CHECK-NEXT: 39 | Test1::C9 RTTI |
132 | // CHECK-NEXT: -- (Test1::C1, 152) vtable address -- |
133 | // CHECK-NEXT: 40 | vbase_offset (-48) |
134 | // CHECK-NEXT: 41 | vbase_offset (-20) |
135 | // CHECK-NEXT: 42 | vbase_offset (-16) |
136 | // CHECK-NEXT: 43 | offset_to_top (-168) |
137 | // CHECK-NEXT: 44 | Test1::C9 RTTI |
138 | // CHECK-NEXT: -- (Test1::C2, 168) vtable address -- |
139 | // CHECK-NEXT: -- (Test1::C4, 168) vtable address -- |
140 | // CHECK-NEXT: 45 | vbase_offset (160) |
141 | // CHECK-NEXT: 46 | vbase_offset (-136) |
142 | // CHECK-NEXT: 47 | vbase_offset (-16) |
143 | // CHECK-NEXT: 48 | vbase_offset (128) |
144 | // CHECK-NEXT: 49 | vbase_offset (-64) |
145 | // CHECK-NEXT: 50 | vbase_offset (-36) |
146 | // CHECK-NEXT: 51 | vbase_offset (-32) |
147 | // CHECK-NEXT: 52 | offset_to_top (-184) |
148 | // CHECK-NEXT: 53 | Test1::C9 RTTI |
149 | // CHECK-NEXT: -- (Test1::C2, 184) vtable address -- |
150 | // CHECK-NEXT: -- (Test1::C4, 184) vtable address -- |
151 | // CHECK-NEXT: -- (Test1::C7, 184) vtable address -- |
152 | // CHECK-NEXT: -- (Test1::C8, 184) vtable address -- |
153 | // CHECK-NEXT: 54 | vbase_offset (-88) |
154 | // CHECK-NEXT: 55 | vbase_offset (-40) |
155 | // CHECK-NEXT: 56 | vbase_offset (-60) |
156 | // CHECK-NEXT: 57 | vbase_offset (-56) |
157 | // CHECK-NEXT: 58 | offset_to_top (-208) |
158 | // CHECK-NEXT: 59 | Test1::C9 RTTI |
159 | // CHECK-NEXT: -- (Test1::C2, 208) vtable address -- |
160 | // CHECK-NEXT: -- (Test1::C5, 208) vtable address -- |
161 | // CHECK-NEXT: 60 | vbase_offset (-76) |
162 | // CHECK-NEXT: 61 | offset_to_top (-224) |
163 | // CHECK-NEXT: 62 | Test1::C9 RTTI |
164 | // CHECK-NEXT: -- (Test1::C1, 224) vtable address -- |
165 | // CHECK-NEXT: 63 | vbase_offset (-92) |
166 | // CHECK-NEXT: 64 | vbase_offset (-88) |
167 | // CHECK-NEXT: 65 | offset_to_top (-240) |
168 | // CHECK-NEXT: 66 | Test1::C9 RTTI |
169 | // CHECK-NEXT: -- (Test1::C2, 240) vtable address -- |
170 | // CHECK-NEXT: -- (Test1::C3, 240) vtable address -- |
171 | // CHECK-NEXT: 67 | vbase_offset (-124) |
172 | // CHECK-NEXT: 68 | offset_to_top (-272) |
173 | // CHECK-NEXT: 69 | Test1::C9 RTTI |
174 | // CHECK-NEXT: -- (Test1::C1, 272) vtable address -- |
175 | // CHECK-NEXT: 70 | vbase_offset (-140) |
176 | // CHECK-NEXT: 71 | vbase_offset (-136) |
177 | // CHECK-NEXT: 72 | offset_to_top (-288) |
178 | // CHECK-NEXT: 73 | Test1::C9 RTTI |
179 | // CHECK-NEXT: -- (Test1::C2, 288) vtable address -- |
180 | // CHECK-NEXT: 74 | vbase_offset (-192) |
181 | // CHECK-NEXT: 75 | vbase_offset (-144) |
182 | // CHECK-NEXT: 76 | vbase_offset (-164) |
183 | // CHECK-NEXT: 77 | vbase_offset (-160) |
184 | // CHECK-NEXT: 78 | offset_to_top (-312) |
185 | // CHECK-NEXT: 79 | Test1::C9 RTTI |
186 | // CHECK-NEXT: -- (Test1::C2, 312) vtable address -- |
187 | // CHECK-NEXT: -- (Test1::C5, 312) vtable address -- |
188 | // CHECK-NEXT: 80 | vbase_offset (-180) |
189 | // CHECK-NEXT: 81 | offset_to_top (-328) |
190 | // CHECK-NEXT: 82 | Test1::C9 RTTI |
191 | // CHECK-NEXT: -- (Test1::C1, 328) vtable address -- |
192 | // CHECK-NEXT: 83 | vbase_offset (-196) |
193 | // CHECK-NEXT: 84 | vbase_offset (-192) |
194 | // CHECK-NEXT: 85 | offset_to_top (-344) |
195 | // CHECK-NEXT: 86 | Test1::C9 RTTI |
196 | class C9 |
197 | : virtual public C6 |
198 | , public C2 |
199 | , public C4 |
200 | , virtual public C8 |
201 | { |
202 | int k0; |
203 | int k1; |
204 | int k2; |
205 | int k3; |
206 | virtual void f(); |
207 | }; |
208 | void C9::f() { } |
209 | |
210 | } |
211 | |