Anders Carlsson | 61814f6 | 2010-02-16 16:50:08 +0000 | [diff] [blame] | 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 | } |