1 // RUN: %clang_cc1 -emit-llvm-only -triple s390x-none-zos -fdump-record-layouts %s | FileCheck %s --check-prefix=CHECK
2 // RUN: %clang_cc1 -emit-llvm -triple s390x-none-zos %s -o - | FileCheck %s --check-prefix=DECL
3 
4 static int __attribute__((aligned(32))) v0;
5 int __attribute__((aligned(32))) v1;
6 typedef int __attribute__((aligned(32))) int32;
7 static int32 v2;
8 int32 v3;
f0(void)9 int f0(void) { return v0 + v1 + v2 + v3; }
10 // DECL:      @v0 {{.*}} align 16
11 // DECL-NEXT: @v1 {{.*}} align 32
12 // DECL-NEXT: @v2 {{.*}} align 16
13 // DECL-NEXT: @v3 {{.*}} align 32
14 
15 const struct cs0 {
16   unsigned long : 0;
17   long long a;
18 } CS0 = {};
19 // CHECK:              0 | struct cs0
20 // CHECK-NEXT:       0:- |   unsigned long
21 // CHECK-NEXT:         0 |   long long a
22 // CHECK-NEXT:           | [sizeof=8, align=8]
23 
24 volatile struct vs0 {
25   long : 0;
26   short a;
27 } VS0;
28 // CHECK:              0 | struct vs0
29 // CHECK-NEXT:       0:- |   long
30 // CHECK-NEXT:         0 |   short a
31 // CHECK-NEXT:           | [sizeof=2, align=2]
32 
33 struct s0 {
34   short a : 3;
35   long b : 5;
36   int c : 1;
37   long d : 10;
38   char e : 5;
39 } S0;
40 // CHECK:              0 | struct s0
41 // CHECK-NEXT:     0:0-2 |   short a
42 // CHECK-NEXT:     0:3-7 |   long b
43 // CHECK-NEXT:     1:0-0 |   int c
44 // CHECK-NEXT:    1:1-10 |   long d
45 // CHECK-NEXT:     2:3-7 |   char e
46 // CHECK-NEXT:           | [sizeof=3, align=1]
47 
48 struct s1 {
49   char a : 7;
50   long b : 27;
51   int c : 2;
52 } S1;
53 // CHECK:              0 | struct s1
54 // CHECK-NEXT:     0:0-6 |   char a
55 // CHECK-NEXT:    0:7-33 |   long b
56 // CHECK-NEXT:     4:2-3 |   int c
57 // CHECK-NEXT:           | [sizeof=5, align=1]
58 
59 struct s2 {
60   char a : 7;
61   char : 0;
62   short : 0;
63   short : 0;
64 } S2;
65 // CHECK:              0 | struct s2
66 // CHECK-NEXT:     0:0-6 |   char a
67 // CHECK-NEXT:       4:- |   char
68 // CHECK-NEXT:       4:- |   short
69 // CHECK-NEXT:       4:- |   short
70 // CHECK-NEXT:           | [sizeof=4, align=4]
71 
72 struct s3 {
73   int a;
74   int b : 16;
75   char : 0;
76   char c : 1;
77 } S3;
78 // CHECK:              0 | struct s3
79 // CHECK-NEXT:         0 |   int a
80 // CHECK-NEXT:    4:0-15 |   int b
81 // CHECK-NEXT:       8:- |   char
82 // CHECK-NEXT:     8:0-0 |   char c
83 // CHECK-NEXT:           | [sizeof=12, align=4]
84 
85 struct s4 {
86   unsigned int __attribute__((aligned(32))) a;
87 } S4;
88 // CHECK:              0 | struct s4
89 // CHECK-NEXT:         0 |   unsigned int a
90 // CHECK-NEXT:           | [sizeof=32, align=32]
91 
92 struct s5 {
93   char a;
94   int b : 19 __attribute__((aligned(4)));
95   int c : 22 __attribute__((aligned(8)));
96   int : 0;
97   int d : 10;
98 } S5;
99 // CHECK:              0 | struct s5
100 // CHECK-NEXT:         0 |   char a
101 // CHECK-NEXT:    4:0-18 |   int b
102 // CHECK-NEXT:    8:0-21 |   int c
103 // CHECK-NEXT:      12:- |   int
104 // CHECK-NEXT:    12:0-9 |   int d
105 // CHECK-NEXT:           | [sizeof=16, align=8]
106 
107 struct s6 {
108   char *a;
109   char *b[];
110 } S6;
111 // CHECK:              0 | struct s6
112 // CHECK-NEXT:         0 |   char * a
113 // CHECK-NEXT:         8 |   char *[] b
114 // CHECK-NEXT:           | [sizeof=8, align=8]
115 
116 struct s7 {
117   long : 0;
118   short a;
119 } S7;
120 // CHECK:              0 | struct s7
121 // CHECK-NEXT:       0:- |   long
122 // CHECK-NEXT:         0 |   short a
123 // CHECK-NEXT:           | [sizeof=2, align=2]
124 
125 #pragma pack(2)
126 struct s8 {
127   unsigned long : 0;
128   long long a;
129 } S8;
130 #pragma pack()
131 // CHECK:              0 | struct s8
132 // CHECK-NEXT:       0:- |   unsigned long
133 // CHECK-NEXT:         0 |   long long a
134 // CHECK-NEXT:           | [sizeof=8, align=2]
135 
136 struct s9 {
137   unsigned int : 0;
138   unsigned short : 0;
139 } S9;
140 // CHECK:              0 | struct s9
141 // CHECK-NEXT:       0:- |   unsigned int
142 // CHECK-NEXT:       0:- |   unsigned short
143 // CHECK-NEXT:           | [sizeof=0, align=1]
144 
145 struct s10 {
146   unsigned int __attribute__((aligned)) a;
147 } S10;
148 // CHECK:              0 | struct s10
149 // CHECK-NEXT:         0 |   unsigned int a
150 // CHECK-NEXT:           | [sizeof=8, align=8]
151 
152 struct s11 {
153   char a;
154   long : 0;
155   char b;
156 } S11;
157 // CHECK:              0 | struct s11
158 // CHECK-NEXT:         0 |   char a
159 // CHECK-NEXT:       8:- |   long
160 // CHECK-NEXT:         8 |   char b
161 // CHECK-NEXT:           | [sizeof=16, align=8]
162 
163 union u0 {
164   unsigned short d1 __attribute__((packed));
165   int d2 : 10;
166   long d3;
167 } U0 __attribute__((aligned(8)));
168 // CHECK:              0 | union u0
169 // CHECK-NEXT:         0 |   unsigned short d1
170 // CHECK-NEXT:     0:0-9 |   int d2
171 // CHECK-NEXT:         0 |   long d3
172 // CHECK-NEXT:           | [sizeof=8, align=8]
173 
174 union u1 {
175   unsigned int : 0;
176   short a;
177 } U1;
178 // CHECK:              0 | union u1
179 // CHECK-NEXT:       0:- |   unsigned int
180 // CHECK-NEXT:         0 |   short a
181 // CHECK-NEXT:           | [sizeof=4, align=4]
182 
183 union u2 {
184   long : 0;
185   short a;
186 } U2;
187 // CHECK:              0 | union u2
188 // CHECK-NEXT:       0:- |   long
189 // CHECK-NEXT:         0 |   short a
190 // CHECK-NEXT:           | [sizeof=8, align=8]
191 
192 union u3 {
193   unsigned char : 0;
194   unsigned short : 0;
195 } U3;
196 // CHECK:              0 | union u3
197 // CHECK-NEXT:       0:- |   unsigned char
198 // CHECK-NEXT:       0:- |   unsigned short
199 // CHECK-NEXT:           | [sizeof=0, align=4]
200