https://gcc.gnu.org/g:a4f45de95eed90e3d166bb706bb883e3a6cda0bd

commit r16-826-ga4f45de95eed90e3d166bb706bb883e3a6cda0bd
Author: Alexandre Oliva <ol...@adacore.com>
Date:   Thu May 22 15:06:24 2025 -0300

    iesFrom: Alexandre Oliva <ol...@adacore.com>
    
    [aarch64] [vxworks] mark x18 as fixed, adjust tests
    
    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 if the newly-introduced
    TARGET_OS_USES_R18 is defined, so that it is not chosen by the
    register allocator, rejects -fsanitize-shadow-call-stack due to the
    register conflict, and adjusts tests that depend on x18 or on the
    static chain register.
    
    
    for  gcc/ChangeLog
    
            * config/aarch64/aarch64-vxworks.h (TARGET_OS_USES_R18): Define.
            Update comments.
            * config/aarch64/aarch64.cc (aarch64_conditional_register_usage):
            Mark x18 as fixed on VxWorks.
            (aarch64_override_options_internal): Issue sorry message on
            -fsanitize=shadow-call-stack if TARGET_OS_USES_R18.
    
    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, but rather the sorry message.
            * gcc.target/aarch64/shadow_call_stack_2.c: Skip on vxworks.
            * gcc.target/aarch64/shadow_call_stack_3.c: Likewise.
            * gcc.target/aarch64/shadow_call_stack_4.c: Likewise.
            * gcc.target/aarch64/shadow_call_stack_5.c: Likewise.
            * gcc.target/aarch64/shadow_call_stack_6.c: Likewise.
            * gcc.target/aarch64/shadow_call_stack_7.c: Likewise.
            * gcc.target/aarch64/shadow_call_stack_8.c: Likewise.
            * gcc.target/aarch64/stack-check-prologue-19.c: Likewise.
            * gcc.target/aarch64/stack-check-prologue-20.c: Likewise.

Diff:
---
 gcc/config/aarch64/aarch64-vxworks.h                |  7 +++----
 gcc/config/aarch64/aarch64.cc                       | 21 ++++++++++++++++++---
 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        |  4 +++-
 .../gcc.target/aarch64/shadow_call_stack_2.c        |  1 +
 .../gcc.target/aarch64/shadow_call_stack_3.c        |  1 +
 .../gcc.target/aarch64/shadow_call_stack_4.c        |  1 +
 .../gcc.target/aarch64/shadow_call_stack_5.c        |  1 +
 .../gcc.target/aarch64/shadow_call_stack_6.c        |  1 +
 .../gcc.target/aarch64/shadow_call_stack_7.c        |  1 +
 .../gcc.target/aarch64/shadow_call_stack_8.c        |  1 +
 .../gcc.target/aarch64/stack-check-prologue-19.c    |  1 +
 .../gcc.target/aarch64/stack-check-prologue-20.c    |  1 +
 14 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/gcc/config/aarch64/aarch64-vxworks.h 
b/gcc/config/aarch64/aarch64-vxworks.h
index 41adada9b1de..7b4da934b608 100644
--- a/gcc/config/aarch64/aarch64-vxworks.h
+++ b/gcc/config/aarch64/aarch64-vxworks.h
@@ -66,9 +66,8 @@ along with GCC; see the file COPYING3.  If not see
 #define VXWORKS_PERSONALITY "llvm"
 
 /* VxWorks uses R18 as a TCB pointer.  We must pick something else as
-   the static chain and R18 needs to be claimed "fixed".  Until we
-   arrange to override the common parts of the port family to
-   acknowledge the latter, configure --with-specs="-ffixed-r18".  */
+   the static chain and R18 needs to be claimed "fixed" (TARGET_OS_USES_R18
+   does that in aarch64_conditional_register_usage).  */
 #undef  STATIC_CHAIN_REGNUM
 #define STATIC_CHAIN_REGNUM 9
-
+#define TARGET_OS_USES_R18
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index ecb0bac2e550..1fa3ec522c3a 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -18826,9 +18826,16 @@ aarch64_override_options_internal (struct gcc_options 
*opts)
       aarch64_stack_protector_guard_offset = offs;
     }
 
-  if ((flag_sanitize & SANITIZE_SHADOW_CALL_STACK)
-      && !fixed_regs[R18_REGNUM])
-    error ("%<-fsanitize=shadow-call-stack%> requires %<-ffixed-x18%>");
+  if ((flag_sanitize & SANITIZE_SHADOW_CALL_STACK))
+    {
+      if (!fixed_regs[R18_REGNUM])
+       error ("%<-fsanitize=shadow-call-stack%> requires %<-ffixed-x18%>");
+#ifdef TARGET_OS_USES_R18
+      else
+       sorry ("%<-fsanitize=shadow-call-stack%> conflicts with the use of"
+              " register x18 by the target operating system");
+#endif
+    }
 
   aarch64_feature_flags isa_flags = aarch64_get_isa_flags (opts);
   if ((isa_flags & (AARCH64_FL_SM_ON | AARCH64_FL_ZA_ON))
@@ -22046,6 +22053,14 @@ aarch64_conditional_register_usage (void)
       fixed_regs[SPECULATION_SCRATCH_REGNUM] = 1;
       call_used_regs[SPECULATION_SCRATCH_REGNUM] = 1;
     }
+
+#ifdef TARGET_OS_USES_R18
+  /* 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 e793e26116af..cccf4139c35b 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 ceb6f50de2dc..0576dc27eb07 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");
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 ab68d6e84825..fb19bd4ecb4f 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,6 @@
 
 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 } */
+/* { dg-message "sorry, unimplemented: '-fsanitize=shadow-call-stack' 
conflicts with the use of register x18" "" { target { aarch64-*-vxworks* } } 0 
} */
diff --git a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_2.c 
b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_2.c
index b5139a245597..2c381cd79629 100644
--- a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_2.c
+++ b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_2.c
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-fsanitize=shadow-call-stack -ffixed-x18 -fexceptions" } */
+/* { dg-skip-if "conflicts with x18" { aarch64-*-vxworks* } } */
 
 int i;
 
diff --git a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_3.c 
b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_3.c
index b88e490f3ae7..95d41e722a00 100644
--- a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_3.c
+++ b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_3.c
@@ -3,6 +3,7 @@
 /* scs_pop: ldr x30, [x18, #-8]! */
 /* { dg-do compile } */
 /* { dg-options "-O2 -fsanitize=shadow-call-stack -ffixed-x18 -fno-exceptions" 
} */
+/* { dg-skip-if "conflicts with x18" { aarch64-*-vxworks* } } */
 
 int foo (int);
 
diff --git a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_4.c 
b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_4.c
index f63169340e12..1e84ab630f98 100644
--- a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_4.c
+++ b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_4.c
@@ -3,6 +3,7 @@
 /* scs_pop: ldr x30, [x18, #-8]! */
 /* { dg-do compile } */
 /* { dg-options "-O2 -fno-omit-frame-pointer -fsanitize=shadow-call-stack 
-ffixed-x18 -fno-exceptions" } */
+/* { dg-skip-if "conflicts with x18" { aarch64-*-vxworks* } } */
 
 int foo (int);
 
diff --git a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_5.c 
b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_5.c
index d7f82984ff53..e76de4796f93 100644
--- a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_5.c
+++ b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_5.c
@@ -8,6 +8,7 @@
 
 /* { dg-do compile } */
 /* { dg-options "-O2 -fno-omit-frame-pointer -fsanitize=shadow-call-stack 
-fno-exceptions -ffixed-x18 --save-temps -fno-stack-protector" } */
+/* { dg-skip-if "conflicts with x18" { aarch64-*-vxworks* } } */
 
 #include "test_frame_common.h"
 
diff --git a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_6.c 
b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_6.c
index 8d088aecc202..35093757f7c6 100644
--- a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_6.c
+++ b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_6.c
@@ -8,6 +8,7 @@
 
 /* { dg-do compile } */
 /* { dg-options "-O2 -fomit-frame-pointer -fsanitize=shadow-call-stack 
-fno-exceptions -ffixed-x18 --save-temps -fno-stack-protector" } */
+/* { dg-skip-if "conflicts with x18" { aarch64-*-vxworks* } } */
 
 #include "test_frame_common.h"
 
diff --git a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_7.c 
b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_7.c
index a2f376e0091c..9ddd71a203a7 100644
--- a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_7.c
+++ b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_7.c
@@ -8,6 +8,7 @@
 
 /* { dg-do compile } */
 /* { dg-options "-O2 -fomit-frame-pointer -fsanitize=shadow-call-stack 
-fno-exceptions -ffixed-x18 --save-temps -fno-stack-protector" } */
+/* { dg-skip-if "conflicts with x18" { aarch64-*-vxworks* } } */
 
 #include "test_frame_common.h"
 
diff --git a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_8.c 
b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_8.c
index 5162cbb39175..be8d8166ddab 100644
--- a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_8.c
+++ b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_8.c
@@ -10,6 +10,7 @@
 
 /* { dg-do compile } */
 /* { dg-options "-O0 -fomit-frame-pointer -fsanitize=shadow-call-stack 
-fno-exceptions -ffixed-x18 --save-temps -fno-stack-protector" } */
+/* { dg-skip-if "conflicts with x18" { aarch64-*-vxworks* } } */
 
 int func1 (void)
 {
diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c 
b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c
index 38eab4d36ab2..49dc51142e6e 100644
--- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c
+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c
@@ -1,4 +1,5 @@
 /* { dg-options "-O2 -fstack-clash-protection -fomit-frame-pointer --param 
stack-clash-protection-guard-size=12 -fsanitize=shadow-call-stack -ffixed-x18 
-fno-stack-protector" } */
+/* { dg-skip-if "conflicts with x18" { aarch64-*-vxworks* } } */
 /* { dg-final { check-function-bodies "**" "" } } */
 
 void f(int, ...);
diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-20.c 
b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-20.c
index 690aae8dfd5b..35b8ccc99e44 100644
--- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-20.c
+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-20.c
@@ -1,3 +1,4 @@
 /* { dg-options "-O2 -fstack-protector-all -fstack-clash-protection 
-fomit-frame-pointer --param stack-clash-protection-guard-size=12 
-fsanitize=shadow-call-stack -ffixed-x18" } */
+/* { dg-skip-if "conflicts with x18" { aarch64-*-vxworks* } } */
 
 #include "stack-check-prologue-19.c"

Reply via email to