1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm-only -fdump-vtable-layouts > %t 2>/dev/null 29984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-1 %s < %t 39984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-2 %s < %t 49984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-3 %s < %t 59984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-4 %s < %t 69984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-5 %s < %t 79984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-6 %s < %t 89984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-7 %s < %t 99984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-8 %s < %t 109984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-9 %s < %t 119984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-10 %s < %t 129984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-11 %s < %t 13be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson 14be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson/// Examples from the Itanium C++ ABI specification. 15be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson/// http://www.codesourcery.com/public/cxx-abi/ 16be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson 17be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlssonnamespace Test1 { 18be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson 19be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson// This is from http://www.codesourcery.com/public/cxx-abi/cxx-vtable-ex.html 20be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson 219984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1: Vtable for 'Test1::A' (5 entries). 229984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1-NEXT: 0 | offset_to_top (0) 239984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1-NEXT: 1 | Test1::A RTTI 249984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1-NEXT: -- (Test1::A, 0) vtable address -- 259984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1-NEXT: 2 | void Test1::A::f() 269984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1-NEXT: 3 | void Test1::A::g() 279984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1-NEXT: 4 | void Test1::A::h() 28be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlssonstruct A { 29be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson virtual void f (); 30be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson virtual void g (); 31be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson virtual void h (); 32be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson int ia; 33be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson}; 34be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlssonvoid A::f() {} 35eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson 369984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2: Vtable for 'Test1::B' (13 entries). 379984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 0 | vbase_offset (16) 389984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 1 | offset_to_top (0) 399984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 2 | Test1::B RTTI 409984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: -- (Test1::B, 0) vtable address -- 419984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 3 | void Test1::B::f() 429984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 4 | void Test1::B::h() 439984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 5 | vcall_offset (-16) 449984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 6 | vcall_offset (0) 459984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 7 | vcall_offset (-16) 469984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 8 | offset_to_top (-16) 479984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 9 | Test1::B RTTI 489984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: -- (Test1::A, 16) vtable address -- 499984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 10 | void Test1::B::f() 509984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset] 519984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 11 | void Test1::A::g() 529984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: 12 | void Test1::B::h() 539984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset] 54eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlssonstruct B: public virtual A { 55eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson void f (); 56eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson void h (); 57eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson int ib; 58eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson}; 59eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlssonvoid B::f() {} 6054d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson 619984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3: Vtable for 'Test1::C' (13 entries). 629984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 0 | vbase_offset (16) 639984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 1 | offset_to_top (0) 649984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 2 | Test1::C RTTI 659984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: -- (Test1::C, 0) vtable address -- 669984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 3 | void Test1::C::g() 679984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 4 | void Test1::C::h() 689984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 5 | vcall_offset (-16) 699984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 6 | vcall_offset (-16) 709984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 7 | vcall_offset (0) 719984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 8 | offset_to_top (-16) 729984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 9 | Test1::C RTTI 739984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: -- (Test1::A, 16) vtable address -- 749984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 10 | void Test1::A::f() 759984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 11 | void Test1::C::g() 769984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset] 779984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: 12 | void Test1::C::h() 789984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset] 7954d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlssonstruct C: public virtual A { 8054d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson void g (); 8154d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson void h (); 8254d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson int ic; 8354d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson}; 8454d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlssonvoid C::g() {} 858b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson 869984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4: Vtable for 'Test1::D' (18 entries). 879984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 0 | vbase_offset (32) 889984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 1 | offset_to_top (0) 899984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 2 | Test1::D RTTI 909984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: -- (Test1::B, 0) vtable address -- 919984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: -- (Test1::D, 0) vtable address -- 929984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 3 | void Test1::B::f() 939984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 4 | void Test1::D::h() 949984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 5 | vbase_offset (16) 959984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 6 | offset_to_top (-16) 969984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 7 | Test1::D RTTI 979984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: -- (Test1::C, 16) vtable address -- 989984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 8 | void Test1::C::g() 999984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 9 | void Test1::D::h() 1009984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: [this adjustment: -16 non-virtual] 1019984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 10 | vcall_offset (-32) 1029984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 11 | vcall_offset (-16) 1039984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 12 | vcall_offset (-32) 1049984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 13 | offset_to_top (-32) 1059984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 14 | Test1::D RTTI 1069984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: -- (Test1::A, 32) vtable address -- 1079984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 15 | void Test1::B::f() 1089984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset] 1099984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 16 | void Test1::C::g() 1109984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset] 1119984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: 17 | void Test1::D::h() 1129984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset] 1138b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlssonstruct D: public B, public C { 1148b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson void h (); 1158b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson int id; 1168b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson}; 1178b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlssonvoid D::h() { } 1188b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson 119f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlssonstruct X { 120f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson int ix; 121f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson virtual void x(); 122f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson}; 123f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson 1249984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5: Vtable for 'Test1::E' (24 entries). 1259984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 0 | vbase_offset (56) 1269984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 1 | offset_to_top (0) 1279984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 2 | Test1::E RTTI 1289984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: -- (Test1::E, 0) vtable address -- 1299984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: -- (Test1::X, 0) vtable address -- 1309984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 3 | void Test1::X::x() 1319984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 4 | void Test1::E::f() 1329984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 5 | void Test1::E::h() 1339984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 6 | vbase_offset (40) 1349984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 7 | offset_to_top (-16) 1359984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 8 | Test1::E RTTI 1369984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: -- (Test1::B, 16) vtable address -- 1379984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: -- (Test1::D, 16) vtable address -- 1389984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 9 | void Test1::E::f() 1399984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: [this adjustment: -16 non-virtual] 1409984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 10 | void Test1::E::h() 1419984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: [this adjustment: -16 non-virtual] 1429984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 11 | vbase_offset (24) 1439984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 12 | offset_to_top (-32) 1449984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 13 | Test1::E RTTI 1459984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: -- (Test1::C, 32) vtable address -- 1469984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 14 | void Test1::C::g() 1479984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 15 | void Test1::E::h() 1489984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: [this adjustment: -32 non-virtual] 1499984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 16 | vcall_offset (-56) 1509984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 17 | vcall_offset (-24) 1519984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 18 | vcall_offset (-56) 1529984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 19 | offset_to_top (-56) 1539984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 20 | Test1::E RTTI 1549984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: -- (Test1::A, 56) vtable address -- 1559984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 21 | void Test1::E::f() 1569984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset] 1579984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 22 | void Test1::C::g() 1589984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset] 1599984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: 23 | void Test1::E::h() 1609984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset] 161f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlssonstruct E : X, D { 162f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson int ie; 163f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson void f(); 164f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson void h (); 165f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson}; 166f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlssonvoid E::f() { } 167f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson 168be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson} 1695edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson 1705edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlssonnamespace Test2 { 1715edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson 1725edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson// From http://www.codesourcery.com/public/cxx-abi/abi.html#class-types. 1735edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson 1745edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlssonstruct A { virtual void f(); }; 1755edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlssonstruct B : virtual public A { int i; }; 1765edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlssonstruct C : virtual public A { int j; }; 1775edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson 1789984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6: Vtable for 'Test2::D' (11 entries). 1799984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: 0 | vbase_offset (0) 1809984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: 1 | vcall_offset (0) 1819984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: 2 | offset_to_top (0) 1829984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: 3 | Test2::D RTTI 1839984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: -- (Test2::A, 0) vtable address -- 1849984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: -- (Test2::B, 0) vtable address -- 1859984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: -- (Test2::D, 0) vtable address -- 1869984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: 4 | void Test2::A::f() 1879984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: 5 | void Test2::D::d() 1889984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: 6 | vbase_offset (-16) 1899984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: 7 | vcall_offset (-16) 1909984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: 8 | offset_to_top (-16) 1919984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: 9 | Test2::D RTTI 1929984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: -- (Test2::C, 16) vtable address -- 1939984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT: 10 | [unused] void Test2::A::f() 1945edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlssonstruct D : public B, public C { 1955edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson virtual void d(); 1965edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson}; 1975edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlssonvoid D::d() { } 1985edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson 1995edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson} 200db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson 201db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonnamespace Test3 { 202db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson 203db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson// From http://www.codesourcery.com/public/cxx-abi/abi-examples.html#vtable-ctor 204db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson 205db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonstruct V1 { 206db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson int v1; 207db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson virtual void f(); 208db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson}; 209db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson 210db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonstruct V2 : virtual V1 { 211db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson int v2; 212db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson virtual void f(); 213db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson}; 214db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson 2159984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7: Vtable for 'Test3::C' (14 entries). 2169984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 0 | vbase_offset (32) 2179984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 1 | vbase_offset (16) 2189984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 2 | offset_to_top (0) 2199984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 3 | Test3::C RTTI 2209984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: -- (Test3::C, 0) vtable address -- 2219984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 4 | void Test3::C::f() 2229984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 5 | vcall_offset (-16) 2239984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 6 | offset_to_top (-16) 2249984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 7 | Test3::C RTTI 2259984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: -- (Test3::V1, 16) vtable address -- 2269984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 8 | void Test3::C::f() 2279984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset] 2289984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 9 | vcall_offset (-32) 2299984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 10 | vbase_offset (-16) 2309984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 11 | offset_to_top (-32) 2319984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 12 | Test3::C RTTI 2329984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: -- (Test3::V2, 32) vtable address -- 2339984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: 13 | void Test3::C::f() 2349984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset] 235db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson 2369984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8: Construction vtable for ('Test3::V2', 32) in 'Test3::C' (9 entries). 2379984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT: 0 | vcall_offset (0) 2389984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT: 1 | vbase_offset (-16) 2399984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT: 2 | offset_to_top (0) 2409984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT: 3 | Test3::V2 RTTI 2419984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT: -- (Test3::V2, 32) vtable address -- 2429984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT: 4 | void Test3::V2::f() 2439984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT: 5 | vcall_offset (16) 2449984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT: 6 | offset_to_top (16) 2459984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT: 7 | Test3::V2 RTTI 2469984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT: -- (Test3::V1, 16) vtable address -- 2479984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT: 8 | void Test3::V2::f() 2489984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset] 249db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonstruct C : virtual V1, virtual V2 { 250db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson int c; 251db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson virtual void f(); 252db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson}; 253db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonvoid C::f() { } 254db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson 255db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonstruct B { 256db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson int b; 257db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson}; 258db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson 2599984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9: Vtable for 'Test3::D' (15 entries). 2609984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 0 | vbase_offset (40) 2619984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 1 | vbase_offset (24) 2629984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 2 | offset_to_top (0) 2639984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 3 | Test3::D RTTI 2649984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: -- (Test3::C, 0) vtable address -- 2659984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: -- (Test3::D, 0) vtable address -- 2669984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 4 | void Test3::C::f() 2679984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 5 | void Test3::D::g() 2689984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 6 | vcall_offset (-24) 2699984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 7 | offset_to_top (-24) 2709984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 8 | Test3::D RTTI 2719984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: -- (Test3::V1, 24) vtable address -- 2729984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 9 | void Test3::C::f() 2739984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset] 2749984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 10 | vcall_offset (-40) 2759984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 11 | vbase_offset (-16) 2769984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 12 | offset_to_top (-40) 2779984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 13 | Test3::D RTTI 2789984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: -- (Test3::V2, 40) vtable address -- 2799984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: 14 | void Test3::C::f() 2809984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset] 281db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson 2829984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10: Construction vtable for ('Test3::C', 0) in 'Test3::D' (14 entries). 2839984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 0 | vbase_offset (40) 2849984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 1 | vbase_offset (24) 2859984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 2 | offset_to_top (0) 2869984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 3 | Test3::C RTTI 2879984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: -- (Test3::C, 0) vtable address -- 2889984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 4 | void Test3::C::f() 2899984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 5 | vcall_offset (-24) 2909984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 6 | offset_to_top (-24) 2919984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 7 | Test3::C RTTI 2929984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: -- (Test3::V1, 24) vtable address -- 2939984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 8 | void Test3::C::f() 2949984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset] 2959984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 9 | vcall_offset (-40) 2969984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 10 | vbase_offset (-16) 2979984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 11 | offset_to_top (-40) 2989984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 12 | Test3::C RTTI 2999984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: -- (Test3::V2, 40) vtable address -- 3009984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: 13 | void Test3::C::f() 3019984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset] 302db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson 3039984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11: Construction vtable for ('Test3::V2', 40) in 'Test3::D' (9 entries). 3049984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT: 0 | vcall_offset (0) 3059984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT: 1 | vbase_offset (-16) 3069984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT: 2 | offset_to_top (0) 3079984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT: 3 | Test3::V2 RTTI 3089984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT: -- (Test3::V2, 40) vtable address -- 3099984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT: 4 | void Test3::V2::f() 3109984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT: 5 | vcall_offset (16) 3119984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT: 6 | offset_to_top (16) 3129984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT: 7 | Test3::V2 RTTI 3139984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT: -- (Test3::V1, 24) vtable address -- 3149984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT: 8 | void Test3::V2::f() 3159984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset] 316db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonstruct D : B, C { 317db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson int d; 318db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson virtual void g(); 319db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson}; 320db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonvoid D::g() { } 321db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson 322db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson} 323