mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-19 21:19:31 +02:00
* cleanedup cpupara
git-svn-id: trunk@5087 -
This commit is contained in:
parent
3c5d82d2d1
commit
293638230a
@ -228,10 +228,14 @@ unit cpupara;
|
||||
for i:=0 to paras.count-1 do
|
||||
begin
|
||||
hp:=tparavarsym(paras[i]);
|
||||
paradef:=hp.vardef;
|
||||
|
||||
hp.paraloc[side].reset;
|
||||
|
||||
{ currently only support C-style array of const,
|
||||
there should be no location assigned to the vararg array itself }
|
||||
if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
|
||||
is_array_of_const(hp.vardef) then
|
||||
is_array_of_const(paradef) then
|
||||
begin
|
||||
paraloc:=hp.paraloc[side].add_location;
|
||||
{ hack: the paraloc must be valid, but is not actually used }
|
||||
@ -241,32 +245,43 @@ unit cpupara;
|
||||
break;
|
||||
end;
|
||||
|
||||
if push_addr_param(hp.varspez,hp.vardef,p.proccalloption) then
|
||||
paracgsize:=OS_ADDR
|
||||
if (hp.varspez in [vs_var,vs_out]) or
|
||||
push_addr_param(hp.varspez,paradef,p.proccalloption) or
|
||||
is_open_array(paradef) or
|
||||
is_array_of_const(paradef) then
|
||||
begin
|
||||
paradef:=voidpointertype;
|
||||
loc:=LOC_REGISTER;
|
||||
paracgsize := OS_ADDR;
|
||||
paralen := tcgsize2size[OS_ADDR];
|
||||
end
|
||||
else
|
||||
begin
|
||||
paracgsize:=def_cgSize(hp.vardef);
|
||||
if paracgsize=OS_NO then
|
||||
paracgsize:=OS_ADDR;
|
||||
if not is_special_array(paradef) then
|
||||
paralen := paradef.size
|
||||
else
|
||||
paralen := tcgsize2size[def_cgsize(paradef)];
|
||||
loc := getparaloc(p.proccalloption,paradef);
|
||||
if (paradef.deftype in [objectdef,arraydef,recorddef]) and
|
||||
not is_special_array(paradef) and
|
||||
(hp.varspez in [vs_value,vs_const]) then
|
||||
paracgsize := int_cgsize(paralen)
|
||||
else
|
||||
begin
|
||||
paracgsize:=def_cgsize(paradef);
|
||||
{ for things like formaldef }
|
||||
if (paracgsize=OS_NO) then
|
||||
begin
|
||||
paracgsize:=OS_ADDR;
|
||||
paralen := tcgsize2size[OS_ADDR];
|
||||
end;
|
||||
end
|
||||
end;
|
||||
|
||||
hp.paraloc[side].reset;
|
||||
hp.paraloc[side].size:=paracgsize;
|
||||
hp.paraloc[side].Alignment:=std_param_align;
|
||||
|
||||
if (hp.varspez in [vs_var,vs_out]) then
|
||||
begin
|
||||
paradef:=voidpointertype;
|
||||
loc:=LOC_REGISTER;
|
||||
end
|
||||
else
|
||||
begin
|
||||
paradef:=hp.vardef;
|
||||
loc:=getparaloc(p.proccalloption,paradef);
|
||||
end;
|
||||
|
||||
paralen:=tcgsize2size[paracgsize];
|
||||
hp.paraloc[side].intsize:=paralen;
|
||||
|
||||
{$ifdef EXTDEBUG}
|
||||
if paralen=0 then
|
||||
internalerror(200410311);
|
||||
|
Loading…
Reference in New Issue
Block a user