forked from OSchip/llvm-project
269 lines
7.4 KiB
C
269 lines
7.4 KiB
C
// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \
|
|
// RUN: -fsyntax-only -fxl-pragma-pack -x c %s | \
|
|
// RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s
|
|
// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \
|
|
// RUN: -fsyntax-only -fxl-pragma-pack -x c++ %s | \
|
|
// RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s
|
|
|
|
// RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \
|
|
// RUN: -fsyntax-only -fxl-pragma-pack -x c %s | \
|
|
// RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s
|
|
// RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \
|
|
// RUN: -fsyntax-only -fxl-pragma-pack -x c++ %s | \
|
|
// RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s
|
|
|
|
struct A {
|
|
unsigned char c : 2;
|
|
} A;
|
|
|
|
int a = sizeof(A);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct A
|
|
// CHECK-NEXT: 0:0-1 | unsigned char c
|
|
// CHECK-NEXT: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4
|
|
|
|
struct B {
|
|
char c;
|
|
int : 0;
|
|
} B;
|
|
|
|
int b = sizeof(B);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct B
|
|
// CHECK-NEXT: 0 | char c
|
|
// CHECK-NEXT: 4:- | int
|
|
// CHECK-NEXT: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4
|
|
|
|
struct C {
|
|
signed int a1 : 6;
|
|
signed char a2 : 4;
|
|
short int a3 : 2;
|
|
int a4 : 2;
|
|
signed long a5 : 5;
|
|
long long int a6 : 6;
|
|
unsigned long a7 : 8;
|
|
} C;
|
|
|
|
int c = sizeof(C);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct C
|
|
// CHECK-NEXT: 0:0-5 | int a1
|
|
// CHECK-NEXT: 0:6-9 | signed char a2
|
|
// CHECK-NEXT: 1:2-3 | short a3
|
|
// CHECK-NEXT: 1:4-5 | int a4
|
|
// CHECK-NEXT: 1:6-10 | long a5
|
|
// CHECK-NEXT: 2:3-8 | long long a6
|
|
// CHECK32: 4:0-7 | unsigned long a7
|
|
// CHECK32: sizeof=8, {{(dsize=8, )?}}align=4, preferredalign=4
|
|
// CHECK64: 3:1-8 | unsigned long a7
|
|
// CHECK64: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8
|
|
|
|
#pragma align(packed)
|
|
struct C1 {
|
|
signed int a1 : 6;
|
|
signed char a2 : 4;
|
|
short int a3 : 2;
|
|
int a4 : 2;
|
|
signed long a5 : 5;
|
|
long long int a6 : 6;
|
|
unsigned long a7 : 8;
|
|
} C1;
|
|
#pragma align(reset)
|
|
|
|
int c1 = sizeof(C1);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct C1
|
|
// CHECK-NEXT: 0:0-5 | int a1
|
|
// CHECK-NEXT: 0:6-9 | signed char a2
|
|
// CHECK-NEXT: 1:2-3 | short a3
|
|
// CHECK-NEXT: 1:4-5 | int a4
|
|
// CHECK-NEXT: 1:6-10 | long a5
|
|
// CHECK-NEXT: 2:3-8 | long long a6
|
|
// CHECK-NEXT: 3:1-8 | unsigned long a7
|
|
// CHECK-NEXT: sizeof=5, {{(dsize=5, )?}}align=1, preferredalign=1
|
|
|
|
#pragma pack(4)
|
|
struct C2 {
|
|
signed int a1 : 6;
|
|
signed char a2 : 4;
|
|
short int a3 : 2;
|
|
int a4 : 2;
|
|
signed long a5 : 5;
|
|
long long int a6 : 6;
|
|
unsigned long a7 : 8;
|
|
} C2;
|
|
#pragma pack(pop)
|
|
|
|
int c2 = sizeof(C2);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct C2
|
|
// CHECK-NEXT: 0:0-5 | int a1
|
|
// CHECK-NEXT: 0:6-9 | signed char a2
|
|
// CHECK-NEXT: 1:2-3 | short a3
|
|
// CHECK-NEXT: 1:4-5 | int a4
|
|
// CHECK-NEXT: 1:6-10 | long a5
|
|
// CHECK-NEXT: 2:3-8 | long long a6
|
|
// CHECK-NEXT: 3:1-8 | unsigned long a7
|
|
// CHECK-NEXT: sizeof=8, {{(dsize=8, )?}}align=4, preferredalign=4
|
|
|
|
typedef __attribute__((aligned(32))) short mySHORT;
|
|
struct D {
|
|
char c : 8;
|
|
mySHORT : 0;
|
|
} D;
|
|
|
|
int d = sizeof(D);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct D
|
|
// CHECK-NEXT: 0:0-7 | char c
|
|
// CHECK-NEXT: 32:- | mySHORT
|
|
// CHECK-NEXT: sizeof=32, {{(dsize=32, )?}}align=32, preferredalign=32
|
|
|
|
typedef __attribute__((aligned(32))) long myLONG;
|
|
struct D11 {
|
|
char c : 8;
|
|
myLONG : 0;
|
|
} D11;
|
|
|
|
int d11 = sizeof(D11);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct D11
|
|
// CHECK-NEXT: 0:0-7 | char c
|
|
// CHECK-NEXT: 32:- | myLONG
|
|
// CHECK-NEXT: sizeof=32, {{(dsize=32, )?}}align=32, preferredalign=32
|
|
|
|
typedef __attribute__((aligned(2))) long myLONG2;
|
|
struct D12 {
|
|
char c : 8;
|
|
myLONG2 : 0;
|
|
} D12;
|
|
|
|
int d12 = sizeof(D12);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct D12
|
|
// CHECK-NEXT: 0:0-7 | char c
|
|
// CHECK32: 4:- | myLONG2
|
|
// CHECK32: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4
|
|
// CHECK64: 8:- | myLONG2
|
|
// CHECK64: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8
|
|
|
|
typedef __attribute__((aligned(32))) long long myLONGLONG;
|
|
struct D21 {
|
|
char c : 8;
|
|
myLONGLONG : 0;
|
|
} D21;
|
|
|
|
int d21 = sizeof(D21);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct D21
|
|
// CHECK-NEXT: 0:0-7 | char c
|
|
// CHECK-NEXT: 32:- | myLONGLONG
|
|
// CHECK-NEXT: sizeof=32, {{(dsize=32, )?}}align=32, preferredalign=32
|
|
|
|
typedef __attribute__((aligned(2))) long long myLONGLONG2;
|
|
struct D22 {
|
|
char c : 8;
|
|
myLONGLONG2 : 0;
|
|
} D22;
|
|
|
|
int d22 = sizeof(D22);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct D22
|
|
// CHECK-NEXT: 0:0-7 | char c
|
|
// CHECK32: 4:- | myLONGLONG2
|
|
// CHECK32: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4
|
|
// CHECK64: 8:- | myLONGLONG2
|
|
// CHECK64: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8
|
|
|
|
enum LL : unsigned long long { val = 1 };
|
|
|
|
struct E {
|
|
enum LL e : 32;
|
|
} E;
|
|
|
|
int e = sizeof(E);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct E
|
|
// CHECK-NEXT: 0:0-31 | enum LL e
|
|
// CHECK32-NEXT: sizeof=4, {{(dsize=4, )?}}align=4, preferredalign=4
|
|
// CHECK64-NEXT: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8
|
|
|
|
enum LL1 : unsigned long long { val1 = 1 } __attribute__((aligned(16)));
|
|
struct E1 {
|
|
enum LL1 e : 32;
|
|
} E1;
|
|
|
|
int e1 = sizeof(E1);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct E1
|
|
// CHECK-NEXT: 0:0-31 | enum LL1 e
|
|
// CHECK-NEXT: sizeof=16, {{(dsize=16, )?}}align=16, preferredalign=16
|
|
|
|
struct F {
|
|
long long l : 32 __attribute__((aligned(16)));
|
|
} F;
|
|
|
|
int f = sizeof(F);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct F
|
|
// CHECK-NEXT: 0:0-31 | long long l
|
|
// CHECK-NEXT: sizeof=16, {{(dsize=16, )?}}align=16, preferredalign=16
|
|
|
|
struct G {
|
|
long long ll : 45;
|
|
} G;
|
|
|
|
int s = sizeof(G);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct G
|
|
// CHECK-NEXT: 0:0-44 | long long ll
|
|
// CHECK-NEXT: sizeof=8, {{(dsize=8, )?}}align=8, preferredalign=8
|
|
|
|
#pragma align(packed)
|
|
struct H {
|
|
char c;
|
|
int : 0;
|
|
int i;
|
|
} H;
|
|
#pragma align(reset)
|
|
|
|
int h = sizeof(H);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct H
|
|
// CHECK-NEXT: 0 | char c
|
|
// CHECK-NEXT: 4:- | int
|
|
// CHECK-NEXT: 4 | int i
|
|
// CHECK-NEXT: sizeof=8, {{(dsize=8, )?}}align=1, preferredalign=1
|
|
|
|
#pragma pack(2)
|
|
struct I {
|
|
char c;
|
|
int : 0;
|
|
int i;
|
|
} I;
|
|
#pragma pack(pop)
|
|
|
|
int i = sizeof(I);
|
|
|
|
// CHECK: *** Dumping AST Record Layout
|
|
// CHECK-NEXT: 0 | struct I
|
|
// CHECK-NEXT: 0 | char c
|
|
// CHECK-NEXT: 4:- | int
|
|
// CHECK-NEXT: 4 | int i
|
|
// CHECK-NEXT: sizeof=8, {{(dsize=8, )?}}align=2, preferredalign=2
|