diff --git a/compiler/nld.pas b/compiler/nld.pas index f713865790..d49119a3bf 100644 --- a/compiler/nld.pas +++ b/compiler/nld.pas @@ -267,6 +267,10 @@ implementation { reference in nested procedures, variable needs to be in memory } make_not_regable(self); end; + { static variables referenced in procedures, variable needs to be in memory } + if (symtable.symtabletype=staticsymtable) and + (symtable.symtablelevel<>current_procinfo.procdef.parast.symtablelevel) then + make_not_regable(self); { fix self type which is declared as voidpointer in the definition } if vo_is_self in tvarsym(symtableentry).varoptions then @@ -1141,7 +1145,10 @@ begin end. { $Log$ - Revision 1.129 2004-09-26 17:45:30 peter + Revision 1.130 2004-10-06 19:26:50 jonas + * regvar fixes from Peter + + Revision 1.129 2004/09/26 17:45:30 peter * simple regvar support, not yet finished Revision 1.128 2004/06/20 08:55:29 florian diff --git a/compiler/symsym.pas b/compiler/symsym.pas index 333386c427..7949fe76f9 100644 --- a/compiler/symsym.pas +++ b/compiler/symsym.pas @@ -1375,17 +1375,12 @@ implementation procedure tvarsym.ppuwrite(ppufile:tcompilerppufile); - var - hvo : tvaroptions; begin inherited writesym(ppufile); ppufile.putbyte(byte(varspez)); ppufile.putlongint(fieldoffset); ppufile.puttype(vartype); - { symbols which are load are never candidates for a register, - turn off the regable } - hvo:=varoptions-[vo_regable,vo_fpuregable]; - ppufile.putsmallset(hvo); + ppufile.putsmallset(varoptions); if [vo_is_C_var,vo_is_dll_var]*varoptions<>[] then ppufile.putstring(_mangledname^); ppufile.writeentry(ibvarsym); @@ -2216,7 +2211,10 @@ implementation end. { $Log$ - Revision 1.178 2004-10-01 15:22:22 peter + Revision 1.179 2004-10-06 19:26:50 jonas + * regvar fixes from Peter + + Revision 1.178 2004/10/01 15:22:22 peter * don't add stabs for register variables Revision 1.177 2004/09/26 17:45:30 peter diff --git a/compiler/x86/cgx86.pas b/compiler/x86/cgx86.pas index 7c37f4ebf1..37ad56b7fc 100644 --- a/compiler/x86/cgx86.pas +++ b/compiler/x86/cgx86.pas @@ -1632,13 +1632,17 @@ unit cgx86; var href : treference; r : integer; + hreg : tregister; begin { Copy registers from temp } href:=current_procinfo.save_regs_ref; for r:=low(saved_standard_registers) to high(saved_standard_registers) do if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then begin - a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE)); + hreg:=newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE); + { Allocate register so the optimizer does remove the load } + a_reg_alloc(list,hreg); + a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,hreg); inc(href.offset,sizeof(aint)); end; tg.UnGetTemp(list,current_procinfo.save_regs_ref); @@ -1675,7 +1679,10 @@ unit cgx86; end. { $Log$ - Revision 1.128 2004-10-05 20:41:02 peter + Revision 1.129 2004-10-06 19:27:35 jonas + * regvar fixes from Peter + + Revision 1.128 2004/10/05 20:41:02 peter * more spilling rewrites Revision 1.127 2004/10/04 20:46:22 peter