diff options
author | Warren Hunt <whunt@google.com> | 2014-01-09 00:30:56 +0000 |
---|---|---|
committer | Warren Hunt <whunt@google.com> | 2014-01-09 00:30:56 +0000 |
commit | d640d7d96e93f138e1aa844d91c868485a6b113d (patch) | |
tree | dd1de46e0a7bfeddd1ba5f7c045a817e986d1b2d /clang/test/Layout/ms-x86-empty-nonvirtual-bases.cpp | |
parent | d2d23ed04a08eb04ef2d6d0a89284f1f510e9d96 (diff) | |
download | bcm5719-llvm-d640d7d96e93f138e1aa844d91c868485a6b113d.tar.gz bcm5719-llvm-d640d7d96e93f138e1aa844d91c868485a6b113d.zip |
[ms-abi] Refactor Microsoft Record Layout
This patch refactors microsoft record layout to be more "natural". The
most dominant change is that vbptrs and vfptrs are injected after the
fact. This simplifies the implementation and the math for the offest
for the first base/field after the vbptr.
llvm-svn: 198818
Diffstat (limited to 'clang/test/Layout/ms-x86-empty-nonvirtual-bases.cpp')
-rw-r--r-- | clang/test/Layout/ms-x86-empty-nonvirtual-bases.cpp | 176 |
1 files changed, 92 insertions, 84 deletions
diff --git a/clang/test/Layout/ms-x86-empty-nonvirtual-bases.cpp b/clang/test/Layout/ms-x86-empty-nonvirtual-bases.cpp index 01d10c9994f..dd1cbe739bd 100644 --- a/clang/test/Layout/ms-x86-empty-nonvirtual-bases.cpp +++ b/clang/test/Layout/ms-x86-empty-nonvirtual-bases.cpp @@ -23,11 +23,12 @@ struct A : B0 { }; // CHECK: *** Dumping AST Record Layout -// CHECK: 0 | struct A -// CHECK: 0 | struct B0 (base) (empty) -// CHECK: 0 | int a -// CHECK: | [sizeof=8, align=8 -// CHECK: | nvsize=8, nvalign=8] +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct A +// CHECK-NEXT: 0 | struct B0 (base) (empty) +// CHECK-NEXT: 0 | int a +// CHECK-NEXT: | [sizeof=8, align=8 +// CHECK-NEXT: | nvsize=8, nvalign=8] struct B : B0 { B0 b0; @@ -36,14 +37,14 @@ struct B : B0 { }; // CHECK: *** Dumping AST Record Layout -// CHECK: 0 | struct B -// CHECK: 0 | struct B0 (base) (empty) -// CHECK: 0 | struct B0 b0 (empty) -// CHECK: | [sizeof=8, align=8 -// CHECK: | nvsize=0, nvalign=1] -// CHECK: 8 | int a -// CHECK: | [sizeof=16, align=8 -// CHECK: | nvsize=16, nvalign=8] +// CHECK-NEXT: 0 | struct B +// CHECK-NEXT: 0 | struct B0 (base) (empty) +// CHECK-NEXT: 0 | struct B0 b0 (empty) +// CHECK-NEXT: | [sizeof=8, align=8 +// CHECK-NEXT: | nvsize=0, nvalign=8] +// CHECK: 8 | int a +// CHECK-NEXT: | [sizeof=16, align=8 +// CHECK-NEXT: | nvsize=16, nvalign=8] struct C : B0, B1, B2, B3, B4 { int a; @@ -51,15 +52,19 @@ struct C : B0, B1, B2, B3, B4 { }; // CHECK: *** Dumping AST Record Layout -// CHECK: 0 | struct C -// CHECK: 0 | struct B0 (base) (empty) -// CHECK: 8 | struct B1 (base) (empty) -// CHECK: 16 | struct B2 (base) (empty) -// CHECK: 24 | struct B3 (base) (empty) -// CHECK: 32 | struct B4 (base) (empty) -// CHECK: 32 | int a -// CHECK: | [sizeof=40, align=8 -// CHECK: | nvsize=40, nvalign=8] +// CHECK: *** Dumping AST Record Layout +// CHECK: *** Dumping AST Record Layout +// CHECK: *** Dumping AST Record Layout +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct C +// CHECK-NEXT: 0 | struct B0 (base) (empty) +// CHECK-NEXT: 8 | struct B1 (base) (empty) +// CHECK-NEXT: 16 | struct B2 (base) (empty) +// CHECK-NEXT: 24 | struct B3 (base) (empty) +// CHECK-NEXT: 32 | struct B4 (base) (empty) +// CHECK-NEXT: 32 | int a +// CHECK-NEXT: | [sizeof=40, align=8 +// CHECK-NEXT: | nvsize=40, nvalign=8] struct D { B0 b0; @@ -72,28 +77,31 @@ struct D { }; // CHECK: *** Dumping AST Record Layout -// CHECK: 0 | struct D -// CHECK: 0 | struct B0 b0 (empty) -// CHECK: | [sizeof=8, align=8 -// CHECK: | nvsize=0, nvalign=1] -// CHECK: 8 | struct C0 c0 -// CHECK: 8 | int a -// CHECK: | [sizeof=4, align=4 -// CHECK: | nvsize=4, nvalign=4] -// CHECK: 12 | struct C1 c1 -// CHECK: 12 | int a -// CHECK: | [sizeof=4, align=4 -// CHECK: | nvsize=4, nvalign=4] -// CHECK: 16 | struct C2 c2 -// CHECK: 16 | int a -// CHECK: | [sizeof=4, align=4 -// CHECK: | nvsize=4, nvalign=4] -// CHECK: 24 | struct B1 b1 (empty) -// CHECK: | [sizeof=8, align=8 -// CHECK: | nvsize=0, nvalign=1] -// CHECK: 32 | int a -// CHECK: | [sizeof=40, align=8 -// CHECK: | nvsize=40, nvalign=8] +// CHECK: *** Dumping AST Record Layout +// CHECK: *** Dumping AST Record Layout +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct D +// CHECK-NEXT: 0 | struct B0 b0 (empty) +// CHECK-NEXT: | [sizeof=8, align=8 +// CHECK-NEXT: | nvsize=0, nvalign=8] +// CHECK: 8 | struct C0 c0 +// CHECK-NEXT: 8 | int a +// CHECK-NEXT: | [sizeof=4, align=4 +// CHECK-NEXT: | nvsize=4, nvalign=4] +// CHECK: 12 | struct C1 c1 +// CHECK-NEXT: 12 | int a +// CHECK-NEXT: | [sizeof=4, align=4 +// CHECK-NEXT: | nvsize=4, nvalign=4] +// CHECK: 16 | struct C2 c2 +// CHECK-NEXT: 16 | int a +// CHECK-NEXT: | [sizeof=4, align=4 +// CHECK-NEXT: | nvsize=4, nvalign=4] +// CHECK: 24 | struct B1 b1 (empty) +// CHECK-NEXT: | [sizeof=8, align=8 +// CHECK-NEXT: | nvsize=0, nvalign=8] +// CHECK: 32 | int a +// CHECK-NEXT: | [sizeof=40, align=8 +// CHECK-NEXT: | nvsize=40, nvalign=8] struct E : B0, C0, C1, C2, B1 { int a; @@ -101,18 +109,18 @@ struct E : B0, C0, C1, C2, B1 { }; // CHECK: *** Dumping AST Record Layout -// CHECK: 0 | struct E -// CHECK: 0 | struct B0 (base) (empty) -// CHECK: 0 | struct C0 (base) -// CHECK: 0 | int a -// CHECK: 4 | struct C1 (base) -// CHECK: 4 | int a -// CHECK: 8 | struct C2 (base) -// CHECK: 8 | int a -// CHECK: 16 | struct B1 (base) (empty) -// CHECK: 16 | int a -// CHECK: | [sizeof=24, align=8 -// CHECK: | nvsize=24, nvalign=8] +// CHECK-NEXT: 0 | struct E +// CHECK-NEXT: 0 | struct B0 (base) (empty) +// CHECK-NEXT: 0 | struct C0 (base) +// CHECK-NEXT: 0 | int a +// CHECK-NEXT: 4 | struct C1 (base) +// CHECK-NEXT: 4 | int a +// CHECK-NEXT: 8 | struct C2 (base) +// CHECK-NEXT: 8 | int a +// CHECK-NEXT: 16 | struct B1 (base) (empty) +// CHECK-NEXT: 16 | int a +// CHECK-NEXT: | [sizeof=24, align=8 +// CHECK-NEXT: | nvsize=24, nvalign=8] struct F : C0, B0, B1, C1 { int a; @@ -120,16 +128,16 @@ struct F : C0, B0, B1, C1 { }; // CHECK: *** Dumping AST Record Layout -// CHECK: 0 | struct F -// CHECK: 0 | struct C0 (base) -// CHECK: 0 | int a -// CHECK: 8 | struct B0 (base) (empty) -// CHECK: 16 | struct B1 (base) (empty) -// CHECK: 16 | struct C1 (base) -// CHECK: 16 | int a -// CHECK: 20 | int a -// CHECK: | [sizeof=24, align=8 -// CHECK: | nvsize=24, nvalign=8] +// CHECK-NEXT: 0 | struct F +// CHECK-NEXT: 0 | struct C0 (base) +// CHECK-NEXT: 0 | int a +// CHECK-NEXT: 8 | struct B0 (base) (empty) +// CHECK-NEXT: 16 | struct B1 (base) (empty) +// CHECK-NEXT: 16 | struct C1 (base) +// CHECK-NEXT: 16 | int a +// CHECK-NEXT: 20 | int a +// CHECK-NEXT: | [sizeof=24, align=8 +// CHECK-NEXT: | nvsize=24, nvalign=8] struct G : B0, B1, B2, B3, B4 { __declspec(align(32)) int a; @@ -137,15 +145,15 @@ struct G : B0, B1, B2, B3, B4 { }; // CHECK: *** Dumping AST Record Layout -// CHECK: 0 | struct G -// CHECK: 0 | struct B0 (base) (empty) -// CHECK: 8 | struct B1 (base) (empty) -// CHECK: 16 | struct B2 (base) (empty) -// CHECK: 24 | struct B3 (base) (empty) -// CHECK: 32 | struct B4 (base) (empty) -// CHECK: 32 | int a -// CHECK: | [sizeof=64, align=32 -// CHECK: | nvsize=64, nvalign=32] +// CHECK-NEXT: 0 | struct G +// CHECK-NEXT: 0 | struct B0 (base) (empty) +// CHECK-NEXT: 8 | struct B1 (base) (empty) +// CHECK-NEXT: 16 | struct B2 (base) (empty) +// CHECK-NEXT: 24 | struct B3 (base) (empty) +// CHECK-NEXT: 32 | struct B4 (base) (empty) +// CHECK-NEXT: 32 | int a +// CHECK-NEXT: | [sizeof=64, align=32 +// CHECK-NEXT: | nvsize=64, nvalign=32] struct __declspec(align(32)) H : B0, B1, B2, B3, B4 { int a; @@ -153,15 +161,15 @@ struct __declspec(align(32)) H : B0, B1, B2, B3, B4 { }; // CHECK: *** Dumping AST Record Layout -// CHECK: 0 | struct H -// CHECK: 0 | struct B0 (base) (empty) -// CHECK: 8 | struct B1 (base) (empty) -// CHECK: 16 | struct B2 (base) (empty) -// CHECK: 24 | struct B3 (base) (empty) -// CHECK: 32 | struct B4 (base) (empty) -// CHECK: 32 | int a -// CHECK: | [sizeof=64, align=32 -// CHECK: | nvsize=40, nvalign=8] +// CHECK-NEXT: 0 | struct H +// CHECK-NEXT: 0 | struct B0 (base) (empty) +// CHECK-NEXT: 8 | struct B1 (base) (empty) +// CHECK-NEXT: 16 | struct B2 (base) (empty) +// CHECK-NEXT: 24 | struct B3 (base) (empty) +// CHECK-NEXT: 32 | struct B4 (base) (empty) +// CHECK-NEXT: 32 | int a +// CHECK-NEXT: | [sizeof=64, align=32 +// CHECK-NEXT: | nvsize=40, nvalign=32] int a[ sizeof(A)+ |