Alexandre Oliva <ol...@adacore.com> writes:
> VxWorks uses x18 as the TCB, so STATIC_CHAIN_REGNUM has long been set
> (in gcc/config/aarch64/aarch64-vxworks.h) to use x9 instead.
>
> This patch marks x18 as fixed on TARGET_VXWORKS, so that it is not
> chosen by the register allocator, and adjusts tests that depend on x18
> or on the static chain register.
>
> Tested (with gcc-14) on aarch64-vxworks7r2.  Ok to install?
>
>
> for  gcc/ChangeLog
>
>       * config/aarch64/aarch64.c (aarch64_conditional_register_usage):
>       Mark x18 as fixed on VxWorks.
>
> for  gcc/testsuite/ChangeLog
>
>       * gcc.dg/cwsc1.c (CHAIN, aarch64): x9 instead x18 for __vxworks.
>       * gcc.target/aarch64/reg-alloc-4.c: Drop x18-assigned asm
>       operand on vxworks.
>       * gcc.target/aarch64/shadow_call_stack_1.c: Don't expect
>       -ffixed-x18 error on vxworks.
> ---
>  gcc/config/aarch64/aarch64.cc                      |    8 ++++++++
>  gcc/testsuite/gcc.dg/cwsc1.c                       |    6 +++++-
>  gcc/testsuite/gcc.target/aarch64/reg-alloc-4.c     |    2 ++
>  .../gcc.target/aarch64/shadow_call_stack_1.c       |    3 ++-
>  4 files changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
> index 1da615c8955a4..3657ee9579df0 100644
> --- a/gcc/config/aarch64/aarch64.cc
> +++ b/gcc/config/aarch64/aarch64.cc
> @@ -22039,6 +22039,14 @@ aarch64_conditional_register_usage (void)
>        fixed_regs[SPECULATION_SCRATCH_REGNUM] = 1;
>        call_used_regs[SPECULATION_SCRATCH_REGNUM] = 1;
>      }
> +
> +#ifdef TARGET_VXWORKS
> +  /* R18 is the STATIC_CHAIN_REGNUM on most aarch64 ports, but VxWorks
> +     uses it as the TCB, so aarch64-vxworks.h overrides
> +     STATIC_CHAIN_REGNUM, and here we mark R18 as fixed.  */
> +  fixed_regs[R18_REGNUM] = 1;
> +  call_used_regs[R18_REGNUM] = 1;
> +#endif
>  }
>  
>  /* Implement TARGET_MEMBER_TYPE_FORCES_BLK.  */
> diff --git a/gcc/testsuite/gcc.dg/cwsc1.c b/gcc/testsuite/gcc.dg/cwsc1.c
> index e793e26116af4..cccf4139c35b5 100644
> --- a/gcc/testsuite/gcc.dg/cwsc1.c
> +++ b/gcc/testsuite/gcc.dg/cwsc1.c
> @@ -6,7 +6,11 @@
>  #elif defined(__i386__)
>  # define CHAIN  "%ecx"
>  #elif defined(__aarch64__)
> -# define CHAIN  "x18"
> +# if defined __vxworks
> +#  define CHAIN "x9"
> +# else
> +#  define CHAIN  "x18"
> +# endif
>  #elif defined(__alpha__)
>  # define CHAIN  "$1"
>  #elif defined(__arm__)
> diff --git a/gcc/testsuite/gcc.target/aarch64/reg-alloc-4.c 
> b/gcc/testsuite/gcc.target/aarch64/reg-alloc-4.c
> index ceb6f50de2dc3..0576dc27eb072 100644
> --- a/gcc/testsuite/gcc.target/aarch64/reg-alloc-4.c
> +++ b/gcc/testsuite/gcc.target/aarch64/reg-alloc-4.c
> @@ -61,7 +61,9 @@ foo (volatile struct L *head, int inc)
>                       "r" (inner->next),      /* x15 */
>                       "r" (inner->next),      /* x16 */
>                       "r" (inner->next),      /* x17 */
> +#ifndef __vxworks /* x18 is a fixed register on VxWorks, used for the TCB.  
> */
>                       "r" (inner->next),      /* x18 */
> +#endif
>                       "r" (inner->next) :     /* x30 */
>                       "x19", "x20", "x21", "x22", "x23",
>                       "x24", "x25", "x26", "x27", "x28");

The changes above are ok, thanks.

> diff --git a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_1.c 
> b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_1.c
> index ab68d6e848252..c7c230fc194e8 100644
> --- a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_1.c
> +++ b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_1.c
> @@ -3,4 +3,5 @@
>  
>  int i;
>  
> -/* { dg-error "'-fsanitize=shadow-call-stack' requires '-ffixed-x18'" "" 
> {target "aarch64*-*-*" } 0 } */
> +/* aarch64-*-vxworks has x18 as a fixed register.  */
> +/* { dg-error "'-fsanitize=shadow-call-stack' requires '-ffixed-x18'" "" { 
> target { aarch64*-*-* && { ! aarch64-*-vxworks* } } } 0 } */

I think this one shows a deeper issue, though.  -fsanitize=shadow-call-stack
is currently hardcoded to use x18:

;; Save X30 in the X18-based POST_INC stack (consistent with clang).
(define_expand "scs_push"
  [(set (mem:DI (post_inc:DI (reg:DI R18_REGNUM)))
        (reg:DI R30_REGNUM))])

;; Load X30 form the X18-based PRE_DEC stack (consistent with clang).
(define_expand "scs_pop"
  [(set (reg:DI R30_REGNUM)
        (mem:DI (pre_dec:DI (reg:DI R18_REGNUM))))])

and I assume this usage will be incompatible with the TCB usage.

So I think instead we should emit a sorry() if -fsanitize=shadow-call-stack
is used on VxWorks.

Thanks,
Richard

Reply via email to