mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 19:05:54 +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
|
for i:=0 to paras.count-1 do
|
||||||
begin
|
begin
|
||||||
hp:=tparavarsym(paras[i]);
|
hp:=tparavarsym(paras[i]);
|
||||||
|
paradef:=hp.vardef;
|
||||||
|
|
||||||
|
hp.paraloc[side].reset;
|
||||||
|
|
||||||
{ currently only support C-style array of const,
|
{ currently only support C-style array of const,
|
||||||
there should be no location assigned to the vararg array itself }
|
there should be no location assigned to the vararg array itself }
|
||||||
if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
|
if (p.proccalloption in [pocall_cdecl,pocall_cppdecl]) and
|
||||||
is_array_of_const(hp.vardef) then
|
is_array_of_const(paradef) then
|
||||||
begin
|
begin
|
||||||
paraloc:=hp.paraloc[side].add_location;
|
paraloc:=hp.paraloc[side].add_location;
|
||||||
{ hack: the paraloc must be valid, but is not actually used }
|
{ hack: the paraloc must be valid, but is not actually used }
|
||||||
@ -241,32 +245,43 @@ unit cpupara;
|
|||||||
break;
|
break;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if push_addr_param(hp.varspez,hp.vardef,p.proccalloption) then
|
if (hp.varspez in [vs_var,vs_out]) or
|
||||||
paracgsize:=OS_ADDR
|
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
|
else
|
||||||
begin
|
begin
|
||||||
paracgsize:=def_cgSize(hp.vardef);
|
if not is_special_array(paradef) then
|
||||||
if paracgsize=OS_NO then
|
paralen := paradef.size
|
||||||
paracgsize:=OS_ADDR;
|
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;
|
end;
|
||||||
|
|
||||||
hp.paraloc[side].reset;
|
|
||||||
hp.paraloc[side].size:=paracgsize;
|
hp.paraloc[side].size:=paracgsize;
|
||||||
hp.paraloc[side].Alignment:=std_param_align;
|
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;
|
hp.paraloc[side].intsize:=paralen;
|
||||||
|
|
||||||
{$ifdef EXTDEBUG}
|
{$ifdef EXTDEBUG}
|
||||||
if paralen=0 then
|
if paralen=0 then
|
||||||
internalerror(200410311);
|
internalerror(200410311);
|
||||||
|
Loading…
Reference in New Issue
Block a user