This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PATCH: Fix member.C on IRIX 6.5
- To: Mark Mitchell <mark at codesourcery dot com>
- Subject: Re: PATCH: Fix member.C on IRIX 6.5
- From: Richard Henderson <rth at redhat dot com>
- Date: Fri, 18 May 2001 01:33:33 -0700
- Cc: gcc-patches at gcc dot gnu dot org
- References: <20010518002500P.mitchell@codesourcery.com>
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;
+ }")
;;
;; ....................