vtable-layout-abi-examples.cpp revision f2349fc7e2b3e920a19adaf3519b278ac38d228b
1be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm-only -fdump-vtable-layouts 2>&1 | FileCheck %s 2be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson 3be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson/// Examples from the Itanium C++ ABI specification. 4be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson/// http://www.codesourcery.com/public/cxx-abi/ 5be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson 6be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlssonnamespace Test1 { 7be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson 8be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson// This is from http://www.codesourcery.com/public/cxx-abi/cxx-vtable-ex.html 9be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson 10be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson// CHECK: Vtable for 'Test1::A' (5 entries). 11be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson// CHECK-NEXT: 0 | offset_to_top (0) 12be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson// CHECK-NEXT: 1 | Test1::A RTTI 13be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson// CHECK-NEXT: -- (Test1::A, 0) vtable address -- 14be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson// CHECK-NEXT: 2 | void Test1::A::f() 15be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson// CHECK-NEXT: 3 | void Test1::A::g() 16be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson// CHECK-NEXT: 4 | void Test1::A::h() 17be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlssonstruct A { 18be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson virtual void f (); 19be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson virtual void g (); 20be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson virtual void h (); 21be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson int ia; 22be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson}; 23be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlssonvoid A::f() {} 24eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson 25eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK: Vtable for 'Test1::B' (13 entries). 26eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 0 | vbase_offset (16) 27eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 1 | offset_to_top (0) 28eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 2 | Test1::B RTTI 29eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: -- (Test1::B, 0) vtable address -- 30eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 3 | void Test1::B::f() 31eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 4 | void Test1::B::h() 32eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 5 | vcall_offset (-16) 33eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 6 | vcall_offset (0) 34eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 7 | vcall_offset (-16) 35eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 8 | offset_to_top (-16) 36eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 9 | Test1::B RTTI 37eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: -- (Test1::A, 16) vtable address -- 38eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 10 | void Test1::B::f() 39eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset] 40eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 11 | void Test1::A::g() 41eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: 12 | void Test1::B::h() 42eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson// CHECK-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset] 43eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlssonstruct B: public virtual A { 44eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson void f (); 45eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson void h (); 46eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson int ib; 47eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson}; 48eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlssonvoid B::f() {} 4954d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson 5054d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK: Vtable for 'Test1::C' (13 entries). 5154d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 0 | vbase_offset (16) 5254d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 1 | offset_to_top (0) 5354d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 2 | Test1::C RTTI 5454d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: -- (Test1::C, 0) vtable address -- 5554d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 3 | void Test1::C::g() 5654d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 4 | void Test1::C::h() 5754d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 5 | vcall_offset (-16) 5854d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 6 | vcall_offset (-16) 5954d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 7 | vcall_offset (0) 6054d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 8 | offset_to_top (-16) 6154d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 9 | Test1::C RTTI 6254d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: -- (Test1::A, 16) vtable address -- 6354d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 10 | void Test1::A::f() 6454d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 11 | void Test1::C::g() 6554d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset] 6654d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: 12 | void Test1::C::h() 6754d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson// CHECK-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset] 6854d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlssonstruct C: public virtual A { 6954d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson void g (); 7054d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson void h (); 7154d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson int ic; 7254d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson}; 7354d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlssonvoid C::g() {} 748b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson 758b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK: Vtable for 'Test1::D' (18 entries). 768b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 0 | vbase_offset (32) 778b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 1 | offset_to_top (0) 788b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 2 | Test1::D RTTI 798b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: -- (Test1::B, 0) vtable address -- 808b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: -- (Test1::D, 0) vtable address -- 818b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 3 | void Test1::B::f() 828b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 4 | void Test1::D::h() 838b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 5 | vbase_offset (16) 848b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 6 | offset_to_top (-16) 858b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 7 | Test1::D RTTI 868b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: -- (Test1::C, 16) vtable address -- 878b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 8 | void Test1::C::g() 888b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 9 | void Test1::D::h() 898b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: [this adjustment: -16 non-virtual] 908b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 10 | vcall_offset (-32) 918b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 11 | vcall_offset (-16) 928b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 12 | vcall_offset (-32) 938b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 13 | offset_to_top (-32) 948b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 14 | Test1::D RTTI 958b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: -- (Test1::A, 32) vtable address -- 968b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 15 | void Test1::B::f() 978b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset] 988b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 16 | void Test1::C::g() 998b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset] 1008b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: 17 | void Test1::D::h() 1018b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson// CHECK-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset] 1028b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlssonstruct D: public B, public C { 1038b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson void h (); 1048b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson int id; 1058b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson}; 1068b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlssonvoid D::h() { } 1078b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson 108f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlssonstruct X { 109f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson int ix; 110f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson virtual void x(); 111f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson}; 112f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson 113f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK: Vtable for 'Test1::E' (24 entries). 114f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 0 | vbase_offset (56) 115f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 1 | offset_to_top (0) 116f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 2 | Test1::E RTTI 117f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: -- (Test1::E, 0) vtable address -- 118f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: -- (Test1::X, 0) vtable address -- 119f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 3 | void Test1::X::x() 120f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 4 | void Test1::E::f() 121f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 5 | void Test1::E::h() 122f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 6 | vbase_offset (40) 123f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 7 | offset_to_top (-16) 124f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 8 | Test1::E RTTI 125f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: -- (Test1::B, 16) vtable address -- 126f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: -- (Test1::D, 16) vtable address -- 127f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 9 | void Test1::E::f() 128f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: [this adjustment: -16 non-virtual] 129f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 10 | void Test1::E::h() 130f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: [this adjustment: -16 non-virtual] 131f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 11 | vbase_offset (24) 132f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 12 | offset_to_top (-32) 133f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 13 | Test1::E RTTI 134f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: -- (Test1::C, 32) vtable address -- 135f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 14 | void Test1::C::g() 136f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 15 | void Test1::E::h() 137f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: [this adjustment: -32 non-virtual] 138f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 16 | vcall_offset (-56) 139f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 17 | vcall_offset (-24) 140f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 18 | vcall_offset (-56) 141f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 19 | offset_to_top (-56) 142f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 20 | Test1::E RTTI 143f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: -- (Test1::A, 56) vtable address -- 144f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 21 | void Test1::E::f() 145f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: [this adjustment: 0 non-virtual, -24 vcall offset offset] 146f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 22 | void Test1::C::g() 147f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: [this adjustment: 0 non-virtual, -32 vcall offset offset] 148f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: 23 | void Test1::E::h() 149f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson// CHECK-NEXT: [this adjustment: 0 non-virtual, -40 vcall offset offset] 150f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlssonstruct E : X, D { 151f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson int ie; 152f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson void f(); 153f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson void h (); 154f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson}; 155f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlssonvoid E::f() { } 156f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson 157be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson} 158