RISC-V: Disable -msave-restore for shared libraries.
authorJim Wilson <jimw@sifive.com>
Fri, 30 Aug 2019 23:32:52 +0000 (23:32 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Fri, 30 Aug 2019 23:32:52 +0000 (16:32 -0700)
This was noticed while trying to test -msave-restore support.  The
save/restore routines use the alternate return register t0/x5 which is
clobbered by the PLT header, so we can't use them in shared libraries.
This patch disables -msave-restore when -fpic (and -mplt), and emits a
warning if the user explicitly turned on -msave-restore.

gcc/
* config/riscv/riscv.c (riscv_option_override): If -msave-restore
and -fpic and -mplt then disable -msave-restore and warn.

From-SVN: r275231

gcc/ChangeLog
gcc/config/riscv/riscv.c

index 1a8026c..04e773a 100644 (file)
@@ -1,3 +1,8 @@
+2019-08-30  Jim Wilson  <jimw@sifive.com>
+
+       * config/riscv/riscv.c (riscv_option_override): If -msave-restore
+       and -fpic and -mplt then disable -msave-restore and warn.
+
 2019-08-30  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/91599
index 9b16a1e..1e7528f 100644 (file)
@@ -4636,6 +4636,16 @@ riscv_option_override (void)
     error ("%<-mriscv-attribute%> RISC-V ELF attribute requires GNU as 2.32"
           " [%<-mriscv-attribute%>]");
 #endif
+
+  /* The save-restore routines use t0 which is clobbered by the plt header,
+     so we can't use them when building shared libraries.  */
+  if (TARGET_SAVE_RESTORE && flag_pic && TARGET_PLT)
+    {
+      target_flags &= ~MASK_SAVE_RESTORE;
+      if (target_flags_explicit & MASK_SAVE_RESTORE)
+       warning (0, "%<-msave-restore%> disabled; not supported with PLT "
+                "based shared libraries");
+    }
 }
 
 /* Implement TARGET_CONDITIONAL_REGISTER_USAGE.  */