]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
sh.md (symPLT_label2reg): Force the initialization of the PIC register.
authorAlexandre Oliva <aoliva@redhat.com>
Thu, 7 Sep 2000 04:10:27 +0000 (04:10 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Thu, 7 Sep 2000 04:10:27 +0000 (04:10 +0000)
* config/sh/sh.md (symPLT_label2reg): Force the initialization of
the PIC register.

From-SVN: r36225

gcc/ChangeLog
gcc/config/sh/sh.md

index 1b75381133686bdec8a0c71d0f060139f5fe0ccd..3f090881a40fdd01d9255b538eb9a221990d2c36 100644 (file)
@@ -1,3 +1,8 @@
+2000-09-07  Alexandre Oliva  <aoliva@redhat.com>
+
+       * config/sh/sh.md (symPLT_label2reg): Force the initialization of
+       the PIC register.
+
 2000-09-06  H.J. Lu  (hjl@gnu.org)
 
        * Makefile.in (clean_s1): Depend on stage_b.
index 9ac6436d189be6940ab602822c983e10beab69c5..88a774338b05842f12adf9e4473c02fcdd8b864a 100644 (file)
@@ -3531,8 +3531,24 @@ else
                (plus:SI (pc)
                         (unspec [(match_operand:SI 1 "" "")] 9))
                (const (plus:SI (label_ref (match_operand:SI 2 "" ""))
-                               (const_int 2))))))]
-  "" "")
+                               (const_int 2))))))
+   (use (match_dup 2))]
+  ;; Even though the PIC register is not really used by the call
+  ;; sequence in which this is expanded, the PLT code assumes the PIC
+  ;; register is set, so we must not skip its initialization.  Since
+  ;; we only use this expand as part of calling sequences, and never
+  ;; to take the address of a function, this is the best point to
+  ;; insert the (use).  Using the PLT to take the address of a
+  ;; function would be wrong, not only because the PLT entry could
+  ;; then be called from a function that doesn't initialize the PIC
+  ;; register to the proper GOT, but also because pointers to the same
+  ;; function might not compare equal, should they be set by different
+  ;; shared libraries.
+  "" "
+{
+  operands[2] = pic_offset_table_rtx;
+  current_function_uses_pic_offset_table = 1;
+}")
 
 ;; case instruction for switch statements.