This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
MIPS patch for compile/20031023-*.c
- From: Richard Sandiford <rsandifo at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: echristo at redhat dot com
- Date: 02 Nov 2003 10:55:00 +0000
- Subject: MIPS patch for compile/20031023-*.c
This patch fixes compile/20031023-*.c on LP64 mips targets. The problem
was that lots of offsets were being stored as longs rather than HOST_WIDE_INTs.
Any use of long seems somewhat suspicious, so I also changed the
GPR and FPR save masks fron longs to unsigned ints.
Although the first change is pretty obvious, I thought I'd better
ask about the second one.
Tested on mips64-linux-gnu and various other mips targets. OK to install?
Richard
* config/mips/mips-protos.h (mips_initial_elimination_offset): Change
return type to HOST_WIDE_INT.
* config/mips/mips.c (mips_frame_info): Give sizes type HOST_WIDE_INT.
Make initialized to a bool. Make register masks unsigned ints.
(compute_frame_size): Make same mask change here. Use HOST_WIDE_INT
where appropriate.
(mips_initial_elimination_offset): Return a HOST_WIDE_INT.
(mips_output_function_prologue): Print sizes as HOST_WIDE_INTs.
diff -upd config/mips.cvs/mips-protos.h config/mips/mips-protos.h
--- config/mips.cvs/mips-protos.h Thu Oct 30 13:52:56 2003
+++ config/mips/mips-protos.h Sat Nov 1 12:52:40 2003
@@ -111,7 +111,7 @@ extern void mips_declare_object_name (FI
extern void mips_finish_declare_object (FILE *, tree, int, int);
extern HOST_WIDE_INT compute_frame_size (HOST_WIDE_INT);
-extern int mips_initial_elimination_offset (int, int);
+extern HOST_WIDE_INT mips_initial_elimination_offset (int, int);
extern rtx mips_return_addr (int, rtx);
extern void mips_expand_prologue (void);
extern void mips_expand_epilogue (int);
diff -upd config/mips.cvs/mips.c config/mips/mips.c
--- config/mips.cvs/mips.c Thu Oct 30 18:06:55 2003
+++ config/mips/mips.c Sat Nov 1 13:04:33 2003
@@ -295,21 +295,21 @@ static unsigned int irix_section_type_fl
struct mips_frame_info GTY(())
{
- long total_size; /* # bytes that the entire frame takes up */
- long var_size; /* # bytes that variables take up */
- long args_size; /* # bytes that outgoing arguments take up */
- long cprestore_size; /* # bytes that the .cprestore slot takes up */
- int gp_reg_size; /* # bytes needed to store gp regs */
- int fp_reg_size; /* # bytes needed to store fp regs */
- long mask; /* mask of saved gp registers */
- long fmask; /* mask of saved fp registers */
- long gp_save_offset; /* offset from vfp to store gp registers */
- long fp_save_offset; /* offset from vfp to store fp registers */
- long gp_sp_offset; /* offset from new sp to store gp registers */
- long fp_sp_offset; /* offset from new sp to store fp registers */
- int initialized; /* != 0 if frame size already calculated */
- int num_gp; /* number of gp registers saved */
- int num_fp; /* number of fp registers saved */
+ HOST_WIDE_INT total_size; /* # bytes that the entire frame takes up */
+ HOST_WIDE_INT var_size; /* # bytes that variables take up */
+ HOST_WIDE_INT args_size; /* # bytes that outgoing arguments take up */
+ HOST_WIDE_INT cprestore_size; /* # bytes that the .cprestore slot takes up */
+ HOST_WIDE_INT gp_reg_size; /* # bytes needed to store gp regs */
+ HOST_WIDE_INT fp_reg_size; /* # bytes needed to store fp regs */
+ unsigned int mask; /* mask of saved gp registers */
+ unsigned int fmask; /* mask of saved fp registers */
+ HOST_WIDE_INT gp_save_offset; /* offset from vfp to store gp registers */
+ HOST_WIDE_INT fp_save_offset; /* offset from vfp to store fp registers */
+ HOST_WIDE_INT gp_sp_offset; /* offset from new sp to store gp registers */
+ HOST_WIDE_INT fp_sp_offset; /* offset from new sp to store fp registers */
+ bool initialized; /* true if frame size already calculated */
+ int num_gp; /* number of gp registers saved */
+ int num_fp; /* number of fp registers saved */
};
struct machine_function GTY(()) {
@@ -6161,8 +6161,8 @@ compute_frame_size (HOST_WIDE_INT size)
HOST_WIDE_INT gp_reg_rounded; /* # bytes needed to store gp after rounding */
HOST_WIDE_INT gp_reg_size; /* # bytes needed to store gp regs */
HOST_WIDE_INT fp_reg_size; /* # bytes needed to store fp regs */
- long mask; /* mask of saved gp registers */
- long fmask; /* mask of saved fp registers */
+ unsigned int mask; /* mask of saved gp registers */
+ unsigned int fmask; /* mask of saved fp registers */
cfun->machine->global_pointer = mips_global_pointer ();
@@ -6195,7 +6195,7 @@ compute_frame_size (HOST_WIDE_INT size)
if (mips_save_reg_p (regno))
{
gp_reg_size += GET_MODE_SIZE (gpr_mode);
- mask |= 1L << (regno - GP_REG_FIRST);
+ mask |= 1 << (regno - GP_REG_FIRST);
}
/* We need to restore these for the handler. */
@@ -6208,7 +6208,7 @@ compute_frame_size (HOST_WIDE_INT size)
if (regno == INVALID_REGNUM)
break;
gp_reg_size += GET_MODE_SIZE (gpr_mode);
- mask |= 1L << (regno - GP_REG_FIRST);
+ mask |= 1 << (regno - GP_REG_FIRST);
}
}
@@ -6248,7 +6248,7 @@ compute_frame_size (HOST_WIDE_INT size)
if (mask)
{
- unsigned long offset;
+ HOST_WIDE_INT offset;
offset = (args_size + cprestore_size + var_size
+ gp_reg_size - GET_MODE_SIZE (gpr_mode));
@@ -6263,9 +6263,11 @@ compute_frame_size (HOST_WIDE_INT size)
if (fmask)
{
- unsigned long offset = (args_size + cprestore_size + var_size
- + gp_reg_rounded + fp_reg_size
- - FP_INC * UNITS_PER_FPREG);
+ HOST_WIDE_INT offset;
+
+ offset = (args_size + cprestore_size + var_size
+ + gp_reg_rounded + fp_reg_size
+ - FP_INC * UNITS_PER_FPREG);
cfun->machine->frame.fp_sp_offset = offset;
cfun->machine->frame.fp_save_offset = offset - total_size;
}
@@ -6283,10 +6285,10 @@ compute_frame_size (HOST_WIDE_INT size)
pointer or argument pointer. TO is either the stack pointer or
hard frame pointer. */
-int
+HOST_WIDE_INT
mips_initial_elimination_offset (int from, int to)
{
- int offset;
+ HOST_WIDE_INT offset;
compute_frame_size (get_frame_size ());
@@ -6431,12 +6433,15 @@ mips_output_function_prologue (FILE *fil
{
/* .frame FRAMEREG, FRAMESIZE, RETREG */
fprintf (file,
- "\t.frame\t%s,%ld,%s\t\t# vars= %ld, regs= %d/%d, args= %ld, gp= %ld\n",
+ "\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
+ "# vars= " HOST_WIDE_INT_PRINT_DEC ", regs= %d/%d"
+ ", args= " HOST_WIDE_INT_PRINT_DEC
+ ", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
(reg_names[(frame_pointer_needed)
? HARD_FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM]),
((frame_pointer_needed && TARGET_MIPS16)
- ? ((long) tsize - cfun->machine->frame.args_size)
- : (long) tsize),
+ ? tsize - cfun->machine->frame.args_size
+ : tsize),
reg_names[GP_REG_FIRST + 31],
cfun->machine->frame.var_size,
cfun->machine->frame.num_gp,
@@ -6445,9 +6450,10 @@ mips_output_function_prologue (FILE *fil
cfun->machine->frame.cprestore_size);
/* .mask MASK, GPOFFSET; .fmask FPOFFSET */
- fprintf (file, "\t.mask\t0x%08lx,%ld\n\t.fmask\t0x%08lx,%ld\n",
+ fprintf (file, "\t.mask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
cfun->machine->frame.mask,
- cfun->machine->frame.gp_save_offset,
+ cfun->machine->frame.gp_save_offset);
+ fprintf (file, "\t.fmask\t0x%08x," HOST_WIDE_INT_PRINT_DEC "\n",
cfun->machine->frame.fmask,
cfun->machine->frame.fp_save_offset);