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