2.95.3: Back out sjlj eh fixes

Bernd Schmidt bernds@cambridge.redhat.com
Mon Feb 19 05:57:00 GMT 2001


This patch backs out the sjlj exception handling fixes from the 2.95 branch.
This is unfortunate, since these patches are quite important, but they have
introduced too much instability.  There's no point in having 2.95.3 remain
in prerelease state indefinitely; and since I have been unable to track down
the problems on AIX so far, it's better to back out these patches now and
reintroduce them later.

These patches will be re-applied to the 2.95 branch after the release.  I
will try to make a 2.95.4 release that includes them.


Bernd

Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/egcs/gcc/ChangeLog,v
retrieving revision 1.3667.4.330
diff -u -p -r1.3667.4.330 ChangeLog
--- ChangeLog	2001/01/25 14:25:35	1.3667.4.330
+++ ChangeLog	2001/02/19 13:38:30
@@ -1,3 +1,14 @@
+2001-02-19  Bernd Schmidt  <bernds@redhat.co.uk>
+
+	Back out sjlj eh fixes.
+	* varasm.c (force_const_mem): Revert previous change.
+	* except.c (receive_exception_label, start_dynamic_handler):
+	Likewise.
+	* expr.c (expand_builtin_setjmp, expand_builtin_setjmp_setup,
+	expand_builtin_setjmp_receiver, expand_builtin): Likewise.
+	* expr.h (expand_builtin_setjmp, expand_builtin_setjmp_receiver):
+	Likewise.
+
 2001-01-25  Bernd Schmidt  <bernds@redhat.co.uk>

 	* version.c: Bump.
Index: except.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/except.c,v
retrieving revision 1.82.4.2
diff -u -p -r1.82.4.2 except.c
--- except.c	2000/12/29 16:18:54	1.82.4.2
+++ except.c	2001/02/19 13:38:31
@@ -723,42 +723,22 @@ static void
 receive_exception_label (handler_label)
      rtx handler_label;
 {
-  rtx around_label = NULL_RTX;
-
-  if (! flag_new_exceptions || exceptions_via_longjmp)
-    {
-      around_label = gen_label_rtx ();
-      emit_jump (around_label);
-      emit_barrier ();
-    }
-
   emit_label (handler_label);

-  if (! exceptions_via_longjmp)
-    {
 #ifdef HAVE_exception_receiver
-      if (HAVE_exception_receiver)
-       emit_insn (gen_exception_receiver ());
-      else
+  if (! exceptions_via_longjmp)
+    if (HAVE_exception_receiver)
+      emit_insn (gen_exception_receiver ());
 #endif
+
 #ifdef HAVE_nonlocal_goto_receiver
-      if (HAVE_nonlocal_goto_receiver)
-       emit_insn (gen_nonlocal_goto_receiver ());
-      else
-#endif
-       { /* Nothing */ }
-    }
-  else
-    {
-#ifndef DONT_USE_BUILTIN_SETJMP
-      expand_builtin_setjmp_receiver (handler_label);
+  if (! exceptions_via_longjmp)
+    if (HAVE_nonlocal_goto_receiver)
+      emit_insn (gen_nonlocal_goto_receiver ());
 #endif
-    }
-
-  if (around_label)
-    emit_label (around_label);
 }

+
 struct func_eh_entry
 {
   int range_number;   /* EH region number from EH NOTE insn's */
@@ -1340,7 +1320,7 @@ static void
 start_dynamic_handler ()
 {
   rtx dhc, dcc;
-  rtx arg, buf;
+  rtx x, arg, buf;
   int size;

 #ifndef DONT_USE_BUILTIN_SETJMP
@@ -1382,17 +1362,18 @@ start_dynamic_handler ()
   buf = plus_constant (XEXP (arg, 0), GET_MODE_SIZE (Pmode)*2);

 #ifdef DONT_USE_BUILTIN_SETJMP
+  x = emit_library_call_value (setjmp_libfunc, NULL_RTX, 1, SImode, 1,
+			       buf, Pmode);
+  /* If we come back here for a catch, transfer control to the handler.  */
+  jumpif_rtx (x, ehstack.top->entry->exception_handler_label);
+#else
   {
-    rtx x;
-    x = emit_library_call_value (setjmp_libfunc, NULL_RTX, LCT_CONST,
-                                TYPE_MODE (integer_type_node), 1,
-                                buf, Pmode);
-    /* If we come back here for a catch, transfer control to the handler.  */
-    jumpif_rtx (x, ehstack.top->entry->exception_handler_label);
+    /* A label to continue execution for the no exception case.  */
+    rtx noex = gen_label_rtx();
+    x = expand_builtin_setjmp (buf, NULL_RTX, noex,
+			       ehstack.top->entry->exception_handler_label);
+    emit_label (noex);
   }
-#else
-  expand_builtin_setjmp_setup (buf,
-                              ehstack.top->entry->exception_handler_label);
 #endif

   /* We are committed to this, so update the handler chain.  */
Index: expr.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/expr.c,v
retrieving revision 1.144.4.8
diff -u -p -r1.144.4.8 expr.c
--- expr.c	2001/01/25 14:03:06	1.144.4.8
+++ expr.c	2001/02/19 13:38:34
@@ -192,7 +192,6 @@ static rtx expand_builtin	PROTO((tree, r
 static int apply_args_size	PROTO((void));
 static int apply_result_size	PROTO((void));
 static rtx result_vector	PROTO((int, rtx));
-static rtx expand_builtin_setjmp PROTO((tree, rtx));
 static rtx expand_builtin_apply_args PROTO((void));
 static rtx expand_builtin_apply	PROTO((rtx, rtx, rtx));
 static void expand_builtin_return PROTO((rtx));
@@ -8545,29 +8544,44 @@ expand_builtin_return_addr (fndecl_code,
   return tem;
 }

-/* Construct the leading half of a __builtin_setjmp call.  Control will
-   return to RECEIVER_LABEL.  This is used directly by sjlj exception
-   handling code.  */
+/* __builtin_setjmp is passed a pointer to an array of five words (not
+   all will be used on all machines).  It operates similarly to the C
+   library function of the same name, but is more efficient.  Much of
+   the code below (and for longjmp) is copied from the handling of
+   non-local gotos.

-void
-expand_builtin_setjmp_setup (buf_addr, receiver_label)
+   NOTE: This is intended for use by GNAT and the exception handling
+   scheme in the compiler and will only work in the method used by
+   them.  */
+
+rtx
+expand_builtin_setjmp (buf_addr, target, first_label, next_label)
      rtx buf_addr;
-     rtx receiver_label;
+     rtx target;
+     rtx first_label, next_label;
 {
+  rtx lab1 = gen_label_rtx ();
   enum machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
+  enum machine_mode value_mode;
   rtx stack_save;

+  value_mode = TYPE_MODE (integer_type_node);
+
 #ifdef POINTERS_EXTEND_UNSIGNED
   buf_addr = convert_memory_address (Pmode, buf_addr);
 #endif

   buf_addr = force_reg (Pmode, buf_addr);

+  if (target == 0 || GET_CODE (target) != REG
+      || REGNO (target) < FIRST_PSEUDO_REGISTER)
+    target = gen_reg_rtx (value_mode);
+
   emit_queue ();

-  /* We store the frame pointer and the address of receiver_label in
-     the buffer and use the rest of it for the stack save area, which
-     is machine-dependent.  */
+  /* We store the frame pointer and the address of lab1 in the buffer
+     and use the rest of it for the stack save area, which is
+     machine-dependent.  */

 #ifndef BUILTIN_SETJMP_FRAME_VALUE
 #define BUILTIN_SETJMP_FRAME_VALUE virtual_stack_vars_rtx
@@ -8579,7 +8593,7 @@ expand_builtin_setjmp_setup (buf_addr, r
 		  (gen_rtx_MEM (Pmode,
 				plus_constant (buf_addr,
 					       GET_MODE_SIZE (Pmode)))),
-		  force_reg (Pmode, gen_rtx_LABEL_REF (Pmode, receiver_label)));
+		  force_reg (Pmode, gen_rtx_LABEL_REF (Pmode, lab1)));

   stack_save = gen_rtx_MEM (sa_mode,
 			    plus_constant (buf_addr,
@@ -8592,22 +8606,20 @@ expand_builtin_setjmp_setup (buf_addr, r
     emit_insn (gen_builtin_setjmp_setup (buf_addr));
 #endif

-  /* Tell optimize_save_area_alloca that extra work is going to
-     need to go on during alloca.  */
-  current_function_calls_setjmp = 1;
+  /* Set TARGET to zero and branch to the first-time-through label.  */
+  emit_move_insn (target, const0_rtx);
+  emit_jump_insn (gen_jump (first_label));
+  emit_barrier ();
+  emit_label (lab1);

-  /* Set this so all the registers get saved in our frame; we need to be
-     able to copy the saved values for any registers from frames we unwind. */
+  /* Tell flow about the strange goings on.  Putting `lab1' on
+     `nonlocal_goto_handler_labels' to indicates that function
+     calls may traverse the arc back to this label.  */
+
   current_function_has_nonlocal_label = 1;
-}
+  nonlocal_goto_handler_labels =
+    gen_rtx_EXPR_LIST (VOIDmode, lab1, nonlocal_goto_handler_labels);

-/* Construct the trailing part of a __builtin_setjmp call.
-   This is used directly by sjlj exception handling code.  */
-
-void
-expand_builtin_setjmp_receiver (receiver_label)
-      rtx receiver_label ATTRIBUTE_UNUSED;
-{
   /* Clobber the FP when we get here, so we have to make sure it's
      marked as used by this function.  */
   emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
@@ -8654,7 +8666,7 @@ expand_builtin_setjmp_receiver (receiver

 #ifdef HAVE_builtin_setjmp_receiver
   if (HAVE_builtin_setjmp_receiver)
-    emit_insn (gen_builtin_setjmp_receiver (receiver_label));
+    emit_insn (gen_builtin_setjmp_receiver (lab1));
   else
 #endif
 #ifdef HAVE_nonlocal_goto_receiver
@@ -8665,68 +8677,12 @@ expand_builtin_setjmp_receiver (receiver
       {
 	; /* Nothing */
       }
-
-  /* @@@ This is a kludge.  Not all machine descriptions define a blockage
-     insn, but we must not allow the code we just generated to be reordered
-     by scheduling.  Specifically, the update of the frame pointer must
-     happen immediately, not later.  So emit an ASM_INPUT to act as blockage
-     insn.  */
-  emit_insn (gen_rtx_ASM_INPUT (VOIDmode, ""));
-}

-
-/* __builtin_setjmp is passed a pointer to an array of five words (not
-   all will be used on all machines).  It operates similarly to the C
-   library function of the same name, but is more efficient.  Much of
-   the code below (and for longjmp) is copied from the handling of
-   non-local gotos.
-
-   NOTE: This is intended for use by GNAT and the exception handling
-   scheme in the compiler and will only work in the method used by
-   them.  */
-
-static rtx
-expand_builtin_setjmp (arglist, target)
-     tree arglist;
-     rtx target;
-{
-  rtx buf_addr, next_lab, cont_lab;
-
-  if (arglist == 0
-      || TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE)
-    return NULL_RTX;
-
-  if (target == 0 || GET_CODE (target) != REG
-      || REGNO (target) < FIRST_PSEUDO_REGISTER)
-    target = gen_reg_rtx (TYPE_MODE (integer_type_node));
-
-  buf_addr = expand_expr (TREE_VALUE (arglist), NULL_RTX, VOIDmode, 0);
-
-  next_lab = gen_label_rtx ();
-  cont_lab = gen_label_rtx ();
-
-  expand_builtin_setjmp_setup (buf_addr, next_lab);
-
-  /* Set TARGET to zero and branch to the continue label.  */
-  emit_move_insn (target, const0_rtx);
-  emit_jump_insn (gen_jump (cont_lab));
-  emit_barrier ();
-  emit_label (next_lab);
-
-  expand_builtin_setjmp_receiver (next_lab);
-
-  /* Set TARGET to one.  */
+  /* Set TARGET, and branch to the next-time-through label.  */
   emit_move_insn (target, const1_rtx);
-  emit_label (cont_lab);
-
-  /* Tell flow about the strange goings on.  Putting `next_lab' on
-     `nonlocal_goto_handler_labels' to indicates that function
-     calls may traverse the arc back to this label.  */
+  emit_jump_insn (gen_jump (next_label));
+  emit_barrier ();

-  current_function_has_nonlocal_label = 1;
-  nonlocal_goto_handler_labels
-    = gen_rtx_EXPR_LIST (VOIDmode, next_lab, nonlocal_goto_handler_labels);
-
   return target;
 }

@@ -9747,10 +9703,18 @@ expand_builtin (exp, target, subtarget,
 #endif

     case BUILT_IN_SETJMP:
-      target = expand_builtin_setjmp (arglist, target);
-      if (target)
-	return target;
-      break;
+      if (arglist == 0
+	  || TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE)
+	break;
+      else
+	{
+	  rtx buf_addr = expand_expr (TREE_VALUE (arglist), subtarget,
+				      VOIDmode, 0);
+	  rtx lab = gen_label_rtx ();
+	  rtx ret = expand_builtin_setjmp (buf_addr, target, lab, lab);
+	  emit_label (lab);
+	  return ret;
+	}

       /* __builtin_longjmp is passed a pointer to an array of five words.
 	 It's similar to the C library longjmp function but works with
Index: expr.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/expr.h,v
retrieving revision 1.34.4.3
diff -u -p -r1.34.4.3 expr.h
--- expr.h	2000/12/29 16:18:54	1.34.4.3
+++ expr.h	2001/02/19 13:38:34
@@ -831,8 +831,7 @@ extern rtx store_expr PROTO((tree, rtx,
    Useful after calling expand_expr with 1 as sum_ok.  */
 extern rtx force_operand PROTO((rtx, rtx));

-extern void expand_builtin_setjmp_setup PARAMS ((rtx, rtx));
-extern void expand_builtin_setjmp_receiver PARAMS ((rtx));
+extern rtx expand_builtin_setjmp PROTO((rtx, rtx, rtx, rtx));

 #ifdef TREE_CODE
 /* Generate code for computing expression EXP.
Index: varasm.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/varasm.c,v
retrieving revision 1.59.4.6
diff -u -p -r1.59.4.6 varasm.c
--- varasm.c	2001/01/25 14:03:24	1.59.4.6
+++ varasm.c	2001/02/19 13:38:37
@@ -3494,18 +3494,6 @@ force_const_mem (mode, x)

 	  pop_obstacks ();
 	}
-      if (GET_CODE (x) == LABEL_REF)
-	{
-	  extern rtx forced_labels;
-
-	  push_obstacks_nochange ();
-	  rtl_in_saveable_obstack ();
-
-	  forced_labels = gen_rtx_EXPR_LIST (VOIDmode,
-					     XEXP (x, 0),
-					     forced_labels);
-	  pop_obstacks ();
-	}

       /* Allocate a pool constant descriptor, fill it in, and chain it in.  */




More information about the Gcc-patches mailing list