/* { dg-do compile } */
/* { dg-options "-mcmse" } */
+/* ARMv8-M expectation with target { ! arm_cmse_clear_ok }. */
+/* ARMv8.1-M expectation with target arm_cmse_clear_ok. */
+/* { dg-final { check-function-bodies "**" "" "" } } */
int __attribute__ ((cmse_nonsecure_call)) (*ns_foo) (void);
int (*s_bar) (void);
typedef int __attribute__ ((cmse_nonsecure_call)) (* ns_foo_ptr) (void);
typedef int (*s_bar_ptr) (void);
+/*
+** nonsecure0: { target arm_cmse_clear_ok }
+** ...
+** blxns r[0-3]
+** ...
+*/
+/*
+** nonsecure0: { target { ! arm_cmse_clear_ok } }
+** ...
+** bl __gnu_cmse_nonsecure_call
+** ...
+*/
int nonsecure0 (ns_foo_t * ns_foo_p)
{
return ns_foo_p ();
}
+/*
+** nonsecure1: { target arm_cmse_clear_ok }
+** ...
+** blxns r[0-3]
+** ...
+*/
+/*
+** nonsecure1: { target { ! arm_cmse_clear_ok } }
+** ...
+** bl __gnu_cmse_nonsecure_call
+** ...
+*/
int nonsecure1 (ns_foo_t ** ns_foo_p)
{
return (*ns_foo_p) ();
}
+/*
+** nonsecure2: { target arm_cmse_clear_ok }
+** ...
+** (
+** blxns r[0-3]
+** |
+** b nonsecure0
+** )
+** ...
+*/
+/*
+** nonsecure2: { target { ! arm_cmse_clear_ok } }
+** ...
+** (
+** bl __gnu_cmse_nonsecure_call
+** |
+** b nonsecure0
+** )
+** ...
+*/
int nonsecure2 (ns_foo_ptr ns_foo_p)
{
return ns_foo_p ();
}
+
+/*
+** nonsecure3: { target arm_cmse_clear_ok }
+** ...
+** blxns r[0-3]
+** ...
+*/
+/*
+** nonsecure3: { target { ! arm_cmse_clear_ok } }
+** ...
+** bl __gnu_cmse_nonsecure_call
+** ...
+*/
int nonsecure3 (ns_foo_ptr * ns_foo_p)
{
return (*ns_foo_p) ();
}
+/*
+** secure0:
+** ...
+** (
+** bx r[0-3]
+** |
+** blx r[0-3]
+** )
+** ...
+*/
int secure0 (s_bar_t * s_bar_p)
{
return s_bar_p ();
}
+/*
+** secure1:
+** ...
+** (
+** bx r[0-3]
+** |
+** blx r[0-3]
+** )
+** ...
+*/
int secure1 (s_bar_t ** s_bar_p)
{
return (*s_bar_p) ();
}
+/*
+** secure2:
+** ...
+** (
+** bx r[0-3]
+** |
+** blx r[0-3]
+** |
+** b secure0
+** )
+** ...
+*/
int secure2 (s_bar_ptr s_bar_p)
{
return s_bar_p ();
}
+/*
+** secure3:
+** ...
+** (
+** bx r[0-3]
+** |
+** blx r[0-3]
+** )
+** ...
+*/
int secure3 (s_bar_ptr * s_bar_p)
{
return (*s_bar_p) ();
}
+/*
+** nonsecure4: { target arm_cmse_clear_ok }
+** ...
+** blxns r[0-3]
+** ...
+*/
+/*
+** nonsecure4: { target { ! arm_cmse_clear_ok } }
+** ...
+** bl __gnu_cmse_nonsecure_call
+** ...
+*/
int nonsecure4 (void)
{
return ns_foo ();
}
+/*
+** nonsecure5: { target arm_cmse_clear_ok }
+** ...
+** blxns r[0-3]
+** ...
+*/
+/*
+** nonsecure5: { target { ! arm_cmse_clear_ok } }
+** ...
+** bl __gnu_cmse_nonsecure_call
+** ...
+*/
int nonsecure5 (void)
{
return (*ns_foo2) ();
}
+/*
+** secure4:
+** ...
+** (
+** bx r[0-3]
+** |
+** blx r[0-3]
+** )
+** ...
+*/
int secure4 (void)
{
return s_bar ();
}
+/*
+** secure5:
+** ...
+** (
+** bx r[0-3]
+** |
+** blx r[0-3]
+** )
+** ...
+*/
int secure5 (void)
{
return (*s_bar2) ();
}
-
-/* ARMv8-M expectation. */
-/* { dg-final { scan-assembler-times "bl\\s+__gnu_cmse_nonsecure_call" 6 { target { ! arm_cmse_clear_ok } } } } */
-
-/* ARMv8.1-M expectation. */
-/* { dg-final { scan-assembler-times "blxns" 6 { target arm_cmse_clear_ok } } } */