| // RUN: %clang_cc1 -triple thumbv8m.base-unknown-unknown-eabi -emit-llvm -mrelocation-model static -mcmse -o - %s | FileCheck %s |
| // RUN: %clang_cc1 -triple thumbebv8m.base-unknown-unknown-eabi -emit-llvm -mrelocation-model static -mcmse -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 |
| } |