loepere@WOMBAT.WESTFORD.CCUR.COM (09/08/89)
The Mips definition for gcc is off by a word when allocating stack
space for preserving registers. This appears to be an original
problem that only manifests itself with the latest version. Here are
diffs for tm-mips.h (line numbers are for gcc 1.35.96). - Keith
*** /usr/mips/gcc/VIRGIN-GNU/tm-mips.h Wed Sep 6 21:18:07 1989
--- /usr/mips/gcc/config/tm-mips.h Wed Sep 6 22:21:37 1989
***************
*** 553,557
first local allocated. Otherwise, it is the offset to the BEGINNING
of the first local allocated. */
! #define STARTING_FRAME_OFFSET -4
/* If we generate an insn to push BYTES bytes,
--- 553,557 -----
first local allocated. Otherwise, it is the offset to the BEGINNING
of the first local allocated. */
! #define STARTING_FRAME_OFFSET -8 /* space used for VARARGS support */
/* If we generate an insn to push BYTES bytes,
***************
*** 811,815
register int mask = 0, fmask=0; \
static char dont_save_regs[] = CALL_USED_REGISTERS; \
! register int push_loc = 0,tsize = SIZE+4; \
char *fp_str; \
extern char *reg_numchar[]; \
--- 811,815 -----
register int mask = 0, fmask=0; \
static char dont_save_regs[] = CALL_USED_REGISTERS; \
! register int push_loc = 0,tsize = SIZE+8; \
char *fp_str; \
extern char *reg_numchar[]; \
***************
*** 855,862
|| (regs_ever_live[regno] && !dont_save_regs[regno])) \
{ \
- push_loc += 4; \
fprintf (FILE,"\tsw\t%s,%d(%s)\n", \
TARGET_NAME_REGS ? reg_names[regno] \
: reg_numchar[regno],push_loc,fp_str); \
} \
} \
--- 855,862 -----
|| (regs_ever_live[regno] && !dont_save_regs[regno])) \
{ \
fprintf (FILE,"\tsw\t%s,%d(%s)\n", \
TARGET_NAME_REGS ? reg_names[regno] \
: reg_numchar[regno],push_loc,fp_str); \
+ push_loc += 4; \
} \
} \
***************
*** 866,872
TARGET_NAME_REGS ? reg_names[9] \
: reg_numchar[9],tsize); \
! fprintf (FILE,"\tsw\t%s,-4(%s)\t#Varargs suspicion\n", \
TARGET_NAME_REGS ? reg_names[9] \
: reg_numchar[9], \
TARGET_NAME_REGS ? reg_names[29] \
: reg_numchar[29]); \
--- 866,873 -----
TARGET_NAME_REGS ? reg_names[9] \
: reg_numchar[9],tsize); \
! fprintf (FILE,"\tsw\t%s,%d(%s)\t#Varargs suspicion\n", \
TARGET_NAME_REGS ? reg_names[9] \
: reg_numchar[9], \
+ tsize-4, \
TARGET_NAME_REGS ? reg_names[29] \
: reg_numchar[29]); \
***************
*** 872,880
: reg_numchar[29]); \
for (fregno = 44; fregno< 48; fregno += 2) \
! {push_loc += 8; \
! fprintf (FILE,"\ts.d\t%s,%d(%s)\t#Varargs Suspicion\n", \
( (TARGET_NAME_REGS) \
?reg_names[fregno]: reg_numchar[fregno]), \
! push_loc,fp_str);} \
} \
for (regno = 29; regno >= 0; regno--) \
--- 873,883 -----
: reg_numchar[29]); \
for (fregno = 44; fregno< 48; fregno += 2) \
! { \
! fprintf (FILE,"\ts.d\t%s,%d(%s)\t#Varargs Suspicion\n", \
( (TARGET_NAME_REGS) \
?reg_names[fregno]: reg_numchar[fregno]), \
! push_loc,fp_str); \
! push_loc += 8; \
! } \
} \
for (regno = 29; regno >= 0; regno--) \
***************
*** 883,890
|| (regs_ever_live[regno] && !dont_save_regs[regno])) \
{ \
- push_loc += 4; \
fprintf (FILE, "\tsw\t%s,%d(%s)\n", \
TARGET_NAME_REGS ? reg_names[regno] \
: reg_numchar[regno],push_loc,fp_str); \
} \
} \
--- 886,893 -----
|| (regs_ever_live[regno] && !dont_save_regs[regno])) \
{ \
fprintf (FILE, "\tsw\t%s,%d(%s)\n", \
TARGET_NAME_REGS ? reg_names[regno] \
: reg_numchar[regno],push_loc,fp_str); \
+ push_loc += 4; \
} \
} \
***************
*** 892,900
for (regno = 32; regno < FIRST_PSEUDO_REGISTER; regno += 2) \
if (regs_ever_live[regno] && !dont_save_regs[regno]) \
! {push_loc += 8; \
! fprintf (FILE,"\ts.d\t%s,%d(%s)\n", \
( (TARGET_NAME_REGS) ? reg_names[regno] \
: reg_numchar[regno]),push_loc,fp_str); \
! } \
if (frame_pointer_needed) \
fprintf (FILE,"\taddiu\t%s,%s,%d\t#Establish FramePTR\n", \
--- 895,904 -----
for (regno = 32; regno < FIRST_PSEUDO_REGISTER; regno += 2) \
if (regs_ever_live[regno] && !dont_save_regs[regno]) \
! { \
! fprintf (FILE,"\ts.d\t%s,%d(%s)\n", \
( (TARGET_NAME_REGS) ? reg_names[regno] \
: reg_numchar[regno]),push_loc,fp_str); \
! push_loc += 8; \
! } \
if (frame_pointer_needed) \
fprintf (FILE,"\taddiu\t%s,%s,%d\t#Establish FramePTR\n", \
***************
*** 981,985
|| (regs_ever_live[regno] && !dont_save_regs[regno])) \
{ \
- push_loc += 4; \
fprintf (FILE,"\tlw\t%s,%d(%s)\n", \
TARGET_NAME_REGS ? reg_names[regno] \
--- 985,988 -----
|| (regs_ever_live[regno] && !dont_save_regs[regno])) \
{ \
fprintf (FILE,"\tlw\t%s,%d(%s)\n", \
TARGET_NAME_REGS ? reg_names[regno] \
***************
*** 989,992
push_loc), \
(frame_pointer_needed ? fp_str :sp_str)); \
} \
if ( THIS_VARARGS_SUSPECTED && (regno == 30)) push_loc += 16; \
--- 992,996 -----
push_loc), \
(frame_pointer_needed ? fp_str :sp_str)); \
+ push_loc += 4; \
} \
if ( THIS_VARARGS_SUSPECTED && (regno == 30)) push_loc += 16; \
***************
*** 1000,1004
if (regs_ever_live[regno] && !dont_save_regs[regno]) \
{ \
- push_loc += 8; \
fprintf (FILE,"\tl.d\t%s,%d(%s)\n", \
( ( TARGET_NAME_REGS) ? reg_names[regno] \
--- 1004,1007 -----
if (regs_ever_live[regno] && !dont_save_regs[regno]) \
{ \
fprintf (FILE,"\tl.d\t%s,%d(%s)\n", \
( ( TARGET_NAME_REGS) ? reg_names[regno] \
***************
*** 1008,1011
: push_loc), \
(frame_pointer_needed ? fp_str :sp_str)); \
} \
} \
--- 1011,1015 -----
: push_loc), \
(frame_pointer_needed ? fp_str :sp_str)); \
+ push_loc += 8; \
} \
} \