diff --git a/compiler/powerpc/cgcpu.pas b/compiler/powerpc/cgcpu.pas index 994eb6963b..eb657f5ded 100644 --- a/compiler/powerpc/cgcpu.pas +++ b/compiler/powerpc/cgcpu.pas @@ -1280,7 +1280,7 @@ const begin r.enum:=R_INTREGISTER; r.number:=NR_R11; - reference_reset_base(href,rsp,current_procinfo.framepointer_offset); + reference_reset_base(href,rsp,PARENT_FRAMEPOINTER_OFFSET); list.concat(taicpu.op_reg_ref(A_STW,r,href)); end; end; @@ -2702,7 +2702,10 @@ begin end. { $Log$ - Revision 1.112 2003-07-05 20:11:42 jonas + Revision 1.113 2003-07-06 20:25:03 jonas + * fixed ppc compiler + + Revision 1.112 2003/07/05 20:11:42 jonas * create_paraloc_info() is now called separately for the caller and callee info * fixed ppc cycle diff --git a/compiler/powerpc/cpubase.pas b/compiler/powerpc/cpubase.pas index 4da117ef1d..dac89d1c62 100644 --- a/compiler/powerpc/cpubase.pas +++ b/compiler/powerpc/cpubase.pas @@ -712,6 +712,8 @@ uses LA_LR = 8; { offset in the linkage area for the saved RTOC register} LA_RTOC = 20; + + PARENT_FRAMEPOINTER_OFFSET = 12; {***************************************************************************** Helpers @@ -880,7 +882,10 @@ implementation end. { $Log$ - Revision 1.60 2003-07-06 15:28:24 jonas + Revision 1.61 2003-07-06 20:25:03 jonas + * fixed ppc compiler + + Revision 1.60 2003/07/06 15:28:24 jonas * VOLATILE_REGISTERS was wrong (it was more or less the inverted set of what it had to be :/ ) diff --git a/compiler/powerpc/cpupi.pas b/compiler/powerpc/cpupi.pas index 99ef9addd9..69ed99a3fd 100644 --- a/compiler/powerpc/cpupi.pas +++ b/compiler/powerpc/cpupi.pas @@ -36,12 +36,13 @@ unit cpupi; tppcprocinfo = class(tcgprocinfo) { overall size of allocated stack space, currently this is used for the PowerPC only } localsize : aword; - { max. of space need for parameters, currently used by the PowerPC port only } maxpushedparasize : aword; constructor create(aparent:tprocinfo);override; procedure after_pass1;override; + procedure allocate_push_parasize(size: longint);override; + function calc_stackframe_size:longint;override; end; @@ -70,8 +71,6 @@ unit cpupi; begin ofs:=align(maxpushedparasize+LinkageAreaSize,16); inc(procdef.parast.address_fixup,ofs); - { use space reserved for compilers in link area } - framepointer_offset := 12; // inc(selfpointer_offset,ofs); // inc(vmtpointer_offset,ofs); if cs_asm_source in aktglobalswitches then @@ -93,12 +92,32 @@ unit cpupi; end; end; + + procedure tppcprocinfo.allocate_push_parasize(size:longint); + begin + if size>maxpushedparasize then + maxpushedparasize:=size; + end; + + + function tppcprocinfo.calc_stackframe_size:longint; + var + savearea : longint; + begin + { more or less copied from cgcpu.pas/g_stackframe_entry } + result := align(align((31-13+1)*4+(31-14+1)*8,16)+tg.lasttemp,16); + end; + + begin cprocinfo:=tppcprocinfo; end. { $Log$ - Revision 1.23 2003-06-13 21:19:32 peter + Revision 1.24 2003-07-06 20:25:03 jonas + * fixed ppc compiler + + Revision 1.23 2003/06/13 21:19:32 peter * current_procdef removed, use current_procinfo.procdef instead Revision 1.22 2003/06/02 21:42:05 jonas diff --git a/compiler/powerpc/nppccal.pas b/compiler/powerpc/nppccal.pas index 38406cf640..0eb7a275c8 100644 --- a/compiler/powerpc/nppccal.pas +++ b/compiler/powerpc/nppccal.pas @@ -82,7 +82,7 @@ implementation { pass the same framepointer as the current procedure got } hregister2.enum:=R_INTREGISTER; hregister2.number:=NR_R11; - reference_reset_base(href,current_procinfo.framepointer,current_procinfo.framepointer_offset); + reference_reset_base(href,current_procinfo.framepointer,PARENT_FRAMEPOINTER_OFFSET); cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister2); { it must be adjusted! } end @@ -100,7 +100,7 @@ implementation else if (current_procinfo.procdef.parast.symtablelevel>(tprocdef(procdefinition).parast.symtablelevel)) then begin hregister1:=rg.getregisterint(exprasmlist,OS_ADDR); - reference_reset_base(href,current_procinfo.framepointer,current_procinfo.framepointer_offset); + reference_reset_base(href,current_procinfo.framepointer,PARENT_FRAMEPOINTER_OFFSET); cg.a_load_ref_reg(exprasmlist,OS_ADDR,OS_ADDR,href,hregister1); { the previous frame pointer is always saved at } { previous_framepointer+12 (in the link area) } @@ -125,7 +125,10 @@ begin end. { $Log$ - Revision 1.18 2003-06-13 21:19:32 peter + Revision 1.19 2003-07-06 20:25:03 jonas + * fixed ppc compiler + + Revision 1.18 2003/06/13 21:19:32 peter * current_procdef removed, use current_procinfo.procdef instead Revision 1.17 2003/06/04 11:58:58 jonas