aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@cygnus.com>1997-09-05 02:36:53 +0000
committerJim Wilson <wilson@gcc.gnu.org>1997-09-04 19:36:53 -0700
commitd5d1738a3a56748bc7c8c9f591d18d6bae469b6c (patch)
tree739c81643195564ca87208a8ab213e6f3113e429
parentf4da78811e4cfecc28779c94a861c305b6ac078d (diff)
downloadgcc-d5d1738a3a56748bc7c8c9f591d18d6bae469b6c.zip
gcc-d5d1738a3a56748bc7c8c9f591d18d6bae469b6c.tar.gz
gcc-d5d1738a3a56748bc7c8c9f591d18d6bae469b6c.tar.bz2
Fix mips-sgi-irix5.2 eh25 g++ testsuite failure.
* mips.md (nonlocal_goto_receiver): Define. From-SVN: r15091
-rw-r--r--gcc/ChangeLog2
-rw-r--r--gcc/config/mips/mips.md18
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 039e408..9bea4de 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,7 @@
Thu Sep 4 15:02:27 1997 Jim Wilson <wilson@cygnus.com>
+ * mips.md (nonlocal_goto_receiver): Define.
+
* profile.c (output_arc_profiler): Check next_insert_after for non
NULL before deferencing it.
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
index 770a91c..8bc70b7 100644
--- a/gcc/config/mips/mips.md
+++ b/gcc/config/mips/mips.md
@@ -6392,6 +6392,24 @@ move\\t%0,%z4\\n\\
(set_attr "mode" "none")
(set_attr "length" "6")])
+;; ??? This is a hack to work around a problem with expand_builtin_setjmp.
+;; It restores the frame pointer, and then does a call to restore the global
+;; pointer (gp) register. The call insn implicitly (via the assembler) reloads
+;; gp from the stack. However, call insns do not depend on $fp, so it is
+;; possible for the instruction scheduler to move the fp restore after the
+;; call, which then causes gp to be corrupted. We fix this by emitting a
+;; scheduler barrier. A better fix is to put code here that restores the
+;; $gp, and then the call is unnecessary. This is only a problem when PIC
+;; (TARGET_ABICALLS), and only when the gp register is caller-saved
+;; (irix5/o32, but not irix6/n32/n64).
+
+(define_expand "nonlocal_goto_receiver"
+ [(const_int 0)]
+ ""
+ "
+{
+ emit_insn (gen_blockage ());
+}")
;;
;; ....................