diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:23:48 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:23:48 +0000 |
| commit | 06d4ba388873e6d1cfa9cd715a8935ecc8cd2097 (patch) | |
| tree | 3eb853da77d46cc77c4b017525a422f9ddb1385b /test/Layout | |
| parent | 30d791273d07fac9c0c1641a0731191bca6e8606 (diff) | |
Notes
Diffstat (limited to 'test/Layout')
| -rw-r--r-- | test/Layout/itanium-union-bitfield.cpp | 29 | ||||
| -rw-r--r-- | test/Layout/ms-x86-basic-layout.cpp | 32 | ||||
| -rw-r--r-- | test/Layout/ms-x86-empty-layout.c | 88 | ||||
| -rw-r--r-- | test/Layout/ms-x86-pack-and-align.cpp | 154 | ||||
| -rw-r--r-- | test/Layout/ms-x86-vtordisp.cpp | 26 |
5 files changed, 329 insertions, 0 deletions
diff --git a/test/Layout/itanium-union-bitfield.cpp b/test/Layout/itanium-union-bitfield.cpp new file mode 100644 index 000000000000..b06fd36071e9 --- /dev/null +++ b/test/Layout/itanium-union-bitfield.cpp @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -emit-llvm-only -triple %itanium_abi_triple -fdump-record-layouts %s 2>/dev/null \ +// RUN: | FileCheck %s + +union A { + int f1: 3; + A(); +}; + +A::A() {} + +union B { + char f1: 35; + B(); +}; + +B::B() {} + +// CHECK:*** Dumping AST Record Layout +// CHECK-NEXT: 0 | union A +// CHECK-NEXT: 0 | int f1 +// CHECK-NEXT: | [sizeof=4, dsize=1, align=4 +// CHECK-NEXT: | nvsize=1, nvalign=4] + +// CHECK:*** Dumping AST Record Layout +// CHECK-NEXT: 0 | union B +// CHECK-NEXT: 0 | char f1 +// CHECK-NEXT: | [sizeof=8, dsize=5, align=4 +// CHECK-NEXT: | nvsize=5, nvalign=4] + diff --git a/test/Layout/ms-x86-basic-layout.cpp b/test/Layout/ms-x86-basic-layout.cpp index b6ffeee7114a..aac7aed06019 100644 --- a/test/Layout/ms-x86-basic-layout.cpp +++ b/test/Layout/ms-x86-basic-layout.cpp @@ -816,6 +816,36 @@ struct RecordArrayTypedef { // CHECK-X64-NEXT: | [sizeof=16, align=4 // CHECK-X64-NEXT: | nvsize=16, nvalign=4] +struct EmptyIntMemb { + int FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct EmptyIntMemb +// CHECK-NEXT: 0 | int [0] FlexArrayMemb +// CHECK-NEXT: | [sizeof=1, align=4 +// CHECK-NEXT: | nvsize=0, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct EmptyIntMemb +// CHECK-X64-NEXT: 0 | int [0] FlexArrayMemb +// CHECK-X64-NEXT: | [sizeof=4, align=4 +// CHECK-X64-NEXT: | nvsize=0, nvalign=4] + +struct EmptyLongLongMemb { + long long FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct EmptyLongLongMemb +// CHECK-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-NEXT: | [sizeof=1, align=8 +// CHECK-NEXT: | nvsize=0, nvalign=8] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct EmptyLongLongMemb +// CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-X64-NEXT: | [sizeof=8, align=8 +// CHECK-X64-NEXT: | nvsize=0, nvalign=8] + int a[ sizeof(TestF0)+ sizeof(TestF1)+ @@ -840,4 +870,6 @@ sizeof(F6)+ sizeof(ArrayFieldOfRecords)+ sizeof(ArrayOfArrayFieldOfRecords)+ sizeof(RecordArrayTypedef)+ +sizeof(EmptyIntMemb)+ +sizeof(EmptyLongLongMemb)+ 0]; diff --git a/test/Layout/ms-x86-empty-layout.c b/test/Layout/ms-x86-empty-layout.c new file mode 100644 index 000000000000..faca0be0a9c0 --- /dev/null +++ b/test/Layout/ms-x86-empty-layout.c @@ -0,0 +1,88 @@ +// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>/dev/null \ +// RUN: | FileCheck %s +// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>/dev/null \ +// RUN: | FileCheck %s + +struct EmptyIntMemb { + int FlexArrayMemb[0]; +}; +// CHECK: *** Dumping AST Record Layout +// CHECK: Type: struct EmptyIntMemb +// CHECK: Record: +// CHECK: Layout: <ASTRecordLayout +// CHECK: Size:32 +// CHECK: Alignment:32 +// CHECK: FieldOffsets: [0]> + +struct EmptyLongLongMemb { + long long FlexArrayMemb[0]; +}; +// CHECK: *** Dumping AST Record Layout +// CHECK: Type: struct EmptyLongLongMemb +// CHECK: Record: +// CHECK: Layout: <ASTRecordLayout +// CHECK: Size:32 +// CHECK: Alignment:64 +// CHECK: FieldOffsets: [0]> + +struct EmptyAligned2LongLongMemb { + long long __declspec(align(2)) FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK: Type: struct EmptyAligned2LongLongMemb +// CHECK: Record: +// CHECK: Layout: <ASTRecordLayout +// CHECK: Size:32 +// CHECK: Alignment:64 +// CHECK: FieldOffsets: [0]> + +struct EmptyAligned8LongLongMemb { + long long __declspec(align(8)) FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK: Type: struct EmptyAligned8LongLongMemb +// CHECK: Record: +// CHECK: Layout: <ASTRecordLayout +// CHECK: Size:64 +// CHECK: Alignment:64 +// CHECK: FieldOffsets: [0]> + +#pragma pack(1) +struct __declspec(align(4)) EmptyPackedAligned4LongLongMemb { + long long FlexArrayMemb[0]; +}; +#pragma pack() + +// CHECK: *** Dumping AST Record Layout +// CHECK: Type: struct EmptyPackedAligned4LongLongMemb +// CHECK: Record: +// CHECK: Layout: <ASTRecordLayout +// CHECK: Size:32 +// CHECK: Alignment:32 +// CHECK: FieldOffsets: [0]> + +#pragma pack(1) +struct EmptyPackedAligned8LongLongMemb { + long long __declspec(align(8)) FlexArrayMemb[0]; +}; +#pragma pack() + +// CHECK: *** Dumping AST Record Layout +// CHECK: Type: struct EmptyPackedAligned8LongLongMemb +// CHECK: Record: +// CHECK: Layout: <ASTRecordLayout +// CHECK: Size:64 +// CHECK: Alignment:64 +// CHECK: FieldOffsets: [0]> + + +int a[ +sizeof(struct EmptyIntMemb)+ +sizeof(struct EmptyLongLongMemb)+ +sizeof(struct EmptyAligned2LongLongMemb)+ +sizeof(struct EmptyAligned8LongLongMemb)+ +sizeof(struct EmptyPackedAligned4LongLongMemb)+ +sizeof(struct EmptyPackedAligned8LongLongMemb)+ +0]; diff --git a/test/Layout/ms-x86-pack-and-align.cpp b/test/Layout/ms-x86-pack-and-align.cpp index 5e1aae1ca757..9783233d66ac 100644 --- a/test/Layout/ms-x86-pack-and-align.cpp +++ b/test/Layout/ms-x86-pack-and-align.cpp @@ -652,7 +652,154 @@ struct OD : OC {}; // CHECK-X64-NEXT: | [sizeof=12, align=1 // CHECK-X64-NEXT: | nvsize=8, nvalign=1] +struct __declspec(align(4)) PA { + int c; +}; + +typedef __declspec(align(8)) PA PB; +#pragma pack(push, 1) +struct PC { + char a; + PB x; +}; +#pragma pack(pop) + +// CHECK: *** Dumping AST Record Layout +// CHECK: 0 | struct PC +// CHECK-NEXT: 0 | char a +// CHECK-NEXT: 8 | struct PA x +// CHECK-NEXT: 8 | int c +// CHECK-NEXT: | [sizeof=4, align=4 +// CHECK-NEXT: | nvsize=4, nvalign=4] +// CHECK-NEXT: | [sizeof=16, align=8 +// CHECK-NEXT: | nvsize=12, nvalign=8] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64: 0 | struct PC +// CHECK-X64-NEXT: 0 | char a +// CHECK-X64-NEXT: 8 | struct PA x +// CHECK-X64-NEXT: 8 | int c +// CHECK-X64-NEXT: | [sizeof=4, align=4 +// CHECK-X64-NEXT: | nvsize=4, nvalign=4] +// CHECK-X64-NEXT: | [sizeof=16, align=8 +// CHECK-X64-NEXT: | nvsize=12, nvalign=8] + +typedef PB PD; + +#pragma pack(push, 1) +struct PE { + char a; + PD x; +}; +#pragma pack(pop) + +// CHECK: *** Dumping AST Record Layout +// CHECK: 0 | struct PE +// CHECK-NEXT: 0 | char a +// CHECK-NEXT: 8 | struct PA x +// CHECK-NEXT: 8 | int c +// CHECK-NEXT: | [sizeof=4, align=4 +// CHECK-NEXT: | nvsize=4, nvalign=4] +// CHECK-NEXT: | [sizeof=16, align=8 +// CHECK-NEXT: | nvsize=12, nvalign=8] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64: 0 | struct PE +// CHECK-X64-NEXT: 0 | char a +// CHECK-X64-NEXT: 8 | struct PA x +// CHECK-X64-NEXT: 8 | int c +// CHECK-X64-NEXT: | [sizeof=4, align=4 +// CHECK-X64-NEXT: | nvsize=4, nvalign=4] +// CHECK-X64-NEXT: | [sizeof=16, align=8 +// CHECK-X64-NEXT: | nvsize=12, nvalign=8] + +typedef int __declspec(align(2)) QA; +#pragma pack(push, 1) +struct QB { + char a; + QA b; +}; +#pragma pack(pop) + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct QB +// CHECK-NEXT: 0 | char a +// CHECK-NEXT: 2 | QA b +// CHECK-NEXT: | [sizeof=6, align=2 +// CHECK-NEXT: | nvsize=6, nvalign=2] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct QB +// CHECK-X64-NEXT: 0 | char a +// CHECK-X64-NEXT: 2 | QA b +// CHECK-X64-NEXT: | [sizeof=6, align=2 +// CHECK-X64-NEXT: | nvsize=6, nvalign=2] + +struct QC { + char a; + QA b; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct QC +// CHECK-NEXT: 0 | char a +// CHECK-NEXT: 4 | QA b +// CHECK-NEXT: | [sizeof=8, align=4 +// CHECK-NEXT: | nvsize=8, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct QC +// CHECK-X64-NEXT: 0 | char a +// CHECK-X64-NEXT: 4 | QA b +// CHECK-X64-NEXT: | [sizeof=8, align=4 +// CHECK-X64-NEXT: | nvsize=8, nvalign=4] + +struct QD { + char a; + QA b : 3; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct QD +// CHECK-NEXT: 0 | char a +// CHECK-NEXT: 4 | QA b +// CHECK-NEXT: | [sizeof=8, align=4 +// CHECK-NEXT: | nvsize=8, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct QD +// CHECK-X64-NEXT: 0 | char a +// CHECK-X64-NEXT: 4 | QA b +// CHECK-X64-NEXT: | [sizeof=8, align=4 +// CHECK-X64-NEXT: | nvsize=8, nvalign=4] + +struct __declspec(align(4)) EmptyAlignedLongLongMemb { + long long FlexArrayMemb[0]; +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct EmptyAlignedLongLongMemb +// CHECK-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-NEXT: | [sizeof=8, align=8 +// CHECK-NEXT: | nvsize=0, nvalign=8] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct EmptyAlignedLongLongMemb +// CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-X64-NEXT: | [sizeof=8, align=8 +// CHECK-X64-NEXT: | nvsize=0, nvalign=8] + +#pragma pack(1) +struct __declspec(align(4)) EmptyPackedAlignedLongLongMemb { + long long FlexArrayMemb[0]; +}; +#pragma pack() + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct EmptyPackedAlignedLongLongMemb +// CHECK-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-NEXT: | [sizeof=4, align=4 +// CHECK-NEXT: | nvsize=0, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct EmptyPackedAlignedLongLongMemb +// CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb +// CHECK-X64-NEXT: | [sizeof=4, align=4 +// CHECK-X64-NEXT: | nvsize=0, nvalign=4] int a[ sizeof(X)+ @@ -680,4 +827,11 @@ sizeof(RC)+ sizeof(RE)+ sizeof(ND)+ sizeof(OD)+ +sizeof(PC)+ +sizeof(PE)+ +sizeof(QB)+ +sizeof(QC)+ +sizeof(QD)+ +sizeof(EmptyAlignedLongLongMemb)+ +sizeof(EmptyPackedAlignedLongLongMemb)+ 0]; diff --git a/test/Layout/ms-x86-vtordisp.cpp b/test/Layout/ms-x86-vtordisp.cpp index 60779fb1975b..1b78d9fe8435 100644 --- a/test/Layout/ms-x86-vtordisp.cpp +++ b/test/Layout/ms-x86-vtordisp.cpp @@ -416,6 +416,31 @@ struct HC : virtual HB {}; // CHECK-X64-NEXT: | [sizeof=32, align=8 // CHECK-X64-NEXT: | nvsize=8, nvalign=8] +struct IA { + virtual void f(); +}; +struct __declspec(dllexport) IB : virtual IA { + virtual void f() = 0; + IB() {} +}; + +// CHECK: *** Dumping AST Record Layout +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct IB +// CHECK-NEXT: 0 | (IB vbtable pointer) +// CHECK-NEXT: 4 | struct IA (virtual base) +// CHECK-NEXT: 4 | (IA vftable pointer) +// CHECK-NEXT: | [sizeof=8, align=4 +// CHECK-NEXT: | nvsize=4, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct IB +// CHECK-X64-NEXT: 0 | (IB vbtable pointer) +// CHECK-X64-NEXT: 8 | struct IA (virtual base) +// CHECK-X64-NEXT: 8 | (IA vftable pointer) +// CHECK-X64-NEXT: | [sizeof=16, align=8 +// CHECK-X64-NEXT: | nvsize=8, nvalign=8] + int a[ sizeof(A)+ sizeof(C)+ @@ -428,4 +453,5 @@ sizeof(pragma_test3::C)+ sizeof(pragma_test4::C)+ sizeof(GD)+ sizeof(HC)+ +sizeof(IB)+ 0]; |
