I will be starting to put out the patches to enable pc-relative support for a
future machine on the PowerPC.

Until those patches are approved and committed, we need to change the defaults
for the target so that pc-relative isn't default.  Right now, we have the parts
of the compiler that does calls, etc. able to generate the appropriate
pc-relative calls, but the addressing modes still use the TOC calls.
Unfortunately, this means the TOC register is not properly set up in the
prologue.

I have tested these patches and the don't generate any test suite regressions.
I have visually inspected the code to make sure the calls are using the TOC abi
instead of the pc-relative.  I did fix the few tests for pc-relative support to
add the necessary flags (-mpcrel) or GCC target pragma options (pcrel and
no-pcrel).  In addition, I made the -mpcrel and -mprefixed-addr options behave
like other options (i.e. if you do -mpcrel, it also enables -mcpu=target and
-mprefixed-addr).

Can I check these patches into the trunk?

[gcc]
2019-06-06  Michael Meissner  <meiss...@linux.ibm.com>

        * config/rs6000/rs6000-cpus.def (ISA_FUTURE_MASKS_SERVER): Delete
        enabling -mprefixed-addr and -mpcrel by default.
        * config/rs6000/rs6000.c (rs6000_option_override_internal): Make
        -mpcrel and -mprefixed-addr act like other swtiches (i.e. using
        -mpcrel automatically sets -mcpu=future and -mprefixed-addr, and
        -mprefixed-addr automatically sets just -mcpu=future).  Clean up
        some thinkos in reporting errors for -mpcrel and -mprefixed-addr.

[gcc/testsuite]
2019-06-06  Michael Meissner  <meiss...@linux.ibm.com>

        * gcc.target/powerpc/localentry-1.c: Add -mpcrel option.
        * gcc.target/powerpc/localentry-detect-1.c: Explicitly set and
        unset -mpcrel in the target pragmas.
        * gcc.target/powerpc/notoc-direct-1.c: Add -mpcrel option.
        * gcc.target/powerpc/pcrel-sibcall-1.c: Explicitly set and
        unset -mpcrel in the target pragmas.

Index: gcc/config/rs6000/rs6000-cpus.def
===================================================================
--- gcc/config/rs6000/rs6000-cpus.def   (revision 272004)
+++ gcc/config/rs6000/rs6000-cpus.def   (working copy)
@@ -77,9 +77,7 @@
 
 /* Support for a future processor's features.  */
 #define ISA_FUTURE_MASKS_SERVER        (ISA_3_0_MASKS_SERVER                   
\
-                                | OPTION_MASK_FUTURE                   \
-                                | OPTION_MASK_PCREL                    \
-                                | OPTION_MASK_PREFIXED_ADDR)
+                                | OPTION_MASK_FUTURE)                  \
 
 /* Flags that need to be turned off if -mno-future.  */
 #define OTHER_FUTURE_MASKS     (OPTION_MASK_PCREL                      \
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c  (revision 272004)
+++ gcc/config/rs6000/rs6000.c  (working copy)
@@ -3896,8 +3896,15 @@ rs6000_option_override_internal (bool gl
   ignore_masks = rs6000_disable_incompatible_switches ();
 
   /* For the newer switches (vsx, dfp, etc.) set some of the older options,
-     unless the user explicitly used the -mno-<option> to disable the code.  */
-  if (TARGET_P9_VECTOR || TARGET_MODULO || TARGET_P9_MISC)
+     unless the user explicitly used the -mno-<option> to disable the code.  At
+     present -mfuture does not enable prefixed address or pc-relative support,
+     so if those are specified, enable the necessary additional bits.  */
+  if (TARGET_PCREL)
+    rs6000_isa_flags |= ((ISA_FUTURE_MASKS_SERVER
+                         | OPTION_MASK_PREFIXED_ADDR) & ~ignore_masks);
+  else if (TARGET_PREFIXED_ADDR)
+    rs6000_isa_flags |= (ISA_FUTURE_MASKS_SERVER & ~ignore_masks);
+  else if (TARGET_P9_VECTOR || TARGET_MODULO || TARGET_P9_MISC)
     rs6000_isa_flags |= (ISA_3_0_MASKS_SERVER & ~ignore_masks);
   else if (TARGET_P9_MINMAX)
     {
@@ -4248,7 +4255,7 @@ rs6000_option_override_internal (bool gl
   /* -mpcrel requires prefixed load/store addressing.  */
   if (TARGET_PCREL && !TARGET_PREFIXED_ADDR)
     {
-      if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0)
+      if ((rs6000_isa_flags_explicit & OPTION_MASK_PREFIXED_ADDR) != 0)
        error ("%qs requires %qs", "-mpcrel", "-mprefixed-addr");
 
       rs6000_isa_flags &= ~OPTION_MASK_PCREL;
@@ -4257,7 +4264,7 @@ rs6000_option_override_internal (bool gl
   /* -mprefixed-addr (and hence -mpcrel) requires -mcpu=future.  */
   if (TARGET_PREFIXED_ADDR && !TARGET_FUTURE)
     {
-      if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0)
+      if ((rs6000_isa_flags_explicit & OPTION_MASK_FUTURE) != 0)
        error ("%qs requires %qs", "-mprefixed-addr", "-mcpu=future");
 
       rs6000_isa_flags &= ~(OPTION_MASK_PCREL | OPTION_MASK_PREFIXED_ADDR);
Index: gcc/testsuite/gcc.target/powerpc/localentry-1.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/localentry-1.c     (revision 272004)
+++ gcc/testsuite/gcc.target/powerpc/localentry-1.c     (working copy)
@@ -1,10 +1,11 @@
 /* { dg-do compile } */
-/* { dg-options "-mdejagnu-cpu=future -O2" } */
+/* { dg-options "-mdejagnu-cpu=future -O2 -mpcrel" } */
 /* { dg-require-effective-target powerpc_elfv2 } */
 /* { dg-require-effective-target powerpc_future_ok } */
 
-/* Ensure we generate ".localentry fn,1" for both leaf and non-leaf
-   functions.  */
+/* Ensure we generate ".localentry fn,1" for both leaf and non-leaf functions.
+   At present, -mcpu=future does not enable pc-relative mode, so make sure we
+   enable it to be able to check for .localentry.  */
 
 extern int y (int);
 
Index: gcc/testsuite/gcc.target/powerpc/localentry-detect-1.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/localentry-detect-1.c      (revision 
272004)
+++ gcc/testsuite/gcc.target/powerpc/localentry-detect-1.c      (working copy)
@@ -3,10 +3,12 @@
 /* { dg-require-effective-target powerpc_future_ok } */
 /* { dg-options "-O2 -mdejagnu-cpu=future" } */
 
-
+/* At present, -mcpu=future does not enable pc-relative mode.  Enable it here
+   explicitly until it is turned on by default.  */
+#pragma GCC target ("cpu=future,pcrel")
 int localentry1 () { return 5; }
 
-#pragma GCC target ("cpu=power9")
+#pragma GCC target ("cpu=power9,no-pcrel")
 int localentry2 () { return 5; }
 
 /* { dg-final { scan-assembler {\.localentry\tlocalentry1,1\M} } } */
Index: gcc/testsuite/gcc.target/powerpc/notoc-direct-1.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/notoc-direct-1.c   (revision 272004)
+++ gcc/testsuite/gcc.target/powerpc/notoc-direct-1.c   (working copy)
@@ -1,10 +1,11 @@
 /* { dg-do compile } */
-/* { dg-options "-mdejagnu-cpu=future -O2" } */
+/* { dg-options "-mdejagnu-cpu=future -O2 -mpcrel" } */
 /* { dg-require-effective-target powerpc_elfv2 } */
 /* { dg-require-effective-target powerpc_future_ok } */
 
-/* Test that calls generated from PC-relative code are
-   annotated with @notoc.  */
+/* Test that calls generated from PC-relative code are annotated with @notoc.
+   At present, -mcpu=future does not enable pc-relative mode.  Enable it here
+   explicitly until it is turned on by default.  */
 
 extern int yy0 (int);
 extern void yy1 (int);
Index: gcc/testsuite/gcc.target/powerpc/pcrel-sibcall-1.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/pcrel-sibcall-1.c  (revision 272004)
+++ gcc/testsuite/gcc.target/powerpc/pcrel-sibcall-1.c  (working copy)
@@ -3,9 +3,12 @@
 /* { dg-require-effective-target powerpc_elfv2 } */
 /* { dg-require-effective-target powerpc_future_ok } */
 
-/* Test that potential sibcalls are not generated when the caller preserves
-   the TOC and the callee doesn't, or vice versa.  */
+/* Test that potential sibcalls are not generated when the caller preserves the
+   TOC and the callee doesn't, or vice versa.  At present, -mcpu=future does
+   not enable pc-relative mode.  Enable it here explicitly until it is turned
+   on by default.  */
 
+#pragma GCC target ("cpu=future,pcrel")
 int x (void) __attribute__((noinline));
 int y (void) __attribute__((noinline));
 int xx (void) __attribute__((noinline));
@@ -25,7 +28,7 @@ int sib_call (void)
   return x ();
 }
 
-#pragma GCC target ("cpu=power9")
+#pragma GCC target ("cpu=power9,no-pcrel")
 int normal_call (void)
 {
   return y ();
@@ -36,7 +39,7 @@ int xx (void)
   return 1;
 }
 
-#pragma GCC target ("cpu=future")
+#pragma GCC target ("cpu=future,pcrel")
 int notoc_call (void)
 {
   return xx ();

-- 
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meiss...@linux.ibm.com, phone: +1 (978) 899-4797

Reply via email to