From bf66a6e4ab5a6bf17c9a8a3a3ccc0c209e541e2f Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 25 Sep 2003 16:19:32 +0000 Subject: [PATCH] * fix filepositions * insert spill temp allocations at the start of the proc --- compiler/psub.pas | 14 ++++++++++++-- compiler/rgobj.pas | 27 +++++++++++++++++++++------ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/compiler/psub.pas b/compiler/psub.pas index f5e96ebdf7..a4e3a71e72 100644 --- a/compiler/psub.pas +++ b/compiler/psub.pas @@ -685,6 +685,7 @@ implementation aktproccode.concatlist(templist); { generate symbol and save end of header position } + aktfilepos:=entrypos; gen_proc_symbol(templist); headertai:=tai(templist.last); { add entry code after header } @@ -694,6 +695,7 @@ implementation { Free space in temp/registers for parast and localst, must be done after gen_entry_code } + aktfilepos:=exitpos; if current_procinfo.procdef.localst.symtabletype=localsymtable then gen_free_localst(aktproccode,tlocalsymtable(current_procinfo.procdef.localst)); gen_free_parast(aktproccode,tparasymtable(current_procinfo.procdef.parast)); @@ -718,7 +720,7 @@ implementation inc(spillingcounter); if spillingcounter>maxspillingcounter then internalerror(200309041); - fastspill:=rg.spill_registers(aktproccode,rg.spillednodes); + fastspill:=rg.spill_registers(aktproccode,headertai,rg.spillednodes); end; until (rg.spillednodes='') or not fastspill; aktproccode.translate_registers(rg.colour); @@ -734,13 +736,17 @@ implementation translate_regvars(aktproccode,rg.colour); { Add save and restore of used registers } + aktfilepos:=entrypos; gen_save_used_regs(templist); aktproccode.insertlistafter(headertai,templist); + aktfilepos:=exitpos; gen_restore_used_regs(aktproccode,usesacc,usesacchi,usesfpu); { Add stack allocation code after header } + aktfilepos:=entrypos; gen_stackalloc_code(templist); aktproccode.insertlistafter(headertai,templist); { Add exit code at the end } + aktfilepos:=exitpos; gen_exit_code(templist,false,usesacc,usesacchi); aktproccode.concatlist(templist); @@ -1295,7 +1301,11 @@ begin end. { $Log$ - Revision 1.149 2003-09-23 17:56:06 peter + Revision 1.150 2003-09-25 16:19:32 peter + * fix filepositions + * insert spill temp allocations at the start of the proc + + Revision 1.149 2003/09/23 17:56:06 peter * locals and paras are allocated in the code generation * tvarsym.localloc contains the location of para/local when generating code for the current procedure diff --git a/compiler/rgobj.pas b/compiler/rgobj.pas index 48d38b239d..6428210f66 100644 --- a/compiler/rgobj.pas +++ b/compiler/rgobj.pas @@ -338,7 +338,7 @@ unit rgobj; procedure prepare_colouring; procedure epilogue_colouring; procedure colour_registers; - function spill_registers(list:Taasmoutput;const regs_to_spill:string):boolean; + function spill_registers(list:Taasmoutput;headertai:tai;const regs_to_spill:string):boolean; procedure add_edge(u,v:Tsuperregister); protected cpu_registers:byte; @@ -2034,7 +2034,7 @@ unit rgobj; add_constraints(r); end; - function Trgobj.spill_registers(list:Taasmoutput;const regs_to_spill:string):boolean; + function Trgobj.spill_registers(list:Taasmoutput;headertai:tai;const regs_to_spill:string):boolean; {Returns true if any help registers have been used.} @@ -2042,9 +2042,11 @@ unit rgobj; p,q:Tai; regs_to_spill_set:Tsuperregisterset; spill_temps:^Tspill_temp_list; + templist : taasmoutput; supreg : tsuperregister; begin + aktfilepos:=current_procinfo.entrypos; spill_registers:=false; unusedregsint:=[0..255]; fillchar(degree,sizeof(degree),0); @@ -2059,16 +2061,22 @@ unit rgobj; new(spill_temps); fillchar(spill_temps^,sizeof(spill_temps^),0); regs_to_spill_set:=[]; + { Allocate temps and insert in front of the list } + templist:=taasmoutput.create; for i:=1 to length(regs_to_spill) do begin {Alternative representation.} include(regs_to_spill_set,Tsuperregister(regs_to_spill[i])); {Clear all interferences of the spilled register.} clear_interferences(Tsuperregister(regs_to_spill[i])); - {Get a temp for the spilled register.} - tg.gettemp(list,4,tt_noreuse,spill_temps^[Tsuperregister(regs_to_spill[i])]); + {Get a temp for the spilled register} + tg.gettemp(templist,4,tt_noreuse,spill_temps^[Tsuperregister(regs_to_spill[i])]); end; - p:=Tai(list.first); + list.insertlistafter(headertai,templist); + templist.free; + { Walk through all instructions, we can start with the headertai, + because before the header tai is only symbols } + p:=headertai; while assigned(p) do begin case p.typ of @@ -2091,6 +2099,8 @@ unit rgobj; end; ait_instruction: begin + aktfilepos:=Taicpu_abstract(p).fileinfo + ; if Taicpu_abstract(p).spill_registers(list,@getregisterintinline, @ungetregisterintinline, regs_to_spill_set, @@ -2103,6 +2113,7 @@ unit rgobj; end; p:=Tai(p.next); end; + aktfilepos:=current_procinfo.exitpos; for i:=1 to length(regs_to_spill) do begin tg.ungettemp(list,spill_temps^[Tsuperregister(regs_to_spill[i])]); @@ -2225,7 +2236,11 @@ end. { $Log$ - Revision 1.76 2003-09-16 16:17:01 peter + Revision 1.77 2003-09-25 16:19:32 peter + * fix filepositions + * insert spill temp allocations at the start of the proc + + Revision 1.76 2003/09/16 16:17:01 peter * varspez in calls to push_addr_param Revision 1.75 2003/09/12 19:07:42 daniel