This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: PATCH: Fix member.C on IRIX 6.5


On Fri, May 18, 2001 at 12:25:00AM -0700, Mark Mitchell wrote:
> IRIX 6.5 is now using SJLJ exceptions.  (How sad.)  

See if the following works for you.


r~



Index: except.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/except.c,v
retrieving revision 1.143.2.10
diff -c -p -d -r1.143.2.10 except.c
*** except.c	2001/05/17 18:07:32	1.143.2.10
--- except.c	2001/05/18 08:31:55
*************** dw2_build_landing_pads ()
*** 1897,1903 ****
        emit_move_insn (cfun->eh->exc_ptr,
  		      gen_rtx_REG (Pmode, EH_RETURN_DATA_REGNO (0)));
        emit_move_insn (cfun->eh->filter,
! 		      gen_rtx_REG (Pmode, EH_RETURN_DATA_REGNO (1)));
  
        seq = get_insns ();
        end_sequence ();
--- 1897,1903 ----
        emit_move_insn (cfun->eh->exc_ptr,
  		      gen_rtx_REG (Pmode, EH_RETURN_DATA_REGNO (0)));
        emit_move_insn (cfun->eh->filter,
! 		      gen_rtx_REG (word_mode, EH_RETURN_DATA_REGNO (1)));
  
        seq = get_insns ();
        end_sequence ();
*************** expand_eh_return ()
*** 3035,3040 ****
--- 3035,3042 ----
    else
  #endif
      {
+       rtx handler;
+ 
        ra = EH_RETURN_HANDLER_RTX;
        if (! ra)
  	{
*************** expand_eh_return ()
*** 3043,3049 ****
  	}
  
        emit_move_insn (sa, cfun->eh->ehr_stackadj);
!       emit_move_insn (ra, cfun->eh->ehr_handler);
      }
  
    emit_label (around_label);
--- 3045,3061 ----
  	}
  
        emit_move_insn (sa, cfun->eh->ehr_stackadj);
! 
!       handler = cfun->eh->ehr_handler;
!       if (GET_MODE (ra) != Pmode)
! 	{
! #ifdef POINTERS_EXTEND_UNSIGNED
! 	  handler = convert_memory_address (GET_MODE (ra), handler);
! #else
! 	  handler = convert_to_mode (GET_MODE (ra), handler, 0);
! #endif
! 	}
!       emit_move_insn (ra, handler);
      }
  
    emit_label (around_label);
Index: config/mips/mips.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.c,v
retrieving revision 1.107.2.2
diff -c -p -d -r1.107.2.2 mips.c
*** mips.c	2001/05/12 20:32:50	1.107.2.2
--- mips.c	2001/05/18 08:31:55
*************** compute_frame_size (size)
*** 6277,6282 ****
--- 6277,6296 ----
  	}
      }
  
+   /* We need to restore these for the handler.  */
+   if (current_function_calls_eh_return)
+     {
+       int i;
+       for (i = 0; ; ++i)
+ 	{
+ 	  regno = EH_RETURN_DATA_REGNO (i);
+ 	  if (regno == INVALID_REGNUM)
+ 	    break;
+ 	  gp_reg_size += GET_MODE_SIZE (gpr_mode);
+ 	  mask |= 1L << (regno - GP_REG_FIRST);
+ 	}
+     }
+ 
    /* Calculate space needed for fp registers.  */
    if (TARGET_FLOAT64 || TARGET_SINGLE_FLOAT)
      {
*************** mips_expand_epilogue ()
*** 7564,7576 ****
        if (tsize > 32767 && TARGET_MIPS16)
  	abort ();
  
        emit_insn (gen_blockage ());
!       if (Pmode == DImode && tsize != 0)
! 	emit_insn (gen_adddi3 (stack_pointer_rtx, stack_pointer_rtx,
! 			       tsize_rtx));
!       else if (tsize != 0)
! 	emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
! 			       tsize_rtx));
      }
  
    /* The mips16 loads the return address into $7, not $31.  */
--- 7578,7604 ----
        if (tsize > 32767 && TARGET_MIPS16)
  	abort ();
  
+       if (current_function_calls_eh_return)
+ 	{
+ 	  rtx eh_ofs = EH_RETURN_STACKADJ_RTX;
+ 	  if (Pmode == DImode)
+ 	    emit_insn (gen_adddi3 (eh_ofs, eh_ofs, tsize_rtx));
+ 	  else
+ 	    emit_insn (gen_addsi3 (eh_ofs, eh_ofs, tsize_rtx));
+ 	  tsize_rtx = eh_ofs;
+ 	}
+ 
        emit_insn (gen_blockage ());
! 
!       if (tsize != 0 || current_function_calls_eh_return)
! 	{
! 	  if (Pmode == DImode)
! 	    emit_insn (gen_adddi3 (stack_pointer_rtx, stack_pointer_rtx,
! 				   tsize_rtx));
! 	  else
! 	    emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
! 				   tsize_rtx));
! 	}
      }
  
    /* The mips16 loads the return address into $7, not $31.  */
Index: config/mips/mips.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.h,v
retrieving revision 1.108.2.1
diff -c -p -d -r1.108.2.1 mips.h
*** mips.h	2001/04/26 16:04:14	1.108.2.1
--- mips.h	2001/05/18 08:31:56
*************** while (0)
*** 1098,1103 ****
--- 1098,1107 ----
  /* Before the prologue, RA lives in r31.  */
  #define INCOMING_RETURN_ADDR_RTX  gen_rtx_REG (VOIDmode, GP_REG_FIRST + 31)
  
+ /* Describe how we implement __builtin_eh_return.  */
+ #define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N) + GP_ARG_FIRST : INVALID_REGNUM)
+ #define EH_RETURN_STACKADJ_RTX  gen_rtx_REG (Pmode, GP_REG_FIRST + 3)
+ 
  /* Overrides for the COFF debug format.  */
  #define PUT_SDB_SCL(a)					\
  do {							\
Index: config/mips/mips.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.md,v
retrieving revision 1.87.4.1
diff -c -p -d -r1.87.4.1 mips.md
*** mips.md	2001/04/19 17:21:59	1.87.4.1
--- mips.md	2001/05/18 08:31:56
***************
*** 26,31 ****
--- 26,51 ----
  ;; ??? Currently does not have define_function_unit support for the R8000.
  ;; Must include new entries for fmadd in addition to existing entries.
  
+ ;; UNSPEC values used in mips.md
+ ;; Number	USE
+ ;; 0		movsi_ul
+ ;; 1		movsi_us, get_fnaddr
+ ;; 2		loadgp
+ ;; 3		eh_set_return
+ ;; 20		builtin_setjmp_setup
+ ;;
+ ;; UNSPEC_VOLATILE values
+ ;; 0		blockage
+ ;; 3		builtin_longjmp
+ ;; 10		consttable_qi
+ ;; 11		consttable_hi
+ ;; 12		consttable_si
+ ;; 13		consttable_di
+ ;; 14		consttable_sf
+ ;; 15		consttable_df
+ ;; 16		align_2
+ ;; 17		align_4
+ ;; 18		align_8
  
  
  ;; ....................
*************** ld\\t%2,%1-%S1(%2)\;daddu\\t%2,%2,$31\;j
*** 9468,9473 ****
--- 9488,9560 ----
     (set_attr "mode"	"none")
     (set_attr "length"	"16")])
  
+ ;; This is used in compiling the unwind routines.
+ (define_expand "eh_return"
+   [(use (match_operand 0 "general_operand" ""))
+    (use (match_operand 1 "general_operand" ""))]
+   ""
+   "
+ {
+   enum machine_mode gpr_mode = TARGET_64BIT ? DImode : SImode;
+ 
+   if (GET_MODE (operands[1]) != gpr_mode)
+     operands[1] = convert_to_mode (gpr_mode, operands[1], 0);
+   if (TARGET_64BIT)
+     emit_insn (gen_eh_set_lr_di (operands[1]));
+   else
+     emit_insn (gen_eh_set_lr_si (operands[1]));
+ 
+   emit_move_insn (EH_RETURN_STACKADJ_RTX, operands[0]);
+   DONE;
+ }")
+ 
+ ;; Clobber the return address on the stack.  We can't expand this
+ ;; until we know where it will be put in the stack frame.
+ 
+ (define_insn "eh_set_lr_si"
+   [(unspec [(match_operand:SI 0 "register_operand" "r")] 3)
+    (clobber (match_scratch:SI 1 "=&r"))]
+   "! TARGET_64BIT"
+   "#")
+ 
+ (define_insn "eh_set_lr_di"
+   [(unspec [(match_operand:DI 0 "register_operand" "r")] 3)
+    (clobber (match_scratch:DI 1 "=&r"))]
+   "TARGET_64BIT"
+   "#")
+ 
+ (define_split
+   [(unspec [(match_operand 0 "register_operand" "r")] 3)
+    (clobber (match_scratch 1 "=&r"))]
+   "reload_completed"
+   [(const_int 0)]
+   "
+ {
+   HOST_WIDE_INT gp_offset;
+   rtx base;
+ 
+   compute_frame_size (get_frame_size ());
+   if (((current_frame_info.mask >> 31) & 1) == 0)
+     abort ();
+   gp_offset = current_frame_info.gp_sp_offset;
+ 
+   if (gp_offset < 32768)
+     base = stack_pointer_rtx;
+   else
+     {
+       base = operands[1];
+       emit_move_insn (base, GEN_INT (gp_offset));
+       if (Pmode == DImode)
+ 	emit_insn (gen_adddi3 (base, base, stack_pointer_rtx));
+       else
+ 	emit_insn (gen_addsi3 (base, base, stack_pointer_rtx));
+       gp_offset = 0;
+     }
+   emit_move_insn (gen_rtx_MEM (GET_MODE (operands[0]),
+ 			       plus_constant (base, gp_offset)),
+ 		  operands[0]);
+   DONE;
+ }")
  
  ;;
  ;;  ....................


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]