diff options
Diffstat (limited to 'clang/test/CodeGen/arm-cmse-secure.c')
-rw-r--r-- | clang/test/CodeGen/arm-cmse-secure.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/clang/test/CodeGen/arm-cmse-secure.c b/clang/test/CodeGen/arm-cmse-secure.c new file mode 100644 index 00000000000..716887254e5 --- /dev/null +++ b/clang/test/CodeGen/arm-cmse-secure.c @@ -0,0 +1,66 @@ +// RUN: %clang -mlittle-endian -mcmse -target thumbv8m.base-eabi -emit-llvm -S -o - %s | FileCheck %s +// RUN: %clang -mbig-endian -mcmse -target thumbv8m.base-eabi -emit-llvm -S -o - %s | FileCheck %s + +#include <arm_cmse.h> + +unsigned test_cmse_primitives(void *p) { +// CHECK: define {{.*}} i32 @test_cmse_primitives + cmse_address_info_t tt_val, ttt_val; + cmse_address_info_t tta_val, ttat_val; + unsigned sum; + + tt_val = cmse_TT(p); + ttt_val = cmse_TTT(p); + tta_val = cmse_TTA(p); + ttat_val = cmse_TTAT(p); +// CHECK: call i32 @llvm.arm.cmse.tt +// CHECK: call i32 @llvm.arm.cmse.ttt +// CHECK: call i32 @llvm.arm.cmse.tta +// CHECK: call i32 @llvm.arm.cmse.ttat + + sum = tt_val.value; + sum += ttt_val.value; + sum += tta_val.value; + sum += ttat_val.value; + + sum += tt_val.flags.mpu_region; + sum += tt_val.flags.sau_region; + sum += tt_val.flags.mpu_region_valid; + sum += tt_val.flags.sau_region_valid; + sum += tt_val.flags.read_ok; + sum += tt_val.flags.readwrite_ok; + sum += tt_val.flags.nonsecure_read_ok; + sum += tt_val.flags.nonsecure_readwrite_ok; + sum += tt_val.flags.secure; + sum += tt_val.flags.idau_region_valid; + sum += tt_val.flags.idau_region; + + return sum; +} + +void *test_address_range(void *p) { +// CHECK: define {{.*}} i8* @test_address_range + return cmse_check_address_range(p, 128, CMSE_MPU_UNPRIV + | CMSE_MPU_NONSECURE + | CMSE_MPU_READWRITE); +// CHECK: call i32 @llvm.arm.cmse.tt +// CHECK: call i32 @llvm.arm.cmse.ttt +// CHECK: call i32 @llvm.arm.cmse.tta +// CHECK: call i32 @llvm.arm.cmse.ttat +} + +typedef struct { + int x, y, z; +} Point; + +void *test_pointed_object(void *p) { +// CHECK: define {{.*}} i8* @test_pointed_object + Point *pt = (Point *)p; + cmse_check_pointed_object(pt, CMSE_NONSECURE + | CMSE_MPU_READ + | CMSE_AU_NONSECURE); +// CHECK: call i32 @llvm.arm.cmse.tt +// CHECK: call i32 @llvm.arm.cmse.ttt +// CHECK: call i32 @llvm.arm.cmse.tta +// CHECK: call i32 @llvm.arm.cmse.ttat +} |