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]
Other format: [Raw text]

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);
 


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