diff options
author | Andre Vieira <andre.simoesdiasvieira@arm.com> | 2016-03-30 17:53:38 +0000 |
---|---|---|
committer | Thomas Preud'homme <thomas.preudhomme@arm.com> | 2016-03-30 17:53:38 +0000 |
commit | 58fda5e246364e93e1269572cfbb7bbda07c0a3e (patch) | |
tree | 71deb1122d1510503df62fd2e7fc6421571d9f5e | |
parent | dcd99fd51c08e6e8126e99270ec455f1fea02f83 (diff) |
2016-03-30 Andre Vieira <andre.simoesdiasvieira@arm.com>ARM/embedded-5-branch-2016q1
Thomas Preud'homme <thomas.preudhomme@arm.com>
gcc/
* config/arm/arm-builtins.c (arm_builtins): Define
ARM_BUILTIN_CMSE_NONSECURE_CALLER.
(bdesc_2arg): Add line for cmse_nonsecure_caller.
(arm_init_builtins): Init for cmse_nonsecure_caller.
(arm_expand_builtin): Handle cmse_nonsecure_caller.
* config/arm/arm_cmse.h (cmse_nonsecure_caller): New.
gcc/testsuite/
* gcc.target/arm/cmse/cmse-1.c: Add test for
cmse_nonsecure_caller.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/ARM/embedded-5-branch@234589 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog.arm | 10 | ||||
-rw-r--r-- | gcc/config/arm/arm-builtins.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog.arm | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/cmse/cmse-1.c | 29 |
4 files changed, 69 insertions, 0 deletions
diff --git a/gcc/ChangeLog.arm b/gcc/ChangeLog.arm index f3f27555700..46a77f695f8 100644 --- a/gcc/ChangeLog.arm +++ b/gcc/ChangeLog.arm @@ -1,6 +1,16 @@ 2016-03-30 Andre Vieira <andre.simoesdiasvieira@arm.com> Thomas Preud'homme <thomas.preudhomme@arm.com> + * config/arm/arm-builtins.c (arm_builtins): Define + ARM_BUILTIN_CMSE_NONSECURE_CALLER. + (bdesc_2arg): Add line for cmse_nonsecure_caller. + (arm_init_builtins): Init for cmse_nonsecure_caller. + (arm_expand_builtin): Handle cmse_nonsecure_caller. + * config/arm/arm_cmse.h (cmse_nonsecure_caller): New. + +2016-03-30 Andre Vieira <andre.simoesdiasvieira@arm.com> + Thomas Preud'homme <thomas.preudhomme@arm.com> + * config/arm/arm.c (detect_cmse_nonsecure_call): New. (cmse_nonsecure_call_clear_caller_saved): New. * config/arm/arm-protos.h (detect_cmse_nonsecure_call): New. diff --git a/gcc/config/arm/arm-builtins.c b/gcc/config/arm/arm-builtins.c index 6f4fd9bdb97..dc5780373a6 100644 --- a/gcc/config/arm/arm-builtins.c +++ b/gcc/config/arm/arm-builtins.c @@ -508,6 +508,8 @@ enum arm_builtins ARM_BUILTIN_GET_FPSCR, ARM_BUILTIN_SET_FPSCR, + ARM_BUILTIN_CMSE_NONSECURE_CALLER, + #undef CRYPTO1 #undef CRYPTO2 #undef CRYPTO3 @@ -1224,6 +1226,10 @@ static const struct builtin_description bdesc_2arg[] = FP_BUILTIN (set_fpscr, SET_FPSCR) #undef FP_BUILTIN + {FL_CMSE, CODE_FOR_andsi3, + "__builtin_arm_cmse_nonsecure_caller", ARM_BUILTIN_CMSE_NONSECURE_CALLER, + UNKNOWN, 0}, + #define CRC32_BUILTIN(L, U) \ {0, CODE_FOR_##L, "__builtin_arm_"#L, ARM_BUILTIN_##U, \ UNKNOWN, 0}, @@ -1753,6 +1759,17 @@ arm_init_builtins (void) = add_builtin_function ("__builtin_arm_stfscr", ftype_set_fpscr, ARM_BUILTIN_SET_FPSCR, BUILT_IN_MD, NULL, NULL_TREE); } + + if (arm_arch_cmse) + { + tree ftype_cmse_nonsecure_caller + = build_function_type_list (unsigned_type_node, NULL); + arm_builtin_decls[ARM_BUILTIN_CMSE_NONSECURE_CALLER] + = add_builtin_function ("__builtin_arm_cmse_nonsecure_caller", + ftype_cmse_nonsecure_caller, + ARM_BUILTIN_CMSE_NONSECURE_CALLER, BUILT_IN_MD, + NULL, NULL_TREE); + } } /* Return the ARM builtin for CODE. */ @@ -2273,6 +2290,14 @@ arm_expand_builtin (tree exp, emit_insn (pat); return target; + case ARM_BUILTIN_CMSE_NONSECURE_CALLER: + icode = CODE_FOR_andsi3; + target = gen_reg_rtx (SImode); + op0 = arm_return_addr (0, NULL_RTX); + pat = GEN_FCN (icode) (target, op0, const1_rtx); + emit_insn (pat); + return target; + case ARM_BUILTIN_TEXTRMSB: case ARM_BUILTIN_TEXTRMUB: case ARM_BUILTIN_TEXTRMSH: diff --git a/gcc/testsuite/ChangeLog.arm b/gcc/testsuite/ChangeLog.arm index 2b413e62bb1..933a091a557 100644 --- a/gcc/testsuite/ChangeLog.arm +++ b/gcc/testsuite/ChangeLog.arm @@ -1,6 +1,11 @@ 2016-03-30 Andre Vieira <andre.simoesdiasvieira@arm.com> Thomas Preud'homme <thomas.preudhomme@arm.com> + * gcc.target/arm/cmse/cmse-1.c: Add test for cmse_nonsecure_caller. + +2016-03-30 Andre Vieira <andre.simoesdiasvieira@arm.com> + Thomas Preud'homme <thomas.preudhomme@arm.com> + * gcc/testsuite/gcc.target/arm/cmse/baseline/cmse-11.c: New. * gcc/testsuite/gcc.target/arm/cmse/baseline/cmse-13.c: New. * gcc/testsuite/gcc.target/arm/cmse/baseline/cmse-6.c: New. diff --git a/gcc/testsuite/gcc.target/arm/cmse/cmse-1.c b/gcc/testsuite/gcc.target/arm/cmse/cmse-1.c index 1c3d4e9e934..ccecf396d3c 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/cmse-1.c +++ b/gcc/testsuite/gcc.target/arm/cmse/cmse-1.c @@ -66,3 +66,32 @@ int foo (char * p) /* { dg-final { scan-assembler-times "ttat " 2 } } */ /* { dg-final { scan-assembler-times "bl.cmse_check_address_range" 7 } } */ /* { dg-final { scan-assembler-not "cmse_check_pointed_object" } } */ + +typedef int (*int_ret_funcptr_t) (void); +typedef int __attribute__ ((cmse_nonsecure_call)) (*int_ret_nsfuncptr_t) (void); + +int __attribute__ ((cmse_nonsecure_entry)) +baz (void) +{ + return cmse_nonsecure_caller (); +} + +int __attribute__ ((cmse_nonsecure_entry)) +qux (int_ret_funcptr_t int_ret_funcptr) +{ + int_ret_nsfuncptr_t int_ret_nsfunc_ptr; + + if (cmse_is_nsfptr (int_ret_funcptr)) + { + int_ret_nsfunc_ptr = cmse_nsfptr_create (int_ret_funcptr); + return int_ret_nsfunc_ptr (); + } + return 0; +} +/* { dg-final { scan-assembler "baz:" } } */ +/* { dg-final { scan-assembler "__acle_se_baz:" } } */ +/* { dg-final { scan-assembler-not "\tcmse_nonsecure_caller" } } */ +/* { dg-final { scan-rtl-dump "and.*reg.*const_int 1" expand } } */ +/* { dg-final { scan-assembler "bic" } } */ +/* { dg-final { scan-assembler "push\t\{r4, r5, r6" } } */ +/* { dg-final { scan-assembler "msr\tAPSR_nzcvq" } } */ |