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