// 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]