Fix mips-sgi-irix5.2 eh25 g++ testsuite failure.
authorJim Wilson <wilson@cygnus.com>
Fri, 5 Sep 1997 02:36:53 +0000 (02:36 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Fri, 5 Sep 1997 02:36:53 +0000 (19:36 -0700)
* mips.md (nonlocal_goto_receiver): Define.

From-SVN: r15091

gcc/ChangeLog
gcc/config/mips/mips.md

index 039e40816933fd7f37aecf0dfac7c1270583b4af..9bea4de7d7d7590bad1bc19819105288ef711e18 100644 (file)
@@ -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.
 
index 770a91c97a3566deeb2c6cfaec1311dbf5c4c11a..8bc70b770d8ee0af81e7507c8072c02e35ee4a48 100644 (file)
@@ -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 ());
+}")
 \f
 ;;
 ;;  ....................