Commit 8b5bc7d1 by Christophe Lyon

[testsuite][arm] Fix cmse-15.c expected output

The cmse-15.c testcase fails at -Os because ICF means that we
generate
nonsecure2:
        b       nonsecure0

which is OK, but does not match the currently expected
nonsecure2:
...
        bl      __gnu_cmse_nonsecure_call

(see https://gcc.gnu.org/pipermail/gcc-patches/2020-April/543190.html)

The test has already different expectations for v8-M and v8.1-M.

This patch uses check-function-bodies to account for the
different possibilities:
- v8-M vs v8.1-M via different target selectors where needed
- code generation variants (-0?) via multiple regexps

I've tested that the test now passes with --target-board=-march=armv8-m.main
and --target-board=-march=armv8.1-m.main.
parent 93674a72
2020-04-09 Christophe Lyon <christophe.lyon@linaro.org> 2020-04-09 Christophe Lyon <christophe.lyon@linaro.org>
* gcc.target/arm/cmse/cmse-15.c: Use check-function-bodies.
2020-04-09 Christophe Lyon <christophe.lyon@linaro.org>
* lib/scanasm.exp (check-function-bodies): Use non-greedy regexp * lib/scanasm.exp (check-function-bodies): Use non-greedy regexp
when extracting the target selector. when extracting the target selector.
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-mcmse" } */ /* { 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 __attribute__ ((cmse_nonsecure_call)) (*ns_foo) (void);
int (*s_bar) (void); int (*s_bar) (void);
...@@ -11,67 +14,204 @@ typedef int s_bar_t (void); ...@@ -11,67 +14,204 @@ typedef int s_bar_t (void);
typedef int __attribute__ ((cmse_nonsecure_call)) (* ns_foo_ptr) (void); typedef int __attribute__ ((cmse_nonsecure_call)) (* ns_foo_ptr) (void);
typedef int (*s_bar_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) int nonsecure0 (ns_foo_t * ns_foo_p)
{ {
return 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) int nonsecure1 (ns_foo_t ** ns_foo_p)
{ {
return (*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) int nonsecure2 (ns_foo_ptr ns_foo_p)
{ {
return 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) int nonsecure3 (ns_foo_ptr * ns_foo_p)
{ {
return (*ns_foo_p) (); return (*ns_foo_p) ();
} }
/*
** secure0:
** ...
** (
** bx r[0-3]
** |
** blx r[0-3]
** )
** ...
*/
int secure0 (s_bar_t * s_bar_p) int secure0 (s_bar_t * s_bar_p)
{ {
return s_bar_p (); return s_bar_p ();
} }
/*
** secure1:
** ...
** (
** bx r[0-3]
** |
** blx r[0-3]
** )
** ...
*/
int secure1 (s_bar_t ** s_bar_p) int secure1 (s_bar_t ** s_bar_p)
{ {
return (*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) int secure2 (s_bar_ptr s_bar_p)
{ {
return s_bar_p (); return s_bar_p ();
} }
/*
** secure3:
** ...
** (
** bx r[0-3]
** |
** blx r[0-3]
** )
** ...
*/
int secure3 (s_bar_ptr * s_bar_p) int secure3 (s_bar_ptr * s_bar_p)
{ {
return (*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) int nonsecure4 (void)
{ {
return ns_foo (); 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) int nonsecure5 (void)
{ {
return (*ns_foo2) (); return (*ns_foo2) ();
} }
/*
** secure4:
** ...
** (
** bx r[0-3]
** |
** blx r[0-3]
** )
** ...
*/
int secure4 (void) int secure4 (void)
{ {
return s_bar (); return s_bar ();
} }
/*
** secure5:
** ...
** (
** bx r[0-3]
** |
** blx r[0-3]
** )
** ...
*/
int secure5 (void) int secure5 (void)
{ {
return (*s_bar2) (); 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 } } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment