From ec71805aa89d85cb269fc5acc04b74950db89b58 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sat, 5 Apr 2003 21:09:31 +0000 Subject: [PATCH] * several ppc/generic result offset related fixes. The "normal" result offset seems now to be calculated correctly and a lot of duplicate calculations have been removed. Nested functions accessing the parent's function result don't work at all though :( --- compiler/cgbase.pas | 28 ++++++++++++++++++++-------- compiler/powerpc/cpupi.pas | 30 +++++++++++++++++++++++------- compiler/psub.pas | 11 ++++++++++- compiler/symtable.pas | 18 +++++++++++++++--- 4 files changed, 68 insertions(+), 19 deletions(-) diff --git a/compiler/cgbase.pas b/compiler/cgbase.pas index 02b8cb5ce8..fa5e324b9c 100644 --- a/compiler/cgbase.pas +++ b/compiler/cgbase.pas @@ -166,8 +166,10 @@ unit cgbase; } procedure after_pass1;virtual; +(* done by symtablestack.insertvardata() (JM) { sets the offset for a temp used by the result } procedure set_result_offset;virtual; +*) end; pregvarinfo = ^tregvarinfo; @@ -422,28 +424,32 @@ implementation { !!!!! this means that we can not set the return value in a subfunction !!!!! } { because we don't know yet where the address is } - if not is_void(aktprocdef.rettype.def) then + if not is_void(procdef.rettype.def) then begin - if paramanager.ret_in_reg(aktprocdef.rettype.def,aktprocdef.proccalloption) then + if paramanager.ret_in_reg(procdef.rettype.def,procdef.proccalloption) then begin +(* already done in symtable.pas:tlocalsymtable.insertvardata() (JM) { the space has been set in the local symtable } - procinfo.return_offset:=tg.direction*tfuncretsym(aktprocdef.funcretsym).address; + procinfo.return_offset:=tg.direction*tfuncretsym(procdef.funcretsym).address; +*) if ((procinfo.flags and pi_operator)<>0) and assigned(otsym) then - otsym.address:=tfuncretsym(aktprocdef.funcretsym).address; + otsym.address:=tfuncretsym(procdef.funcretsym).address; rg.usedinproc := rg.usedinproc + - getfuncretusedregisters(aktprocdef.rettype.def,aktprocdef.proccalloption); + getfuncretusedregisters(procdef.rettype.def,procdef.proccalloption); end; end; end; +(* already done in symtable.pas:tlocalsymtable.insertvardata() (JM) procedure tprocinfo.set_result_offset; begin - if paramanager.ret_in_reg(aktprocdef,procdef.proccalloption) then - procinfo.return_offset:=-tfuncretsym(procdef.funcretsym).address; + if paramanager.ret_in_reg(procdef.rettype.def,procdef.proccalloption) then + procinfo.return_offset:=tg.direction*tfuncretsym(procdef.funcretsym).address; end; +*) procedure tprocinfo.after_header; @@ -657,7 +663,13 @@ begin end. { $Log$ - Revision 1.38 2003-03-28 19:16:56 peter + Revision 1.39 2003-04-05 21:09:31 jonas + * several ppc/generic result offset related fixes. The "normal" result + offset seems now to be calculated correctly and a lot of duplicate + calculations have been removed. Nested functions accessing the parent's + function result don't work at all though :( + + Revision 1.38 2003/03/28 19:16:56 peter * generic constructor working for i386 * remove fixed self register * esi added as address register for i386 diff --git a/compiler/powerpc/cpupi.pas b/compiler/powerpc/cpupi.pas index 70eb220214..2349654a47 100644 --- a/compiler/powerpc/cpupi.pas +++ b/compiler/powerpc/cpupi.pas @@ -84,28 +84,38 @@ unit cpupi; { this value is necessary for nested procedures } if assigned(procdef.localst) then procdef.localst.address_fixup:=align(procdef.parast.address_fixup+procdef.parast.datasize,16); - if assigned(aktprocdef.funcretsym) and + +{ + procdef.funcretsym isn't set here yet and besides, + symtable.insertvardata() already sets procinfo.return_offset! (JM) + if assigned(procdef.funcretsym) and not(paramanager.ret_in_param(procdef.rettype.def,procdef.proccalloption)) then - procinfo.return_offset:=tg.direction*tfuncretsym(aktprocdef.funcretsym).address+procdef.localst.address_fixup; + procinfo.return_offset:=tg.direction*tfuncretsym(procdef.funcretsym).address+procdef.localst.address_fixup; +} end; procedure tppcprocinfo.after_pass1; var ofs : aword; begin - ofs:=align(maxpushedparasize,16)+LinkageAreaSize; + ofs:=align(maxpushedparasize+LinkageAreaSize,16); inc(procdef.parast.address_fixup,ofs); inc(procinfo.return_offset,ofs); inc(procinfo.framepointer_offset,ofs); inc(procinfo.selfpointer_offset,ofs); + inc(procdef.localst.address_fixup,ofs); if cs_asm_source in aktglobalswitches then aktproccode.insert(Tai_comment.Create(strpnew('Parameter copies start at: r1+'+tostr(procdef.parast.address_fixup)))); - procdef.localst.address_fixup:=align(procdef.parast.address_fixup+procdef.parast.datasize,16); +{ + Already done with an "inc" above now, not sure if it's correct (JM) + procdef.localst.address_fixup:=procdef.parast.address_fixup+procdef.parast.datasize; - if assigned(aktprocdef.funcretsym) and + Already done with an "inc" above, should be correct (JM) + if assigned(procdef.funcretsym) and not(paramanager.ret_in_param(procdef.rettype.def,procdef.proccalloption)) then - procinfo.return_offset:=tg.direction*tfuncretsym(aktprocdef.funcretsym).address+procdef.localst.address_fixup; + procinfo.return_offset:=tg.direction*tfuncretsym(procdef.funcretsym).address+procdef.localst.address_fixup; +} if cs_asm_source in aktglobalswitches then aktproccode.insert(Tai_comment.Create(strpnew('Locals start at: r1+'+tostr(procdef.localst.address_fixup)))); @@ -124,7 +134,13 @@ begin end. { $Log$ - Revision 1.6 2002-12-15 19:22:01 florian + Revision 1.7 2003-04-05 21:09:32 jonas + * several ppc/generic result offset related fixes. The "normal" result + offset seems now to be calculated correctly and a lot of duplicate + calculations have been removed. Nested functions accessing the parent's + function result don't work at all though :( + + Revision 1.6 2002/12/15 19:22:01 florian * fixed some crashes and a rte 201 Revision 1.5 2002/11/18 17:32:01 peter diff --git a/compiler/psub.pas b/compiler/psub.pas index 612accdb16..23b8f938a6 100644 --- a/compiler/psub.pas +++ b/compiler/psub.pas @@ -117,7 +117,10 @@ implementation symtablestack.insertvardata(aktprocdef.funcretsym); akttokenpos:=storepos; +(* already done by + symtablestack.insertvardata(aktprocdef.funcretsym); above (JM) procinfo.set_result_offset; +*) { insert result also if support is on } if (m_result in aktmodeswitches) then begin @@ -854,7 +857,13 @@ implementation end. { $Log$ - Revision 1.95 2003-04-02 16:11:34 peter + Revision 1.96 2003-04-05 21:09:31 jonas + * several ppc/generic result offset related fixes. The "normal" result + offset seems now to be calculated correctly and a lot of duplicate + calculations have been removed. Nested functions accessing the parent's + function result don't work at all though :( + + Revision 1.95 2003/04/02 16:11:34 peter * give error when exports is not supported Revision 1.94 2003/03/12 22:43:38 jonas diff --git a/compiler/symtable.pas b/compiler/symtable.pas index 55cd2fc264..f9cdaa8928 100644 --- a/compiler/symtable.pas +++ b/compiler/symtable.pas @@ -288,7 +288,7 @@ implementation gdb, {$endif GDB} { codegen } - cgbase + cgbase,tgobj ; @@ -1332,9 +1332,15 @@ implementation l:=tfuncretsym(sym).returntype.def.size; varalign:=size_2_align(l); varalign:=used_align(varalign,aktalignment.localalignmin,dataalignment); +{$ifdef powerpc} + { on the powerpc, the local variables are accessed with a positiv offset } + tfuncretsym(sym).address:=align(datasize,varalign); + datasize:=tfuncretsym(sym).address+l; +{$else powerpc} tfuncretsym(sym).address:=align(datasize+l,varalign); datasize:=tfuncretsym(sym).address; - procinfo.return_offset:=-tfuncretsym(sym).address; +{$endif powerpc} + procinfo.return_offset:=tg.direction*tfuncretsym(sym).address; end; end; end; @@ -2451,7 +2457,13 @@ implementation end. { $Log$ - Revision 1.91 2003-03-17 18:56:49 peter + Revision 1.92 2003-04-05 21:09:32 jonas + * several ppc/generic result offset related fixes. The "normal" result + offset seems now to be calculated correctly and a lot of duplicate + calculations have been removed. Nested functions accessing the parent's + function result don't work at all though :( + + Revision 1.91 2003/03/17 18:56:49 peter * ignore hints for default parameter values Revision 1.90 2003/03/17 16:54:41 peter