aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Vieira <andre.simoesdiasvieira@arm.com>2016-03-30 17:53:38 +0000
committerThomas Preud'homme <thomas.preudhomme@arm.com>2016-03-30 17:53:38 +0000
commit58fda5e246364e93e1269572cfbb7bbda07c0a3e (patch)
tree71deb1122d1510503df62fd2e7fc6421571d9f5e
parentdcd99fd51c08e6e8126e99270ec455f1fea02f83 (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.arm10
-rw-r--r--gcc/config/arm/arm-builtins.c25
-rw-r--r--gcc/testsuite/ChangeLog.arm5
-rw-r--r--gcc/testsuite/gcc.target/arm/cmse/cmse-1.c29
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" } } */