269 lines · c
1// RUN: %clang_cc1 -triple thumbv8m.main -O0 -mcmse -emit-llvm %s -o - | \2// RUN: FileCheck %s --check-prefixes=CHECK,CHECK-LE,CHECK-LE-NOPT,CHECK-SOFT3// RUN: %clang_cc1 -triple thumbebv8m.main -O0 -mcmse -emit-llvm %s -o - | \4// RUN: FileCheck %s --check-prefixes=CHECK,CHECK-BE,CHECK-SOFT5// RUN: %clang_cc1 -triple thumbv8m.main -O2 -mcmse -emit-llvm %s -o - | \6// RUN: FileCheck %s --check-prefixes=CHECK,CHECK-LE,CHECK-LE-OPT,CHECK-SOFT7// RUN: %clang_cc1 -triple thumbebv8m.main -O2 -mcmse -emit-llvm %s -o - | \8// RUN: FileCheck %s --check-prefixes=CHECK,CHECK-BE,CHECK-BE-OPT,CHECK-SOFT9// RUN: %clang_cc1 -triple thumbv8m.main -O0 -mcmse -emit-llvm %s -o - \10// RUN: -mfloat-abi hard | \11// RUN: FileCheck %s --check-prefixes=CHECK,CHECK-LE,CHECK-LE-NOPT,CHECK-HARD12 13 14// : Memory layout | Mask15// LE: .......1 ........ ........ ........ | 0x00000001/116// BE: 1....... ........ ........ ........ | 0x80000000/-214748364817typedef struct T0 {18 int a : 1, : 31;19} T0;20 21T0 t0;22__attribute__((cmse_nonsecure_entry)) T0 f0(void) { return t0; }23// CHECK: define {{.*}} @f0()24// CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 125// CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -214748364826// CHECK: ret i32 %[[R]]27 28// LE: ......1. ........ ........ ........ 0x00000002/229// BE: .1...... ........ ........ ........ 0x40000000/107374182430typedef struct T1 {31 int : 1, a : 1, : 30;32} T1;33 34T1 t1;35__attribute__((cmse_nonsecure_entry)) T1 f1(void) { return t1; }36// CHECK: define {{.*}} @f1()37// CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 238// CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 107374182439// CHECK: ret i32 %[[R]]40 41// LE: ........ .......1 ........ ........ 0x00000100/25642// BE: ........ 1....... ........ ........ 0x00800000/838860843typedef struct T2 {44 int : 8, a : 1, : 23;45} T2;46 47T2 t2;48__attribute__((cmse_nonsecure_entry)) T2 f2(void) { return t2; }49// CHECK: define {{.*}} @f2()50// CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 25651// CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 838860852// CHECK: ret i32 %[[R]]53 54// LE: ........ .....1.. ........ ........ 0x00000400/102455// BE: ........ ..1..... ........ ........ 0x00200000/209715256typedef struct T3 {57 int : 10, a : 1;58} T3;59 60T3 t3;61__attribute__((cmse_nonsecure_entry)) T3 f3(void) { return t3; }62// CHECK: define {{.*}} @f3()63// CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 102464// CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 209715265// CHECK: ret i32 %[[R]]66 67// LE: 11111111 ........ ........ ........ 0x000000ff/25568// BE: 11111111 ........ ........ ........ 0xff000000/-1677721669typedef struct T4 {70 int a : 8, : 24;71} T4;72 73T4 t4;74__attribute__((cmse_nonsecure_entry)) T4 f4(void) { return t4; }75// CHECK: define {{.*}} @f4()76// CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 25577// CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -1677721678// CHECK: ret i32 %[[R]]79 80// LE: 1111111. .......1 ........ ........ 0x000001fe/51081// BE: .1111111 1....... ........ ........ 0x7f800000/213909504082typedef struct T5 {83 int : 1, a : 8, : 23;84} T5;85 86T5 t5;87__attribute__((cmse_nonsecure_entry)) T5 f5(void) { return t5; }88// CHECK: define {{.*}} @f5()89// CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 51090// CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 213909504091// CHECK: ret i32 %[[R]]92 93// LE: 1111111. 11111111 ........ ........ 0x0000fffe/6553494// BE: .1111111 11111111 ........ ........ 0x7fff0000/214741811295typedef struct T6 {96 int : 1, a : 15, : 16;97} T6;98 99T6 t6;100__attribute__((cmse_nonsecure_entry)) T6 f6(void) { return t6; }101// CHECK: define {{.*}} @f6()102// CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 65534103// CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 2147418112104// CHECK: ret i32 %[[R]]105 106// LE: 1111111. 11111111 .......1 ........ 0x0001fffe/131070107// BE: .1111111 11111111 1....... ........ 0x7fff8000/2147450880108typedef struct T7 {109 int : 1, a : 16, : 15;110} T7;111 112T7 t7;113__attribute__((cmse_nonsecure_entry)) T7 f7(void) { return t7; }114// CHECK: define {{.*}} @f7()115// CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 131070116// CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 2147450880117// CHECK: ret i32 %[[R]]118 119// LE: 11111111 111111.. 11111111 11111111 0xfffffcff/-769120// BE: 11111111 ..111111 11111111 11111111 0xff3fffff/-12582913121typedef struct T8 {122 struct T80 {123 char a;124 char : 2, b : 6;125 } a;126 short b;127} T8;128 129T8 t8;130__attribute__((cmse_nonsecure_entry)) T8 f8(void) { return t8; }131// CHECK: define {{.*}} @f8()132// CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, -769133// CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -12582913134// CHECK: ret i32 %[[R]]135 136// LE: ......11 ..111111 ...11111 ........ 0x001f3f03/2047747137// BE: 11...... 111111.. 11111... ........ 0xc0fcf800/-1057163264138typedef 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 147T9 t9;148__attribute__((cmse_nonsecure_entry)) T9 f9(void) { return t9; }149// CHECK: define {{.*}} @f9()150// CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 2047747151// CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -1057163264152// CHECK: ret i32 %[[R]]153 154T9 f91(void) { return t9; }155// CHECK: define {{.*}} @f91()156// CHECK: %[[R:.*]] = load i32157// CHECK: ret i32 %[[R]]158 159// LE: 11111111 ........ 11111111 11111111 0xffff00ff/-65281160// BE: 11111111 ........ 11111111 11111111 0xff00ffff/16711681161typedef struct T10 {162 char a;163 short b;164} T10;165 166T10 t10;167__attribute__((cmse_nonsecure_entry)) T10 f10(void) { return t10; }168// CHECK: define {{.*}} @f10()169// CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, -65281170// CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -16711681171// CHECK: ret i32 %[[R]]172 173// LE: 11111111 11111111 11111111 ........ 0x00ffffff/16777215174// BE: 11111111 11111111 11111111 ........ 0xffffff00/-256175typedef struct T11 {176 short a;177 char b;178} T11;179 180T11 t11;181__attribute__((cmse_nonsecure_entry)) T11 f11(void) { return t11; }182// CHECK: define {{.*}} @f11()183// CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 16777215184// CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -256185// CHECK: ret i32 %[[R]]186 187// LE: 11111111 11111111 11111111 ........ 0x00ffffff/16777215188// BE: 11111111 11111111 11111111 ........ 0xffffff00/-256189typedef struct T12 {190 char a[3];191} T12;192 193T12 t12;194__attribute__((cmse_nonsecure_entry)) T12 f12(void) { return t12; }195// CHECK: define {{.*}} @f12()196// CHECK-LE-OPT: %[[V0:.*]] = load i24, ptr @t12197// CHECK-LE-OPT: %[[R:.*]] = zext i24 %[[V0]] to i32198// CHECK-LE-NOPT: %[[R:.*]] = and i32 %{{.*}}, 16777215199 200// CHECK-BE-OPT: %[[V0:.*]] = load i24, ptr @t12201// CHECK-BE-OPT: %[[V1:.*]] = zext i24 %[[V0]] to i32202// CHECK-BE-OPT: %[[R:.*]] = shl nuw i32 %[[V1]], 8203// CHECK: ret i32 %[[R]]204 205// LE: 11111111 11111111 11111111 ........ 0x00ffffff/16777215206// BE: 11111111 11111111 11111111 ........ 0xffffff00/-256207typedef struct __attribute__((packed)) T13 {208 char a;209 short b;210} T13;211 212T13 t13;213__attribute__((cmse_nonsecure_entry)) T13 f13(void) { return t13; }214// CHECK: define {{.*}} @f13()215// CHECK-LE-OPT: %[[V0:.*]] = load i24, ptr @t13216// CHECK-LE-OPT: %[[R:.*]] = zext i24 %[[V0]] to i32217// CHECK-LE-NOPT: %[[R:.*]] = and i32 %{{.*}}, 16777215218 219// CHECK-BE-OPT: %[[V0:.*]] = load i24, ptr @t13220// CHECK-BE-OPT: %[[V1:.*]] = zext i24 %[[V0]] to i32221// CHECK-BE-OPT: %[[R:.*]] = shl nuw i32 %[[V1]], 8222// CHECK: ret i32 %[[R]]223 224typedef struct __attribute__((packed)) T14 {225 short a;226 short b;227} T14;228 229T14 t14;230__attribute__((cmse_nonsecure_entry)) T14 f14(void) { return t14; }231// CHECK: define {{.*}} @f14()232// CHECK: [[R:%.*]] = load233// CHECK-LE-OPT: ret i32 [[R]]234// CHECK-LE-NOPT: [[AND:%.+]] = and i32 [[R]], -1235// CHECK-LE-NOPT: ret i32 [[AND]]236// CHECK-BE-OPT: ret i32 [[R]]237 238// LE: 1111..11 1111..11 11111111 11111111 0xfffff3f3/-3085239// BE: 11..1111 11..1111 11111111 11111111 0xcfcfffff/-808452097240typedef struct T17 {241 struct T170 {242 char a : 2;243 char : 2, b : 4;244 } a[2];245 char b[2];246 char c[];247} T17;248 249T17 t17;250__attribute__((cmse_nonsecure_entry)) T17 f17(void) { return t17; }251// CHECK: define {{.*}} @f17()252// CHECK-LE: %[[R:.*]] = and i32 {{.*}}, -3085253// CHECK-BE: %[[R:.*]] = and i32 {{.*}}, -808452097254// CHECK: ret i32 %[[R]]255 256typedef struct T21 {257 float a;258} T21;259 260T21 t21;261__attribute__((cmse_nonsecure_entry)) T21 f21(void) { return t21; }262// CHECK: define {{.*}} @f21()263// CHECK-SOFT: ret i32264// CHECK-HARD: ret %struct.T21265 266__attribute__((cmse_nonsecure_entry)) float f22(void) { return 1.0f; }267// CHECK: define {{.*}} @f22()268// CHECK: ret float269