brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.7 KiB · de77d63 Raw
190 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-SOFTFP3// RUN: %clang_cc1 -triple thumbebv8m.main -O0 -mcmse -emit-llvm %s -o - | \4// RUN:    FileCheck %s --check-prefixes=CHECK,CHECK-BE,CHECK-SOFTFP5// RUN: %clang_cc1 -triple thumbv8m.main   -O2 -mcmse -emit-llvm %s -o - | \6// RUN:    FileCheck %s --check-prefixes=CHECK,CHECK-LE,CHECK-SOFTFP7// RUN: %clang_cc1 -triple thumbebv8m.main -O2 -mcmse -emit-llvm %s -o - | \8// RUN:    FileCheck %s --check-prefixes=CHECK,CHECK-BE,CHECK-SOFTFP9// RUN: %clang_cc1 -triple thumbv8m.main   -O0 -mcmse -mfloat-abi hard  \10// RUN:            -emit-llvm %s -o - | \11// RUN:    FileCheck %s --check-prefixes=CHECK,CHECK-LE,CHECK-HARDFP12 13// We don't really need to repeat *all* the test cases from cmse-clear-return.c14// as it won't increase test coverage.15 16//   :        Memory layout                | Mask17// LE: .......1 ........ ........ ........ | 0x00000001/118// BE: 1....... ........ ........ ........ | 0x80000000/-214748364819typedef struct T0 {20  int a : 1, : 31;21} T0;22 23void __attribute__((cmse_nonsecure_call)) (*g0)(T0);24 25T0 t0;26void f0(void) { g0(t0); }27// CHECK:    define {{.*}} @f0()28// CHECK-LE: %[[V0:.*]] = and i32 {{.*}}, 129// CHECK-BE: %[[V0:.*]] = and i32 {{.*}}, -214748364830// CHECK:    %[[V1:.*]] = insertvalue [1 x i32] poison, i32 %[[V0]], 031// CHECK:    call {{.*}} void %0([1 x i32] %[[V1]])32 33// LE: 11111111 111111.. 11111111 11111111 0xfffffcff/-76934// BE: 11111111 ..111111 11111111 11111111 0xff3fffff/-1258291335typedef struct T8 {36  struct T80 {37    char a;38    char : 2, b : 6;39  } a;40  short b;41} T8;42 43T8 t8;44void __attribute__((cmse_nonsecure_call)) (*g8)(T8);45void f8(void) { g8(t8); }46// CHECK:    define {{.*}} @f8()47// CHECK-LE: %[[V0:.*]] = and i32 {{.*}}, -76948// CHECK-BE: %[[V0:.*]] = and i32 {{.*}}, -1258291349// CHECK:    %[[V1:.*]] = insertvalue [1 x i32] poison, i32 %[[V0]], 050// CHECK:    call {{.*}} void %0([1 x i32] %[[V1]])51 52// LE(0): 11111111 ........ 11111111 11111111 0xffff00ff/-6528153// LE(4): ...111.. 11111... 11111111 .....111 0x7fff81c/13421570854// BE(0): 11111111 ........ 11111111 11111111 0xff00ffff/-1671168155// BE(4): ..111... ...11111 11111111 111..... 0x381fffe0/94162121656typedef struct T15 {57  char a;58  short b;59  int : 2, c : 3, : 6, d : 16;60} T15;61 62T15 t15;63 64void __attribute__((cmse_nonsecure_call)) (*g15_0)(T15);65void f15_0(void) {66  g15_0(t15);67}68// CHECK: define {{.*}}@f15_0()69// CHECK: %[[FN:.*]] = load {{.*}} @g15_070// CHECK-LE:  %cmse.clear = and i32 {{.*}}, -6528171// CHECK-BE:  %cmse.clear = and i32 {{.*}}, -1671168172// CHECK: %[[R0:.*]] = insertvalue [2 x i32] poison, i32 %cmse.clear, 073// CHECK-LE: %cmse.clear1 = and i32 {{.*}}, 13421570874// CHECK-BE: %cmse.clear1 = and i32 {{.*}}, 94162121675// CHECK: %[[R1:.*]] = insertvalue [2 x i32] %[[R0]], i32 %cmse.clear1, 176// CHECK: call {{.*}} void %[[FN]]([2 x i32] %[[R1]])77 78void __attribute__((cmse_nonsecure_call)) (*g15_1)(int, int, int, T15);79void f15_1(void) {80  g15_1(0, 1, 2, t15);81}82// CHECK: define {{.*}}@f15_1()83// CHECK: %[[FN:.*]] = load {{.*}} @g15_184// CHECK-LE:  %cmse.clear = and i32 {{.*}}, -6528185// CHECK-BE:  %cmse.clear = and i32 {{.*}}, -1671168186// CHECK: %[[R0:.*]] = insertvalue [2 x i32] poison, i32 %cmse.clear, 087// CHECK-LE: %cmse.clear1 = and i32 {{.*}}, 13421570888// CHECK-BE: %cmse.clear1 = and i32 {{.*}}, 94162121689// CHECK: %[[R1:.*]] = insertvalue [2 x i32] %[[R0]], i32 %cmse.clear1, 190// CHECK: call {{.*}} void %[[FN]](i32 noundef 0, i32 noundef 1, i32 noundef 2, [2 x i32] %[[R1]])91 92// LE: 11111111 ........ 11111111 11111111 1111.... ...11111 ........ .111111.93// LE: 0xff00fffff01f007e/907929196872643404794// BE: 11111111 ........ 11111111 11111111 ....1111 11111... ........ .111111.95// BE: 0xff00ffff0ff8007e/-7177612308827328296 97typedef struct T16 {98  char a;99  short b;100  long long : 4, c : 9, : 12, d : 6;101} T16;102 103T16 t16;104 105void __attribute__((cmse_nonsecure_call)) (*g16_0)(T16);106void f16_0(void) {107  g16_0(t16);108}109// CHECK: define {{.*}} @f16_0()110// CHECK: %[[FN:.*]] = load {{.*}} @g16_0111// CHECK-LE: %cmse.clear = and i64 {{.*}}, 9079291968726434047112// CHECK-BE: %cmse.clear = and i64 {{.*}}, -71776123088273282113// CHECK: %[[R:.*]] = insertvalue [1 x i64] poison, i64 %cmse.clear, 0114// CHECK: call {{.*}} void %0([1 x i64] %[[R]])115 116 117// LE0: 1111..11 .......1 1111..11 .......1 1111..11 .......1 1111..11 .......1118// LE4: 1111..11 .......1 1111..11 .......1 11111111 11111111 11111111 ........119// LE : 0x01f301f3/32702963 * 3 + 0x00ffffff/16777215120// BE0: 11..1111 1....... 11..1111 1....... 11..1111 1....... 11..1111 1.......121// BE4: 11..1111 1....... 11..1111 1....... 11111111 11111111 11111111 ........122// BE : 0xcf80cf80/-813641856 * 3 + 0xffffff00/-256123 124typedef struct T18 {125  struct T180 {126    short a : 2;127    short   : 2, b : 5;128  } a[2][3];129  char b[3];130  char c[];131} T18;132 133T18 t18;134 135void __attribute__((cmse_nonsecure_call)) (*g18)(T18);136void f18(void) {137  g18(t18);138}139// CHECK:    define {{.*}} @f18()140// CHECK:    %[[FN:.*]] = load {{.*}} @g18141// CHECK-LE: %cmse.clear = and i32 {{.*}}, 32702963142// CHECK-BE: %cmse.clear = and i32 {{.*}}, -813641856143// CHECK:    %[[R0:.*]] = insertvalue [4 x i32] poison, i32 %cmse.clear, 0144// CHECK-LE: %cmse.clear1 = and i32 {{.*}}, 32702963145// CHECK-BE: %cmse.clear1 = and i32 {{.*}}, -813641856146// CHECK:    %[[R1:.*]] = insertvalue [4 x i32] %[[R0]], i32 %cmse.clear1, 1147// CHECK-LE: %cmse.clear2 = and i32 {{.*}}, 32702963148// CHECK-BE: %cmse.clear2 = and i32 {{.*}}, -813641856149// CHECK:    %[[R2:.*]] = insertvalue [4 x i32] %[[R1]], i32 %cmse.clear2, 2150// CHECK-LE: %cmse.clear3 = and i32 {{.*}}, 16777215151// CHECK-BE: %cmse.clear3 = and i32 {{.*}}, -256152// CHECK:    %[[R3:.*]] = insertvalue [4 x i32] %[[R2]], i32 %cmse.clear3, 3153// CHECK:    call {{.*}} void %[[FN]]([4 x i32] %[[R3]])154 155// LE: 11111111 11111111 ..111... ..111... 0x3838ffff/943259647156// BE: 11111111 11111111 ...111.. ...111.. 0xffff1c1c/-58340157typedef union T19 {158  short a;159  struct T190 {160    char : 3, a : 3;161  } b[4];162} T19;163 164T19 t19;165void __attribute__((cmse_nonsecure_call)) (*g19)(T19);166void f19(void) {167  g19(t19);168}169// CHECK:    define {{.*}} @f19()170// CHECK:    %[[FN:.*]] = load {{.*}} @g19171// CHECK-LE: %cmse.clear = and i32 {{.*}}, 943259647172// CHECK-BE: %cmse.clear = and i32 {{.*}}, -58340173// CHECK:    %[[R:.*]] = insertvalue [1 x i32] poison, i32 %cmse.clear, 0174// CHECK:    call {{.*}} void %[[FN]]([1 x i32] %[[R]])175 176 177typedef struct T20 {178  float a[2];179} T20;180 181T20 t20;182void __attribute__((cmse_nonsecure_call)) (*g20)(T20);183void f20(void) {184  g20(t20);185}186// CHECK: define {{.*}} @f20()187// CHECK:    %[[FN:.*]] = load {{.*}} @g20188// CHECK-SOFTFP: call arm_aapcscc void %[[FN]]([2 x i32]189// CHECK-HARDFP: call arm_aapcs_vfpcc void %[[FN]](%struct.T20190