diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/CodeGen/arm-cmse-nonsecure.c | 52 | ||||
-rw-r--r-- | clang/test/CodeGen/arm-cmse-secure.c | 66 | ||||
-rw-r--r-- | clang/test/CodeGen/arm-cmse.c | 20 | ||||
-rw-r--r-- | clang/test/Headers/arm-cmse-header-ns.c | 27 | ||||
-rw-r--r-- | clang/test/Headers/arm-cmse-header.c | 20 |
5 files changed, 185 insertions, 0 deletions
diff --git a/clang/test/CodeGen/arm-cmse-nonsecure.c b/clang/test/CodeGen/arm-cmse-nonsecure.c new file mode 100644 index 00000000000..2a483a71f59 --- /dev/null +++ b/clang/test/CodeGen/arm-cmse-nonsecure.c @@ -0,0 +1,52 @@ +// RUN: %clang -mlittle-endian -target thumbv8m.base-eabi -emit-llvm -S -o - %s | FileCheck %s +// RUN: %clang -mbig-endian -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; + unsigned sum; + + tt_val = cmse_TT(p); + ttt_val = cmse_TTT(p); +// CHECK: call i32 @llvm.arm.cmse.tt +// CHECK: call i32 @llvm.arm.cmse.ttt +// CHECK-NOT: llvm.arm.cmse.tta +// CHECK-NOT: llvm.arm.cmse.ttat + + sum = tt_val.value; + sum += ttt_val.value; + + sum += tt_val.flags.mpu_region; + sum += tt_val.flags.mpu_region_valid; + sum += tt_val.flags.read_ok; + sum += tt_val.flags.readwrite_ok; + + 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_READWRITE + | CMSE_MPU_READ); +// CHECK: call i32 @llvm.arm.cmse.tt +// CHECK: call i32 @llvm.arm.cmse.ttt +// CHECK-NOT: llvm.arm.cmse.tta +// CHECK-NOT: 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_MPU_READ); +// CHECK: call i32 @llvm.arm.cmse.tt +// CHECK: call i32 @llvm.arm.cmse.ttt +// CHECK-NOT: call i32 @llvm.arm.cmse.tta +// CHECK-NOT: call i32 @llvm.arm.cmse.ttat +} 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 +} diff --git a/clang/test/CodeGen/arm-cmse.c b/clang/test/CodeGen/arm-cmse.c new file mode 100644 index 00000000000..0f8247748dd --- /dev/null +++ b/clang/test/CodeGen/arm-cmse.c @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -triple thumbv8m.base-none-eabi -O1 -emit-llvm %s -o - | FileCheck %s +int test_cmse_TT(void *p){ + return __builtin_arm_cmse_TT(p); + // CHECK: call i32 @llvm.arm.cmse.tt(i8* %{{.*}}) +} + +int test_cmse_TTT(void *p){ + return __builtin_arm_cmse_TTT(p); + // CHECK: call i32 @llvm.arm.cmse.ttt(i8* %{{.*}}) +} + +int test_cmse_TTA(void *p){ + return __builtin_arm_cmse_TTA(p); + // CHECK: call i32 @llvm.arm.cmse.tta(i8* %{{.*}}) +} + +int test_cmse_TTAT(void *p){ + return __builtin_arm_cmse_TTAT(p); + // CHECK: call i32 @llvm.arm.cmse.ttat(i8* %{{.*}}) +} diff --git a/clang/test/Headers/arm-cmse-header-ns.c b/clang/test/Headers/arm-cmse-header-ns.c new file mode 100644 index 00000000000..a6e63ef8414 --- /dev/null +++ b/clang/test/Headers/arm-cmse-header-ns.c @@ -0,0 +1,27 @@ +// RUN: %clang_cc1 -triple thumbv8m.base-eabi -fsyntax-only %s 2>&1 | FileCheck --check-prefix=CHECK-c %s +// RUN: not %clang_cc1 -triple thumbv8m.base-eabi -fsyntax-only -x c++ %s 2>&1 | FileCheck --check-prefix=CHECK-cpp %s + +#include <arm_cmse.h> + +typedef void (*callback_t)(void); + +void func(callback_t fptr, void *p) +{ + cmse_TT(p); + cmse_TTT(p); + cmse_TT_fptr(fptr); + cmse_TTT_fptr(fptr); + + cmse_TTA(p); + cmse_TTAT(p); + cmse_TTA_fptr(fptr); + cmse_TTAT_fptr(fptr); +// CHECK-c: warning: implicit declaration of function 'cmse_TTA' +// CHECK-c: warning: implicit declaration of function 'cmse_TTAT' +// CHECK-c: warning: implicit declaration of function 'cmse_TTA_fptr' +// CHECK-c: warning: implicit declaration of function 'cmse_TTAT_fptr' +// CHECK-cpp: error: use of undeclared identifier 'cmse_TTA' +// CHECK-cpp: error: use of undeclared identifier 'cmse_TTAT' +// CHECK-cpp: error: use of undeclared identifier 'cmse_TTA_fptr' +// CHECK-cpp: error: use of undeclared identifier 'cmse_TTAT_fptr' +} diff --git a/clang/test/Headers/arm-cmse-header.c b/clang/test/Headers/arm-cmse-header.c new file mode 100644 index 00000000000..862572d8adc --- /dev/null +++ b/clang/test/Headers/arm-cmse-header.c @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -triple thumbv8m.base-eabi -fsyntax-only -ffreestanding %s -verify -mcmse +// RUN: %clang_cc1 -triple thumbv8m.base-eabi -fsyntax-only -ffreestanding -x c++ %s -verify -mcmse +// expected-no-diagnostics + +#include <arm_cmse.h> + +typedef void (*callback_t)(void); + +void func(callback_t fptr, void *p) +{ + cmse_TT(p); + cmse_TTT(p); + cmse_TTA(p); + cmse_TTAT(p); + + cmse_TT_fptr(fptr); + cmse_TTT_fptr(fptr); + cmse_TTA_fptr(fptr); + cmse_TTAT_fptr(fptr); +} |