diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2000-09-07 04:10:27 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2000-09-07 04:10:27 +0000 |
commit | 71105114a1bc36d9d94a60136973fdce95b16b94 (patch) | |
tree | 01a8989f1c27a088d82a8bcdcf3a8b6c682f8df8 | |
parent | 3a0d3e1e7588053e0a7fb71f11956dd49ffdf4cc (diff) | |
download | gcc-71105114a1bc36d9d94a60136973fdce95b16b94.zip gcc-71105114a1bc36d9d94a60136973fdce95b16b94.tar.gz gcc-71105114a1bc36d9d94a60136973fdce95b16b94.tar.bz2 |
sh.md (symPLT_label2reg): Force the initialization of the PIC register.
* config/sh/sh.md (symPLT_label2reg): Force the initialization of
the PIC register.
From-SVN: r36225
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/sh/sh.md | 20 |
2 files changed, 23 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1b75381..3f09088 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index 9ac6436..88a7743 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -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. |