67 lines · c
1// RUN: %clang_cc1 -triple thumbv8m.base-unknown-unknown-eabi -emit-llvm -mrelocation-model static -mcmse -o - %s | FileCheck %s2// RUN: %clang_cc1 -triple thumbebv8m.base-unknown-unknown-eabi -emit-llvm -mrelocation-model static -mcmse -o - %s | FileCheck %s3 4#include <arm_cmse.h>5 6unsigned test_cmse_primitives(void *p) {7// CHECK: define {{.*}} i32 @test_cmse_primitives8 cmse_address_info_t tt_val, ttt_val;9 cmse_address_info_t tta_val, ttat_val;10 unsigned sum;11 12 tt_val = cmse_TT(p);13 ttt_val = cmse_TTT(p);14 tta_val = cmse_TTA(p);15 ttat_val = cmse_TTAT(p);16// CHECK: call i32 @llvm.arm.cmse.tt17// CHECK: call i32 @llvm.arm.cmse.ttt18// CHECK: call i32 @llvm.arm.cmse.tta19// CHECK: call i32 @llvm.arm.cmse.ttat20 21 sum = tt_val.value;22 sum += ttt_val.value;23 sum += tta_val.value;24 sum += ttat_val.value;25 26 sum += tt_val.flags.mpu_region;27 sum += tt_val.flags.sau_region;28 sum += tt_val.flags.mpu_region_valid;29 sum += tt_val.flags.sau_region_valid;30 sum += tt_val.flags.read_ok;31 sum += tt_val.flags.readwrite_ok;32 sum += tt_val.flags.nonsecure_read_ok;33 sum += tt_val.flags.nonsecure_readwrite_ok;34 sum += tt_val.flags.secure;35 sum += tt_val.flags.idau_region_valid;36 sum += tt_val.flags.idau_region;37 38 return sum;39}40 41void *test_address_range(void *p) {42// CHECK: define {{.*}} ptr @test_address_range43 return cmse_check_address_range(p, 128, CMSE_MPU_UNPRIV44 | CMSE_MPU_NONSECURE45 | CMSE_MPU_READWRITE);46// CHECK: call i32 @llvm.arm.cmse.tt47// CHECK: call i32 @llvm.arm.cmse.ttt48// CHECK: call i32 @llvm.arm.cmse.tta49// CHECK: call i32 @llvm.arm.cmse.ttat50}51 52typedef struct {53 int x, y, z;54} Point;55 56void test_pointed_object(void *p) {57// CHECK: define {{.*}} void @test_pointed_object58 Point *pt = (Point *)p;59 cmse_check_pointed_object(pt, CMSE_NONSECURE60 | CMSE_MPU_READ61 | CMSE_AU_NONSECURE);62// CHECK: call i32 @llvm.arm.cmse.tt63// CHECK: call i32 @llvm.arm.cmse.ttt64// CHECK: call i32 @llvm.arm.cmse.tta65// CHECK: call i32 @llvm.arm.cmse.ttat66}67