53 lines · c
1// RUN: %clang_cc1 -triple thumbv8m.base-unknown-unknown-eabi -emit-llvm -mrelocation-model static -o - %s | FileCheck %s2// RUN: %clang_cc1 -triple thumbebv8m.base-unknown-unknown-eabi -emit-llvm -mrelocation-model static -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 unsigned sum;10 11 tt_val = cmse_TT(p);12 ttt_val = cmse_TTT(p);13// CHECK: call i32 @llvm.arm.cmse.tt14// CHECK: call i32 @llvm.arm.cmse.ttt15// CHECK-NOT: llvm.arm.cmse.tta16// CHECK-NOT: llvm.arm.cmse.ttat17 18 sum = tt_val.value;19 sum += ttt_val.value;20 21 sum += tt_val.flags.mpu_region;22 sum += tt_val.flags.mpu_region_valid;23 sum += tt_val.flags.read_ok;24 sum += tt_val.flags.readwrite_ok;25 26 return sum;27}28 29void *test_address_range(void *p) {30// CHECK: define {{.*}} ptr @test_address_range31 return cmse_check_address_range(p, 128, CMSE_MPU_UNPRIV32 | CMSE_MPU_READWRITE33 | CMSE_MPU_READ);34// CHECK: call i32 @llvm.arm.cmse.tt35// CHECK: call i32 @llvm.arm.cmse.ttt36// CHECK-NOT: llvm.arm.cmse.tta37// CHECK-NOT: llvm.arm.cmse.ttat38}39 40typedef struct {41 int x, y, z;42} Point;43 44void test_pointed_object(void *p) {45// CHECK: define {{.*}} void @test_pointed_object46 Point *pt = (Point *)p;47 cmse_check_pointed_object(pt, CMSE_MPU_READ);48// CHECK: call i32 @llvm.arm.cmse.tt49// CHECK: call i32 @llvm.arm.cmse.ttt50// CHECK-NOT: call i32 @llvm.arm.cmse.tta51// CHECK-NOT: call i32 @llvm.arm.cmse.ttat52}53