From 37247e8cdee9cdbadd5e9c495356f265ca56b7e3 Mon Sep 17 00:00:00 2001 From: mazen Date: Thu, 14 Nov 2002 21:42:08 +0000 Subject: [PATCH] * fixing return value variable address --- compiler/sparc/cpupi.pas | 44 +++++++++++++++++++++++-------------- compiler/sparc/ncpucall.pas | 19 +++++++--------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/compiler/sparc/cpupi.pas b/compiler/sparc/cpupi.pas index 57480fe034..2b4759e56b 100644 --- a/compiler/sparc/cpupi.pas +++ b/compiler/sparc/cpupi.pas @@ -27,10 +27,10 @@ uses cutils, cgbase,cpuinfo; type - TSparcprocinfo=class(TProcInfo) + TSparcProcInfo=class(TProcInfo) {overall size of allocated stack space, currently this is used for the PowerPC only} - localsize:aword; + LocalSize:aword; {max of space need for parameters, currently used by the PowerPC port only} maxpushedparasize:aword; constructor create;override; @@ -57,33 +57,45 @@ constructor TSparcprocinfo.create; begin inherited create; maxpushedparasize:=0; - localsize:=0; + LocalSize:=0; end; procedure TSparcprocinfo.after_header; begin - {Reserve the stack for copying parameters passeѕ into registers} + {First 16 words are in the frame are used to save registers in case of a + register overflow/underflow} + {The 17th word is used to save the address of the variable which will + receive the return value of the called function} + Return_Offset:=-64;{16*4} procdef.parast.address_fixup:=(16+1)*4; + {Reserve the stack for copying parameters passed into registers. By default + we reserve space for the 6 input registers even if the function had less + parameters.} + procdef.localst.address_fixup:=6*4+(16+1)*4; end; procedure TSparcProcInfo.after_pass1; begin - if(procdef.parast.datasize>6*4) - then - procdef.localst.address_fixup:=procdef.parast.datasize+(16+1)*4 - else - procdef.localst.address_fixup:=6*4+(16+1)*4; - procinfo.firsttemp_offset:=procdef.localst.address_fixup+procdef.localst.datasize; - WriteLn('Parameter copies start at: %i6+'+tostr(procdef.parast.address_fixup)); - WriteLn('Locals start at: %o6+'+tostr(procdef.localst.address_fixup)); - WriteLn('Temp. space start: %o6+'+tostr(procinfo.firsttemp_offset)); - tg.firsttemp:=procinfo.firsttemp_offset; - tg.lasttemp:=procinfo.firsttemp_offset; + with ProcDef do + begin + if parast.datasize>6*4 + then + localst.address_fixup:=parast.address_fixup+parast.datasize; + firsttemp_offset:=localst.address_fixup+localst.datasize; + WriteLn('Parameter copies start at: %i6+'+tostr(parast.address_fixup)); + WriteLn('Locals start at: %o6+'+tostr(localst.address_fixup)); + WriteLn('Temp. space start: %o6+'+tostr(firsttemp_offset)); + tg.firsttemp:=procinfo.firsttemp_offset; + tg.lasttemp:=procinfo.firsttemp_offset; + end; end; begin cprocinfo:=TSparcProcInfo; end. { $Log$ - Revision 1.6 2002-11-10 19:07:46 mazen + Revision 1.7 2002-11-14 21:42:08 mazen + * fixing return value variable address + + Revision 1.6 2002/11/10 19:07:46 mazen * SPARC calling mechanism almost OK (as in GCC./mppcsparc ) Revision 1.5 2002/11/03 20:22:40 mazen diff --git a/compiler/sparc/ncpucall.pas b/compiler/sparc/ncpucall.pas index 7d8148ffad..7afd7d1a40 100644 --- a/compiler/sparc/ncpucall.pas +++ b/compiler/sparc/ncpucall.pas @@ -35,21 +35,15 @@ set when generating function prologue in cgcpu.tcgSPARC.g_stackframe_entry} end; implementation uses - globtype,systems, + systems, cutils,verbose,globals, - symconst,symbase,symsym,symtable,defbase,paramgr, + paramgr, {$ifdef GDB} - {$ifdef delphi} - sysutils, - {$else} - strings, - {$endif} gdb, {$endif GDB} - cginfo,cgbase,pass_2, - cpuinfo,cpubase,aasmbase,aasmtai,aasmcpu, + cgbase, nmem,nld,ncnv, - ncgutil,cgobj,tgobj,regvars,rgobj,rgcpu,cg64f32,cgcpu,cpupi; + cgobj,tgobj,rgobj,rgcpu,cgcpu,cpupi; function TSparcCallNode.pass_1:TNode; begin result:=inherited pass_1; @@ -75,7 +69,10 @@ begin end. { $Log$ - Revision 1.4 2002-10-10 19:57:52 mazen + Revision 1.5 2002-11-14 21:42:08 mazen + * fixing return value variable address + + Revision 1.4 2002/10/10 19:57:52 mazen * Just to update repsitory Revision 1.3 2002/09/30 19:12:14 mazen