mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-03 22:58:51 +02:00
* turned {$ifdef cputargethasfixedstack} into "if use_fixed_stack"
* fixed i386 parameter passing of function calls nested in parameters of functions which also need the stack to pass poarameters git-svn-id: trunk@2847 -
This commit is contained in:
parent
41eba7dffe
commit
fad5d59bd9
@ -194,8 +194,13 @@ uses
|
||||
{$ifdef i386}
|
||||
result := (target_info.system = system_i386_darwin);
|
||||
{$else i386}
|
||||
{$ifdef cputargethasfixedstack}
|
||||
result := true;
|
||||
{$else cputargethasfixedstack}
|
||||
result := false;
|
||||
{$endif cputargethasfixedstack}
|
||||
{$endif i386}
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
@ -618,7 +618,8 @@ unit cpupara;
|
||||
begin
|
||||
paraloc:=parasym.paraloc[callerside].location;
|
||||
{ No need for temps when value is pushed }
|
||||
if assigned(paraloc) and
|
||||
if not(use_fixed_stack) and
|
||||
assigned(paraloc) and
|
||||
(paraloc^.loc=LOC_REFERENCE) and
|
||||
(paraloc^.reference.index=NR_STACK_POINTER_REG) then
|
||||
duplicateparaloc(list,calloption,parasym,cgpara)
|
||||
|
@ -166,7 +166,8 @@ implementation
|
||||
LOC_CREFERENCE :
|
||||
begin
|
||||
size:=align(left.resulttype.def.size,tempcgpara.alignment);
|
||||
if tempcgpara.location^.reference.index=NR_STACK_POINTER_REG then
|
||||
if (not use_fixed_stack) and
|
||||
(tempcgpara.location^.reference.index=NR_STACK_POINTER_REG) then
|
||||
cg.a_param_ref(exprasmlist,left.location.size,left.location.reference,tempcgpara)
|
||||
else
|
||||
begin
|
||||
@ -696,10 +697,8 @@ implementation
|
||||
callerparaloc,
|
||||
tmpparaloc : pcgparalocation;
|
||||
sizeleft: aint;
|
||||
{$ifdef cputargethasfixedstack}
|
||||
htempref,
|
||||
href : treference;
|
||||
{$endif cputargethasfixedstack}
|
||||
begin
|
||||
{ copy all resources to the allocated registers }
|
||||
ppn:=tcgcallparanode(left);
|
||||
@ -750,37 +749,38 @@ implementation
|
||||
end;
|
||||
LOC_REFERENCE:
|
||||
begin
|
||||
{$ifdef cputargethasfixedstack}
|
||||
{ Can't have a data copied to the stack, every location
|
||||
must contain a valid size field }
|
||||
if use_fixed_stack then
|
||||
begin
|
||||
{ Can't have a data copied to the stack, every location
|
||||
must contain a valid size field }
|
||||
|
||||
if (ppn.tempcgpara.size=OS_NO) and
|
||||
((tmpparaloc^.loc<>LOC_REFERENCE) or
|
||||
assigned(tmpparaloc^.next)) then
|
||||
internalerror(200501281);
|
||||
reference_reset_base(href,callerparaloc^.reference.index,callerparaloc^.reference.offset);
|
||||
{ copy parameters in case they were moved to a temp. location because we've a fixed stack }
|
||||
case tmpparaloc^.loc of
|
||||
if (ppn.tempcgpara.size=OS_NO) and
|
||||
((tmpparaloc^.loc<>LOC_REFERENCE) or
|
||||
assigned(tmpparaloc^.next)) then
|
||||
internalerror(200501281);
|
||||
reference_reset_base(href,callerparaloc^.reference.index,callerparaloc^.reference.offset);
|
||||
{ copy parameters in case they were moved to a temp. location because we've a fixed stack }
|
||||
case tmpparaloc^.loc of
|
||||
LOC_REFERENCE:
|
||||
begin
|
||||
reference_reset_base(htempref,tmpparaloc^.reference.index,tmpparaloc^.reference.offset);
|
||||
{ use concatcopy, because it can also be a float which fails when
|
||||
load_ref_ref is used }
|
||||
if (ppn.tempcgpara.size <> OS_NO) then
|
||||
cg.g_concatcopy(exprasmlist,htempref,href,tcgsize2size[tmpparaloc^.size])
|
||||
else
|
||||
cg.g_concatcopy(exprasmlist,htempref,href,sizeleft)
|
||||
end;
|
||||
LOC_REGISTER:
|
||||
cg.a_load_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.size,tmpparaloc^.register,href);
|
||||
LOC_FPUREGISTER:
|
||||
cg.a_loadfpu_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.register,href);
|
||||
LOC_MMREGISTER:
|
||||
cg.a_loadmm_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.size,tmpparaloc^.register,href,mms_movescalar);
|
||||
else
|
||||
internalerror(200402081);
|
||||
begin
|
||||
reference_reset_base(htempref,tmpparaloc^.reference.index,tmpparaloc^.reference.offset);
|
||||
{ use concatcopy, because it can also be a float which fails when
|
||||
load_ref_ref is used }
|
||||
if (ppn.tempcgpara.size <> OS_NO) then
|
||||
cg.g_concatcopy(exprasmlist,htempref,href,tcgsize2size[tmpparaloc^.size])
|
||||
else
|
||||
cg.g_concatcopy(exprasmlist,htempref,href,sizeleft)
|
||||
end;
|
||||
LOC_REGISTER:
|
||||
cg.a_load_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.size,tmpparaloc^.register,href);
|
||||
LOC_FPUREGISTER:
|
||||
cg.a_loadfpu_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.register,href);
|
||||
LOC_MMREGISTER:
|
||||
cg.a_loadmm_reg_ref(exprasmlist,tmpparaloc^.size,tmpparaloc^.size,tmpparaloc^.register,href,mms_movescalar);
|
||||
else
|
||||
internalerror(200402081);
|
||||
end;
|
||||
end;
|
||||
{$endif cputargethasfixedstack}
|
||||
end;
|
||||
end;
|
||||
dec(sizeleft,tcgsize2size[tmpparaloc^.size]);
|
||||
|
@ -200,9 +200,8 @@ implementation
|
||||
LOC_REFERENCE,
|
||||
LOC_CREFERENCE :
|
||||
begin
|
||||
{$ifdef cputargethasfixedstack}
|
||||
location_freetemp(list,location);
|
||||
{$endif cputargethasfixedstack}
|
||||
if use_fixed_stack then
|
||||
location_freetemp(list,location);
|
||||
end;
|
||||
else
|
||||
internalerror(2004110211);
|
||||
|
@ -251,9 +251,7 @@ implementation
|
||||
procedure tparamanager.freeparaloc(list: taasmoutput; const cgpara: TCGPara);
|
||||
var
|
||||
paraloc : Pcgparalocation;
|
||||
{$ifdef cputargethasfixedstack}
|
||||
href : treference;
|
||||
{$endif cputargethasfixedstack}
|
||||
begin
|
||||
paraloc:=cgpara.location;
|
||||
while assigned(paraloc) do
|
||||
@ -282,13 +280,14 @@ implementation
|
||||
LOC_REFERENCE,
|
||||
LOC_CREFERENCE :
|
||||
begin
|
||||
{$ifdef cputargethasfixedstack}
|
||||
{ don't use reference_reset_base, because that will depend on cgobj }
|
||||
fillchar(href,sizeof(href),0);
|
||||
href.base:=paraloc^.reference.index;
|
||||
href.offset:=paraloc^.reference.offset;
|
||||
tg.ungettemp(list,href);
|
||||
{$endif cputargethasfixedstack}
|
||||
if use_fixed_stack then
|
||||
begin
|
||||
{ don't use reference_reset_base, because that will depend on cgobj }
|
||||
fillchar(href,sizeof(href),0);
|
||||
href.base:=paraloc^.reference.index;
|
||||
href.offset:=paraloc^.reference.offset;
|
||||
tg.ungettemp(list,href);
|
||||
end;
|
||||
end;
|
||||
else
|
||||
internalerror(2004110212);
|
||||
|
Loading…
Reference in New Issue
Block a user