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; \ } \ } \