vtable-layout-abi-examples.cpp revision eb577d0df44df4df974e9b3a538575d92358a3b3
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() {} 49be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson 50be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson} 51