* 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:
Jonas Maebe 2006-03-10 23:44:04 +00:00
parent 41eba7dffe
commit fad5d59bd9
5 changed files with 48 additions and 44 deletions

View File

@ -194,8 +194,13 @@ uses
{$ifdef i386} {$ifdef i386}
result := (target_info.system = system_i386_darwin); result := (target_info.system = system_i386_darwin);
{$else i386} {$else i386}
{$ifdef cputargethasfixedstack}
result := true;
{$else cputargethasfixedstack}
result := false; result := false;
{$endif cputargethasfixedstack}
{$endif i386} {$endif i386}
end; end;
end. end.

View File

@ -618,7 +618,8 @@ unit cpupara;
begin begin
paraloc:=parasym.paraloc[callerside].location; paraloc:=parasym.paraloc[callerside].location;
{ No need for temps when value is pushed } { 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^.loc=LOC_REFERENCE) and
(paraloc^.reference.index=NR_STACK_POINTER_REG) then (paraloc^.reference.index=NR_STACK_POINTER_REG) then
duplicateparaloc(list,calloption,parasym,cgpara) duplicateparaloc(list,calloption,parasym,cgpara)

View File

@ -166,7 +166,8 @@ implementation
LOC_CREFERENCE : LOC_CREFERENCE :
begin begin
size:=align(left.resulttype.def.size,tempcgpara.alignment); 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) cg.a_param_ref(exprasmlist,left.location.size,left.location.reference,tempcgpara)
else else
begin begin
@ -696,10 +697,8 @@ implementation
callerparaloc, callerparaloc,
tmpparaloc : pcgparalocation; tmpparaloc : pcgparalocation;
sizeleft: aint; sizeleft: aint;
{$ifdef cputargethasfixedstack}
htempref, htempref,
href : treference; href : treference;
{$endif cputargethasfixedstack}
begin begin
{ copy all resources to the allocated registers } { copy all resources to the allocated registers }
ppn:=tcgcallparanode(left); ppn:=tcgcallparanode(left);
@ -750,7 +749,8 @@ implementation
end; end;
LOC_REFERENCE: LOC_REFERENCE:
begin begin
{$ifdef cputargethasfixedstack} if use_fixed_stack then
begin
{ Can't have a data copied to the stack, every location { Can't have a data copied to the stack, every location
must contain a valid size field } must contain a valid size field }
@ -780,7 +780,7 @@ implementation
else else
internalerror(200402081); internalerror(200402081);
end; end;
{$endif cputargethasfixedstack} end;
end; end;
end; end;
dec(sizeleft,tcgsize2size[tmpparaloc^.size]); dec(sizeleft,tcgsize2size[tmpparaloc^.size]);

View File

@ -200,9 +200,8 @@ implementation
LOC_REFERENCE, LOC_REFERENCE,
LOC_CREFERENCE : LOC_CREFERENCE :
begin begin
{$ifdef cputargethasfixedstack} if use_fixed_stack then
location_freetemp(list,location); location_freetemp(list,location);
{$endif cputargethasfixedstack}
end; end;
else else
internalerror(2004110211); internalerror(2004110211);

View File

@ -251,9 +251,7 @@ implementation
procedure tparamanager.freeparaloc(list: taasmoutput; const cgpara: TCGPara); procedure tparamanager.freeparaloc(list: taasmoutput; const cgpara: TCGPara);
var var
paraloc : Pcgparalocation; paraloc : Pcgparalocation;
{$ifdef cputargethasfixedstack}
href : treference; href : treference;
{$endif cputargethasfixedstack}
begin begin
paraloc:=cgpara.location; paraloc:=cgpara.location;
while assigned(paraloc) do while assigned(paraloc) do
@ -282,13 +280,14 @@ implementation
LOC_REFERENCE, LOC_REFERENCE,
LOC_CREFERENCE : LOC_CREFERENCE :
begin begin
{$ifdef cputargethasfixedstack} if use_fixed_stack then
begin
{ don't use reference_reset_base, because that will depend on cgobj } { don't use reference_reset_base, because that will depend on cgobj }
fillchar(href,sizeof(href),0); fillchar(href,sizeof(href),0);
href.base:=paraloc^.reference.index; href.base:=paraloc^.reference.index;
href.offset:=paraloc^.reference.offset; href.offset:=paraloc^.reference.offset;
tg.ungettemp(list,href); tg.ungettemp(list,href);
{$endif cputargethasfixedstack} end;
end; end;
else else
internalerror(2004110212); internalerror(2004110212);