diff --git a/compiler/new/cgbase.pas b/compiler/new/cgbase.pas index 709b868137..66cfa4f8bf 100644 --- a/compiler/new/cgbase.pas +++ b/compiler/new/cgbase.pas @@ -74,7 +74,7 @@ unit cgbase; { firsttemp position } firsttemp_offset : longint; { parameter offset } - call_offset : longint; + para_offset : longint; { every register which must be saved by the entry code } { (and restored by the exit code) must be in that set } @@ -329,7 +329,7 @@ unit cgbase; selfpointer_offset:=0; return_offset:=0; firsttemp_offset:=0; - call_offset:=0; + para_offset:=0; registerstosave:=[]; flags:=0; framepointer:=R_NO; @@ -515,7 +515,11 @@ unit cgbase; end. { $Log$ - Revision 1.16 2000-02-17 14:48:36 florian + Revision 1.17 2000-02-20 20:49:46 florian + * newcg is compiling + * fixed the dup id problem reported by Paul Y. + + Revision 1.16 2000/02/17 14:48:36 florian * updated to use old firstpass Revision 1.15 2000/01/07 01:14:52 peter diff --git a/compiler/new/cgobj.pas b/compiler/new/cgobj.pas index 4c46135a7c..d6ee9da251 100644 --- a/compiler/new/cgobj.pas +++ b/compiler/new/cgobj.pas @@ -485,7 +485,7 @@ unit cgobj; a_param_ref_addr(list,hr,2); reset_reference(hr); hr.base:=procinfo^.framepointer; - hr.offset:=pvarsym(p)^.address+procinfo^.call_offset; + hr.offset:=pvarsym(p)^.address+procinfo^.para_offset; a_param_ref_addr(list,hr,1); reset_reference(hr); a_call_name(list,'FPC_ADDREF',0); @@ -523,7 +523,7 @@ unit cgobj; parasymtable: begin hr.base:=procinfo^.framepointer; - hr.offset:=pvarsym(p)^.address+procinfo^.call_offset; + hr.offset:=pvarsym(p)^.address+procinfo^.para_offset; end; else hr.symbol:=newasmsymbol(pvarsym(p)^.mangledname); @@ -644,14 +644,14 @@ unit cgobj; if (aktprocsym^.definition^.proctypeoption in [potype_unitinit,potype_proginit,potype_unitfinalize]) then parasize:=0 else - parasize:=aktprocsym^.definition^.parast^.datasize+procinfo^.call_offset-pointersize; + parasize:=aktprocsym^.definition^.parast^.datasize+procinfo^.para_offset-pointersize; end else begin if (aktprocsym^.definition^.proctypeoption in [potype_unitinit,potype_proginit,potype_unitfinalize]) then parasize:=0 else - parasize:=aktprocsym^.definition^.parast^.datasize+procinfo^.call_offset-pointersize*2; + parasize:=aktprocsym^.definition^.parast^.datasize+procinfo^.para_offset-pointersize*2; nostackframe:=false; if (po_interrupt in aktprocsym^.definition^.procoptions) then @@ -1116,7 +1116,11 @@ unit cgobj; end. { $Log$ - Revision 1.33 2000-01-07 01:14:53 peter + Revision 1.34 2000-02-20 20:49:46 florian + * newcg is compiling + * fixed the dup id problem reported by Paul Y. + + Revision 1.33 2000/01/07 01:14:53 peter * updated copyright to 2000 Revision 1.32 1999/12/01 12:42:33 peter @@ -1225,4 +1229,3 @@ end. + first version, derived from old routines } - diff --git a/compiler/new/pass_2.pas b/compiler/new/pass_2.pas index 5d3335ec4a..4eeefdbbcd 100644 --- a/compiler/new/pass_2.pas +++ b/compiler/new/pass_2.pas @@ -31,7 +31,7 @@ uses { produces assembler for the expression in variable p } { and produces an assembler node at the end } -procedure generatecode(var p : pnode); +procedure generatecode(var _p : ptree); { produces the actual code } function do_secondpass(p : pnode) : boolean; @@ -44,7 +44,7 @@ implementation globtype,systems, cobjects,verbose,comphook,globals,files, symconst,symtable,types,aasm,scanner, - pass_1,tgobj,cgbase,cgobj,tgcpu,cpuasm,cpubase + pass_1,tgobj,cgbase,cgobj,tgcpu,cpuasm,cpubase,convtree {$ifdef GDB} ,gdb {$endif} @@ -259,13 +259,14 @@ implementation end; end; - procedure generatecode(var p : pnode); + procedure generatecode(var _p : ptree); var i : longint; hr : preference; {$ifdef i386} regsize : topsize; {$endif i386} + p : pnode; label nextreg; @@ -282,8 +283,9 @@ implementation tg.clearregistercount; use_esp_stackframe:=false; - if not(do_firstpassnode(p)) then + if not(do_firstpass(_p)) then begin + p:=convtree2node(_p); { max. optimizations } { only if no asm is used } { and no try statement } @@ -318,8 +320,8 @@ implementation if procinfo^.return_offset>=0 then dec(procinfo^.return_offset,4); - dec(procinfo^.call_offset,4); - aktprocsym^.definition^.parast^.address_fixup:=procinfo^.call_offset; + dec(procinfo^.para_offset,4); + aktprocsym^.definition^.parast^.address_fixup:=procinfo^.para_offset; end; end; if (p^.registersint