Hello, The aarch64 "platform register" r18 is currently unconditionally used as a scratch register by gcc.
Working on a VxWorks port for this arch (that we plan to contribute soon), we discovered that VxWorks has an internal use of this register so it needs to be considered "fixed" for this port. Hence the attached patch proposal, which we have been using successfully for a while now. It just introduces a FIXED_R18 config macro, defaulted to 0, which an OS specific config file may redefine. Is this ok to commit ? Thanks in advance, With Kind Regards, Olivier 2018-03-18 Olivier Hainque <hain...@adacore.com> * config/aarch64/aarch64.h (FIXED_R18): New internal configuration macro, defaulted to 0. (FIXED_REGISTERS): Use it. (STATIC_CHAIN_REGNUM): Fallback to r11 instead of r18 if the latter is fixed.
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h index fa9af26..2e69a4d 100644 --- a/gcc/config/aarch64/aarch64.h +++ b/gcc/config/aarch64/aarch64.h @@ -284,11 +284,13 @@ extern unsigned aarch64_architecture_version; /* Standard register usage. */ +#define FIXED_R18 0 + /* 31 64-bit general purpose registers R0-R30: R30 LR (link register) R29 FP (frame pointer) R19-R28 Callee-saved registers - R18 The platform register; use as temporary register. + R18 The platform register; use as temporary register if !FIXED_R18. R17 IP1 The second intra-procedure-call temporary register (can be used by call veneers and PLT code); otherwise use as a temporary register @@ -324,7 +326,7 @@ extern unsigned aarch64_architecture_version; { \ 0, 0, 0, 0, 0, 0, 0, 0, /* R0 - R7 */ \ 0, 0, 0, 0, 0, 0, 0, 0, /* R8 - R15 */ \ - 0, 0, 0, 0, 0, 0, 0, 0, /* R16 - R23 */ \ + 0, 0, FIXED_R18, 0, 0, 0, 0, 0, /* R16 - R23 */ \ 0, 0, 0, 0, 0, 1, 0, 1, /* R24 - R30, SP */ \ 0, 0, 0, 0, 0, 0, 0, 0, /* V0 - V7 */ \ 0, 0, 0, 0, 0, 0, 0, 0, /* V8 - V15 */ \ @@ -419,7 +421,7 @@ extern unsigned aarch64_architecture_version; uses alloca. */ #define EXIT_IGNORE_STACK (cfun->calls_alloca) -#define STATIC_CHAIN_REGNUM R18_REGNUM +#define STATIC_CHAIN_REGNUM (!(FIXED_R18) ? R18_REGNUM : R11_REGNUM) #define HARD_FRAME_POINTER_REGNUM R29_REGNUM #define FRAME_POINTER_REGNUM SFP_REGNUM #define STACK_POINTER_REGNUM SP_REGNUM