Alexandre Oliva <[email protected]> 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