1 // RUN: %clang_cc1 -no-opaque-pointers -triple thumbv8m.main   -O0 -mcmse -S -emit-llvm %s -o - | \
2 // RUN:    FileCheck %s --check-prefixes=CHECK,CHECK-LE,CHECK-LE-NOPT,CHECK-SOFT
3 // RUN: %clang_cc1 -no-opaque-pointers -triple thumbebv8m.main -O0 -mcmse -S -emit-llvm %s -o - | \
4 // RUN:    FileCheck %s --check-prefixes=CHECK,CHECK-BE,CHECK-SOFT
5 // RUN: %clang_cc1 -no-opaque-pointers -triple thumbv8m.main   -O2 -mcmse -S -emit-llvm %s -o - | \
6 // RUN:    FileCheck %s --check-prefixes=CHECK,CHECK-LE,CHECK-LE-OPT,CHECK-SOFT
7 // RUN: %clang_cc1 -no-opaque-pointers -triple thumbebv8m.main -O2 -mcmse -S -emit-llvm %s -o - | \
8 // RUN:    FileCheck %s --check-prefixes=CHECK,CHECK-BE,CHECK-BE-OPT,CHECK-SOFT
9 // RUN: %clang_cc1 -no-opaque-pointers -triple thumbv8m.main   -O0 -mcmse -S -emit-llvm %s -o - \
10 // RUN:            -mfloat-abi hard | \
11 // RUN:    FileCheck %s --check-prefixes=CHECK,CHECK-LE,CHECK-LE-NOPT,CHECK-HARD
12 
13 
14 //   :        Memory layout                | Mask
15 // LE: .......1 ........ ........ ........ | 0x00000001/1
16 // BE: 1....... ........ ........ ........ | 0x80000000/-2147483648
17 typedef struct T0 {
18   int a : 1, : 31;
19 } T0;
20 
21 T0 t0;
22 __attribute__((cmse_nonsecure_entry)) T0 f0(void) { return t0; }
23 // CHECK:    define {{.*}} @f0()
24 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 1
25 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -2147483648
26 // CHECK:    ret i32 %[[R]]
27 
28 // LE: ......1. ........ ........ ........ 0x00000002/2
29 // BE: .1...... ........ ........ ........ 0x40000000/1073741824
30 typedef struct T1 {
31   int : 1, a : 1, : 30;
32 } T1;
33 
34 T1 t1;
35 __attribute__((cmse_nonsecure_entry)) T1 f1(void) { return t1; }
36 // CHECK:    define {{.*}} @f1()
37 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 2
38 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 1073741824
39 // CHECK:    ret i32 %[[R]]
40 
41 // LE: ........ .......1 ........ ........ 0x00000100/256
42 // BE: ........ 1....... ........ ........ 0x00800000/8388608
43 typedef struct T2 {
44   int : 8, a : 1, : 23;
45 } T2;
46 
47 T2 t2;
48 __attribute__((cmse_nonsecure_entry)) T2 f2(void) { return t2; }
49 // CHECK:    define {{.*}} @f2()
50 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 256
51 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 8388608
52 // CHECK:    ret i32 %[[R]]
53 
54 // LE: ........ .....1.. ........ ........ 0x00000400/1024
55 // BE: ........ ..1..... ........ ........ 0x00200000/2097152
56 typedef struct T3 {
57   int : 10, a : 1;
58 } T3;
59 
60 T3 t3;
61 __attribute__((cmse_nonsecure_entry)) T3 f3(void) { return t3; }
62 // CHECK:    define {{.*}} @f3()
63 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 1024
64 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 2097152
65 // CHECK:    ret i32 %[[R]]
66 
67 // LE: 11111111 ........ ........ ........ 0x000000ff/255
68 // BE: 11111111 ........ ........ ........ 0xff000000/-16777216
69 typedef struct T4 {
70   int a : 8, : 24;
71 } T4;
72 
73 T4 t4;
74 __attribute__((cmse_nonsecure_entry)) T4 f4(void) { return t4; }
75 // CHECK: define {{.*}} @f4()
76 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 255
77 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -16777216
78 // CHECK: ret i32 %[[R]]
79 
80 // LE: 1111111. .......1 ........ ........ 0x000001fe/510
81 // BE: .1111111 1....... ........ ........ 0x7f800000/2139095040
82 typedef struct T5 {
83   int : 1, a : 8, : 23;
84 } T5;
85 
86 T5 t5;
87 __attribute__((cmse_nonsecure_entry)) T5 f5(void) { return t5; }
88 // CHECK:    define {{.*}} @f5()
89 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 510
90 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 2139095040
91 // CHECK:    ret i32 %[[R]]
92 
93 // LE: 1111111. 11111111 ........ ........ 0x0000fffe/65534
94 // BE: .1111111 11111111 ........ ........ 0x7fff0000/2147418112
95 typedef struct T6 {
96   int : 1, a : 15, : 16;
97 } T6;
98 
99 T6 t6;
100 __attribute__((cmse_nonsecure_entry)) T6 f6(void) { return t6; }
101 // CHECK:    define {{.*}} @f6()
102 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 65534
103 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 2147418112
104 // CHECK:    ret i32 %[[R]]
105 
106 // LE: 1111111. 11111111 .......1 ........ 0x0001fffe/131070
107 // BE: .1111111 11111111 1....... ........ 0x7fff8000/2147450880
108 typedef struct T7 {
109   int : 1, a : 16, : 15;
110 } T7;
111 
112 T7 t7;
113 __attribute__((cmse_nonsecure_entry)) T7 f7(void) { return t7; }
114 // CHECK:    define {{.*}} @f7()
115 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 131070
116 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 2147450880
117 // CHECK:    ret i32 %[[R]]
118 
119 // LE: 11111111 111111.. 11111111 11111111 0xfffffcff/-769
120 // BE: 11111111 ..111111 11111111 11111111 0xff3fffff/-12582913
121 typedef struct T8 {
122   struct T80 {
123     char a;
124     char : 2, b : 6;
125   } a;
126   short b;
127 } T8;
128 
129 T8 t8;
130 __attribute__((cmse_nonsecure_entry)) T8 f8(void) { return t8; }
131 // CHECK:    define {{.*}} @f8()
132 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, -769
133 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -12582913
134 // CHECK:    ret i32 %[[R]]
135 
136 // LE: ......11 ..111111 ...11111 ........ 0x001f3f03/2047747
137 // BE: 11...... 111111.. 11111... ........ 0xc0fcf800/-1057163264
138 typedef struct T9 {
139   struct T90 {
140     char a : 2;
141     char : 0;
142     short b : 6;
143   } a;
144   int b : 5;
145 } T9;
146 
147 T9 t9;
148 __attribute__((cmse_nonsecure_entry)) T9 f9(void) { return t9; }
149 // CHECK:    define {{.*}} @f9()
150 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 2047747
151 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -1057163264
152 // CHECK:    ret i32 %[[R]]
153 
154 T9 f91(void) { return t9; }
155 // CHECK:  define {{.*}} @f91()
156 // CHECK: %[[R:.*]] = load i32
157 // CHECK: ret i32 %[[R]]
158 
159 // LE: 11111111 ........ 11111111 11111111 0xffff00ff/-65281
160 // BE: 11111111 ........ 11111111 11111111 0xff00ffff/16711681
161 typedef struct T10 {
162   char a;
163   short b;
164 } T10;
165 
166 T10 t10;
167 __attribute__((cmse_nonsecure_entry)) T10 f10(void) { return t10; }
168 // CHECK: define {{.*}} @f10()
169 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, -65281
170 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -16711681
171 // CHECK: ret i32 %[[R]]
172 
173 // LE: 11111111 11111111 11111111 ........ 0x00ffffff/16777215
174 // BE: 11111111 11111111 11111111 ........ 0xffffff00/-256
175 typedef struct T11 {
176   short a;
177   char b;
178 } T11;
179 
180 T11 t11;
181 __attribute__((cmse_nonsecure_entry)) T11 f11(void) { return t11; }
182 // CHECK: define {{.*}} @f11()
183 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 16777215
184 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -256
185 // CHECK: ret i32 %[[R]]
186 
187 // LE: 11111111 11111111 11111111 ........ 0x00ffffff/16777215
188 // BE: 11111111 11111111 11111111 ........ 0xffffff00/-256
189 typedef struct T12 {
190   char a[3];
191 } T12;
192 
193 T12 t12;
194 __attribute__((cmse_nonsecure_entry)) T12 f12(void) { return t12; }
195 // CHECK:    define {{.*}} @f12()
196 // CHECK-LE-OPT:  %[[V0:.*]] = load i24, i24* bitcast (%struct.T12* @t12
197 // CHECK-LE-OPT:  %[[R:.*]] = zext i24 %[[V0]] to i32
198 // CHECK-LE-NOPT: %[[R:.*]] = and i32 %{{.*}}, 16777215
199 
200 // CHECK-BE-OPT:  %[[V0:.*]] = load i24, i24* bitcast (%struct.T12* @t12
201 // CHECK-BE-OPT:  %[[V1:.*]] = zext i24 %[[V0]] to i32
202 // CHECK-BE-OPT:  %[[R:.*]] = shl nuw i32 %[[V1]], 8
203 // CHECK:         ret i32 %[[R]]
204 
205 // LE: 11111111 11111111 11111111 ........ 0x00ffffff/16777215
206 // BE: 11111111 11111111 11111111 ........ 0xffffff00/-256
207 typedef struct __attribute__((packed)) T13 {
208   char a;
209   short b;
210 } T13;
211 
212 T13 t13;
213 __attribute__((cmse_nonsecure_entry)) T13 f13(void) { return t13; }
214 // CHECK:         define {{.*}} @f13()
215 // CHECK-LE-OPT:  %[[V0:.*]] = load i24, i24* bitcast (%struct.T13* @t13
216 // CHECK-LE-OPT:  %[[R:.*]] = zext i24 %[[V0]] to i32
217 // CHECK-LE-NOPT: %[[R:.*]] = and i32 %{{.*}}, 16777215
218 
219 // CHECK-BE-OPT:  %[[V0:.*]] = load i24, i24* bitcast (%struct.T13* @t13
220 // CHECK-BE-OPT:  %[[V1:.*]] = zext i24 %[[V0]] to i32
221 // CHECK-BE-OPT:  %[[R:.*]] = shl nuw i32 %[[V1]], 8
222 // CHECK:         ret i32 %[[R]]
223 
224 typedef struct __attribute__((packed)) T14 {
225   short a;
226   short b;
227 } T14;
228 
229 T14 t14;
230 __attribute__((cmse_nonsecure_entry)) T14 f14(void) { return t14; }
231 // CHECK: define {{.*}} @f14()
232 // CHECK: [[R:%.*]] = load
233 // CHECK-LE-NOPT-NEXT: [[AND:%.+]] = and i32 [[R]], -1
234 // CHECK-BE-NOPT-NEXT: [[AND:%.+]] = and i32 [[R]], -1
235 // CHECK_NEXT: ret i32 [[AND]]
236 
237 // LE: 1111..11 1111..11 11111111 11111111 0xfffff3f3/-3085
238 // BE: 11..1111 11..1111 11111111 11111111 0xcfcfffff/-808452097
239 typedef struct T17 {
240   struct T170 {
241     char a : 2;
242     char   : 2, b : 4;
243   } a[2];
244   char b[2];
245   char c[];
246 } T17;
247 
248 T17 t17;
249 __attribute__((cmse_nonsecure_entry)) T17 f17(void) { return t17; }
250 // CHECK:    define {{.*}} @f17()
251 // CHECK-LE: %[[R:.*]] = and i32 {{.*}}, -3085
252 // CHECK-BE: %[[R:.*]] = and i32 {{.*}}, -808452097
253 // CHECK: ret i32 %[[R]]
254 
255 typedef struct T21 {
256   float a;
257 } T21;
258 
259 T21 t21;
260 __attribute__((cmse_nonsecure_entry)) T21 f21(void) { return t21; }
261 // CHECK:      define {{.*}} @f21()
262 // CHECK-SOFT: ret i32
263 // CHECK-HARD: ret %struct.T21
264 
265 __attribute__((cmse_nonsecure_entry)) float f22(void) { return 1.0f; }
266 // CHECK: define {{.*}} @f22()
267 // CHECK: ret float
268