|
@@ -394,6 +394,7 @@ unit cpupara;
|
|
var
|
|
var
|
|
i : integer;
|
|
i : integer;
|
|
hp : tparavarsym;
|
|
hp : tparavarsym;
|
|
|
|
+ paradef : tdef;
|
|
paraloc : pcgparalocation;
|
|
paraloc : pcgparalocation;
|
|
l,
|
|
l,
|
|
paralen,
|
|
paralen,
|
|
@@ -425,15 +426,17 @@ unit cpupara;
|
|
(not(p.proccalloption in pushleftright_pocalls) and (i<=paras.count-1)) do
|
|
(not(p.proccalloption in pushleftright_pocalls) and (i<=paras.count-1)) do
|
|
begin
|
|
begin
|
|
hp:=tparavarsym(paras[i]);
|
|
hp:=tparavarsym(paras[i]);
|
|
- pushaddr:=push_addr_param(hp.varspez,hp.vardef,p.proccalloption);
|
|
|
|
|
|
+ paradef:=hp.vardef;
|
|
|
|
+ pushaddr:=push_addr_param(hp.varspez,paradef,p.proccalloption);
|
|
if pushaddr then
|
|
if pushaddr then
|
|
begin
|
|
begin
|
|
paralen:=sizeof(aint);
|
|
paralen:=sizeof(aint);
|
|
paracgsize:=OS_ADDR;
|
|
paracgsize:=OS_ADDR;
|
|
|
|
+ paradef:=getpointerdef(paradef);
|
|
end
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
- paralen:=push_size(hp.varspez,hp.vardef,p.proccalloption);
|
|
|
|
|
|
+ paralen:=push_size(hp.varspez,paradef,p.proccalloption);
|
|
{ darwin/x86 requires that parameters < sizeof(aint) are sign/ }
|
|
{ darwin/x86 requires that parameters < sizeof(aint) are sign/ }
|
|
{ zero extended to sizeof(aint) }
|
|
{ zero extended to sizeof(aint) }
|
|
if (target_info.system in [system_i386_darwin,system_i386_iphonesim]) and
|
|
if (target_info.system in [system_i386_darwin,system_i386_iphonesim]) and
|
|
@@ -441,15 +444,17 @@ unit cpupara;
|
|
(paralen > 0) and
|
|
(paralen > 0) and
|
|
(paralen < sizeof(aint)) then
|
|
(paralen < sizeof(aint)) then
|
|
begin
|
|
begin
|
|
- paralen := sizeof(aint);
|
|
|
|
|
|
+ paralen:=sizeof(aint);
|
|
paracgsize:=OS_SINT;
|
|
paracgsize:=OS_SINT;
|
|
|
|
+ paradef:=sinttype;
|
|
end
|
|
end
|
|
else
|
|
else
|
|
- paracgsize:=def_cgsize(hp.vardef);
|
|
|
|
|
|
+ paracgsize:=def_cgsize(paradef);
|
|
end;
|
|
end;
|
|
hp.paraloc[side].reset;
|
|
hp.paraloc[side].reset;
|
|
hp.paraloc[side].size:=paracgsize;
|
|
hp.paraloc[side].size:=paracgsize;
|
|
hp.paraloc[side].intsize:=paralen;
|
|
hp.paraloc[side].intsize:=paralen;
|
|
|
|
+ hp.paraloc[side].def:=paradef;
|
|
hp.paraloc[side].Alignment:=paraalign;
|
|
hp.paraloc[side].Alignment:=paraalign;
|
|
{ Copy to stack? }
|
|
{ Copy to stack? }
|
|
if (paracgsize=OS_NO) or
|
|
if (paracgsize=OS_NO) or
|
|
@@ -527,6 +532,7 @@ unit cpupara;
|
|
var parareg,parasize:longint);
|
|
var parareg,parasize:longint);
|
|
var
|
|
var
|
|
hp : tparavarsym;
|
|
hp : tparavarsym;
|
|
|
|
+ paradef : tdef;
|
|
paraloc : pcgparalocation;
|
|
paraloc : pcgparalocation;
|
|
paracgsize : tcgsize;
|
|
paracgsize : tcgsize;
|
|
i : integer;
|
|
i : integer;
|
|
@@ -559,14 +565,15 @@ unit cpupara;
|
|
while true do
|
|
while true do
|
|
begin
|
|
begin
|
|
hp:=tparavarsym(paras[i]);
|
|
hp:=tparavarsym(paras[i]);
|
|
|
|
+ paradef:=hp.vardef;
|
|
if not(assigned(hp.paraloc[side].location)) then
|
|
if not(assigned(hp.paraloc[side].location)) then
|
|
begin
|
|
begin
|
|
-
|
|
|
|
pushaddr:=push_addr_param(hp.varspez,hp.vardef,p.proccalloption);
|
|
pushaddr:=push_addr_param(hp.varspez,hp.vardef,p.proccalloption);
|
|
if pushaddr then
|
|
if pushaddr then
|
|
begin
|
|
begin
|
|
paralen:=sizeof(aint);
|
|
paralen:=sizeof(aint);
|
|
paracgsize:=OS_ADDR;
|
|
paracgsize:=OS_ADDR;
|
|
|
|
+ paradef:=getpointerdef(paradef);
|
|
end
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
@@ -576,6 +583,7 @@ unit cpupara;
|
|
hp.paraloc[side].size:=paracgsize;
|
|
hp.paraloc[side].size:=paracgsize;
|
|
hp.paraloc[side].intsize:=paralen;
|
|
hp.paraloc[side].intsize:=paralen;
|
|
hp.paraloc[side].Alignment:=paraalign;
|
|
hp.paraloc[side].Alignment:=paraalign;
|
|
|
|
+ hp.paraloc[side].def:=paradef;
|
|
{
|
|
{
|
|
EAX
|
|
EAX
|
|
EDX
|
|
EDX
|