* moved storing of register parameters to memory even earlier in the

entry code to fix problems with constructors
This commit is contained in:
Jonas Maebe 2003-05-10 13:20:23 +00:00
parent 409e9c5606
commit 17906f62d2

View File

@ -1308,6 +1308,57 @@ implementation
code, since temp. allocation might occur before - carl
}
if assigned(current_procdef.parast) then
begin
if not (po_assembler in current_procdef.procoptions) then
begin
{ move register parameters which aren't regable into memory }
{ we do this before init_paras because that one calls routines which may overwrite these }
{ registers and it also expects the values to be in memory }
hp:=tparaitem(current_procdef.para.first);
while assigned(hp) do
begin
if Tvarsym(hp.parasym).reg.enum>lastreg then
internalerror(200301081);
if (tvarsym(hp.parasym).reg.enum<>R_NO) then
case hp.paraloc.loc of
LOC_CREGISTER,
LOC_REGISTER:
// if not(hp.paraloc.size in [OS_S64,OS_64]) then
cg.a_load_reg_reg(list,hp.paraloc.size,OS_32,hp.paraloc.register,tvarsym(hp.parasym).reg);
// else
// cg64.a_load64_reg_reg(list,hp.paraloc.register64,tvarsym(hp.parasym).reg);
LOC_CFPUREGISTER,
LOC_FPUREGISTER:
cg.a_loadfpu_reg_reg(list,hp.paraloc.register,tvarsym(hp.parasym).reg);
end
else if (hp.paraloc.loc in [LOC_REGISTER,LOC_FPUREGISTER,LOC_MMREGISTER,
LOC_CREGISTER,LOC_CFPUREGISTER,LOC_CMMREGISTER]) and
(tvarsym(hp.parasym).reg.enum=R_NO) then
begin
reference_reset_base(href,current_procinfo.framepointer,tvarsym(hp.parasym).address+
tvarsym(hp.parasym).owner.address_fixup);
case hp.paraloc.loc of
LOC_CREGISTER,
LOC_REGISTER:
if not(hp.paraloc.size in [OS_S64,OS_64]) then
cg.a_load_reg_ref(list,hp.paraloc.size,hp.paraloc.register,href)
else
cg64.a_load64_reg_ref(list,hp.paraloc.register64,href);
LOC_FPUREGISTER,
LOC_CFPUREGISTER:
cg.a_loadfpu_reg_ref(list,hp.paraloc.size,hp.paraloc.register,href);
else
internalerror(2002081302);
end;
end;
hp:=tparaitem(hp.next);
end;
end;
end;
{ for the save all registers we can simply use a pusha,popa which
push edi,esi,ebp,esp(ignored),ebx,edx,ecx,eax }
if (po_saveregisters in current_procdef.procoptions) then
@ -1416,55 +1467,10 @@ implementation
{ initialisizes temp. ansi/wide string data }
inittempvariables(list);
{ initialize ansi/widesstring para's }
if assigned(current_procdef.parast) then
begin
current_procdef.parast.foreach_static({$ifndef TP}@{$endif}init_paras,list);
if not (po_assembler in current_procdef.procoptions) then
begin
{ move register parameters which aren't regable into memory }
{ we do this before init_paras because that one calls routines which may overwrite these }
{ registers and it also expects the values to be in memory }
hp:=tparaitem(current_procdef.para.first);
while assigned(hp) do
begin
if Tvarsym(hp.parasym).reg.enum>lastreg then
internalerror(200301081);
if (tvarsym(hp.parasym).reg.enum<>R_NO) then
case hp.paraloc.loc of
LOC_CREGISTER,
LOC_REGISTER:
// if not(hp.paraloc.size in [OS_S64,OS_64]) then
cg.a_load_reg_reg(list,hp.paraloc.size,OS_32,hp.paraloc.register,tvarsym(hp.parasym).reg);
// else
// cg64.a_load64_reg_reg(list,hp.paraloc.register64,tvarsym(hp.parasym).reg);
LOC_CFPUREGISTER,
LOC_FPUREGISTER:
cg.a_loadfpu_reg_reg(list,hp.paraloc.register,tvarsym(hp.parasym).reg);
end
else if (hp.paraloc.loc in [LOC_REGISTER,LOC_FPUREGISTER,LOC_MMREGISTER,
LOC_CREGISTER,LOC_CFPUREGISTER,LOC_CMMREGISTER]) and
(tvarsym(hp.parasym).reg.enum=R_NO) then
begin
reference_reset_base(href,current_procinfo.framepointer,tvarsym(hp.parasym).address+
tvarsym(hp.parasym).owner.address_fixup);
case hp.paraloc.loc of
LOC_CREGISTER,
LOC_REGISTER:
if not(hp.paraloc.size in [OS_S64,OS_64]) then
cg.a_load_reg_ref(list,hp.paraloc.size,hp.paraloc.register,href)
else
cg64.a_load64_reg_ref(list,hp.paraloc.register64,href);
LOC_FPUREGISTER,
LOC_CFPUREGISTER:
cg.a_loadfpu_reg_ref(list,hp.paraloc.size,hp.paraloc.register,href);
else
internalerror(2002081302);
end;
end;
hp:=tparaitem(hp.next);
end;
end;
end;
{ generate copies of call by value parameters }
@ -2007,7 +2013,11 @@ implementation
end.
{
$Log$
Revision 1.96 2003-05-09 17:47:02 peter
Revision 1.97 2003-05-10 13:20:23 jonas
* moved storing of register parameters to memory even earlier in the
entry code to fix problems with constructors
Revision 1.96 2003/05/09 17:47:02 peter
* self moved to hidden parameter
* removed hdisposen,hnewn,selfn