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