| // RUN: %clang_cc1 -emit-llvm-only -triple s390x-none-zos -fdump-record-layouts %s | FileCheck %s --check-prefix=CHECK | |
| // RUN: %clang_cc1 -emit-llvm -triple s390x-none-zos %s -o - | FileCheck %s --check-prefix=DECL | |
| static int __attribute__((aligned(32))) v0; | |
| int __attribute__((aligned(32))) v1; | |
| typedef int __attribute__((aligned(32))) int32; | |
| static int32 v2; | |
| int32 v3; | |
| int f0(void) { return v0 + v1 + v2 + v3; } | |
| // DECL: @v0 {{.*}} align 16 | |
| // DECL-NEXT: @v1 {{.*}} align 32 | |
| // DECL-NEXT: @v2 {{.*}} align 16 | |
| // DECL-NEXT: @v3 {{.*}} align 32 | |
| const struct cs0 { | |
| unsigned long : 0; | |
| long long a; | |
| } CS0 = {}; | |
| // CHECK: 0 | struct cs0 | |
| // CHECK-NEXT: 0:- | unsigned long | |
| // CHECK-NEXT: 0 | long long a | |
| // CHECK-NEXT: | [sizeof=8, align=8] | |
| volatile struct vs0 { | |
| long : 0; | |
| short a; | |
| } VS0; | |
| // CHECK: 0 | struct vs0 | |
| // CHECK-NEXT: 0:- | long | |
| // CHECK-NEXT: 0 | short a | |
| // CHECK-NEXT: | [sizeof=2, align=2] | |
| struct s0 { | |
| short a : 3; | |
| long b : 5; | |
| int c : 1; | |
| long d : 10; | |
| char e : 5; | |
| } S0; | |
| // CHECK: 0 | struct s0 | |
| // CHECK-NEXT: 0:0-2 | short a | |
| // CHECK-NEXT: 0:3-7 | long b | |
| // CHECK-NEXT: 1:0-0 | int c | |
| // CHECK-NEXT: 1:1-10 | long d | |
| // CHECK-NEXT: 2:3-7 | char e | |
| // CHECK-NEXT: | [sizeof=3, align=1] | |
| struct s1 { | |
| char a : 7; | |
| long b : 27; | |
| int c : 2; | |
| } S1; | |
| // CHECK: 0 | struct s1 | |
| // CHECK-NEXT: 0:0-6 | char a | |
| // CHECK-NEXT: 0:7-33 | long b | |
| // CHECK-NEXT: 4:2-3 | int c | |
| // CHECK-NEXT: | [sizeof=5, align=1] | |
| struct s2 { | |
| char a : 7; | |
| char : 0; | |
| short : 0; | |
| short : 0; | |
| } S2; | |
| // CHECK: 0 | struct s2 | |
| // CHECK-NEXT: 0:0-6 | char a | |
| // CHECK-NEXT: 4:- | char | |
| // CHECK-NEXT: 4:- | short | |
| // CHECK-NEXT: 4:- | short | |
| // CHECK-NEXT: | [sizeof=4, align=4] | |
| struct s3 { | |
| int a; | |
| int b : 16; | |
| char : 0; | |
| char c : 1; | |
| } S3; | |
| // CHECK: 0 | struct s3 | |
| // CHECK-NEXT: 0 | int a | |
| // CHECK-NEXT: 4:0-15 | int b | |
| // CHECK-NEXT: 8:- | char | |
| // CHECK-NEXT: 8:0-0 | char c | |
| // CHECK-NEXT: | [sizeof=12, align=4] | |
| struct s4 { | |
| unsigned int __attribute__((aligned(32))) a; | |
| } S4; | |
| // CHECK: 0 | struct s4 | |
| // CHECK-NEXT: 0 | unsigned int a | |
| // CHECK-NEXT: | [sizeof=32, align=32] | |
| struct s5 { | |
| char a; | |
| int b : 19 __attribute__((aligned(4))); | |
| int c : 22 __attribute__((aligned(8))); | |
| int : 0; | |
| int d : 10; | |
| } S5; | |
| // CHECK: 0 | struct s5 | |
| // CHECK-NEXT: 0 | char a | |
| // CHECK-NEXT: 4:0-18 | int b | |
| // CHECK-NEXT: 8:0-21 | int c | |
| // CHECK-NEXT: 12:- | int | |
| // CHECK-NEXT: 12:0-9 | int d | |
| // CHECK-NEXT: | [sizeof=16, align=8] | |
| struct s6 { | |
| char *a; | |
| char *b[]; | |
| } S6; | |
| // CHECK: 0 | struct s6 | |
| // CHECK-NEXT: 0 | char * a | |
| // CHECK-NEXT: 8 | char *[] b | |
| // CHECK-NEXT: | [sizeof=8, align=8] | |
| struct s7 { | |
| long : 0; | |
| short a; | |
| } S7; | |
| // CHECK: 0 | struct s7 | |
| // CHECK-NEXT: 0:- | long | |
| // CHECK-NEXT: 0 | short a | |
| // CHECK-NEXT: | [sizeof=2, align=2] | |
| #pragma pack(2) | |
| struct s8 { | |
| unsigned long : 0; | |
| long long a; | |
| } S8; | |
| #pragma pack() | |
| // CHECK: 0 | struct s8 | |
| // CHECK-NEXT: 0:- | unsigned long | |
| // CHECK-NEXT: 0 | long long a | |
| // CHECK-NEXT: | [sizeof=8, align=2] | |
| struct s9 { | |
| unsigned int : 0; | |
| unsigned short : 0; | |
| } S9; | |
| // CHECK: 0 | struct s9 | |
| // CHECK-NEXT: 0:- | unsigned int | |
| // CHECK-NEXT: 0:- | unsigned short | |
| // CHECK-NEXT: | [sizeof=0, align=1] | |
| struct s10 { | |
| unsigned int __attribute__((aligned)) a; | |
| } S10; | |
| // CHECK: 0 | struct s10 | |
| // CHECK-NEXT: 0 | unsigned int a | |
| // CHECK-NEXT: | [sizeof=8, align=8] | |
| struct s11 { | |
| char a; | |
| long : 0; | |
| char b; | |
| } S11; | |
| // CHECK: 0 | struct s11 | |
| // CHECK-NEXT: 0 | char a | |
| // CHECK-NEXT: 8:- | long | |
| // CHECK-NEXT: 8 | char b | |
| // CHECK-NEXT: | [sizeof=16, align=8] | |
| struct s12 { | |
| __int128_t a; | |
| } S12; | |
| // CHECK: 0 | struct s12 | |
| // CHECK-NEXT: 0 | __int128_t a | |
| // CHECK-NEXT: | [sizeof=16, align=8] | |
| union u0 { | |
| unsigned short d1 __attribute__((packed)); | |
| int d2 : 10; | |
| long d3; | |
| } U0 __attribute__((aligned(8))); | |
| // CHECK: 0 | union u0 | |
| // CHECK-NEXT: 0 | unsigned short d1 | |
| // CHECK-NEXT: 0:0-9 | int d2 | |
| // CHECK-NEXT: 0 | long d3 | |
| // CHECK-NEXT: | [sizeof=8, align=8] | |
| union u1 { | |
| unsigned int : 0; | |
| short a; | |
| } U1; | |
| // CHECK: 0 | union u1 | |
| // CHECK-NEXT: 0:- | unsigned int | |
| // CHECK-NEXT: 0 | short a | |
| // CHECK-NEXT: | [sizeof=4, align=4] | |
| union u2 { | |
| long : 0; | |
| short a; | |
| } U2; | |
| // CHECK: 0 | union u2 | |
| // CHECK-NEXT: 0:- | long | |
| // CHECK-NEXT: 0 | short a | |
| // CHECK-NEXT: | [sizeof=8, align=8] | |
| union u3 { | |
| unsigned char : 0; | |
| unsigned short : 0; | |
| } U3; | |
| // CHECK: 0 | union u3 | |
| // CHECK-NEXT: 0:- | unsigned char | |
| // CHECK-NEXT: 0:- | unsigned short | |
| // CHECK-NEXT: | [sizeof=0, align=4] |