mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-13 11:59:19 +02:00
* don't use the paracgsize in get_paraloc_def(), because it generally
contains the tcgsize of the entire parameter rather than only of what is left (-> calculate it from the remaining parameter length) git-svn-id: trunk@24776 -
This commit is contained in:
parent
e3594452b5
commit
9938169d2c
@ -439,7 +439,7 @@ unit cpupara;
|
|||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
paraloc^.size:=paracgsize;
|
paraloc^.size:=paracgsize;
|
||||||
paraloc^.def:=get_paraloc_def(paradef,paracgsize,paralen,firstparaloc);
|
paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc);
|
||||||
end;
|
end;
|
||||||
case loc of
|
case loc of
|
||||||
LOC_REGISTER:
|
LOC_REGISTER:
|
||||||
|
@ -366,7 +366,7 @@ unit cpupara;
|
|||||||
{ LOC_REFERENCE covers always the overleft }
|
{ LOC_REFERENCE covers always the overleft }
|
||||||
paraloc^.loc:=LOC_REFERENCE;
|
paraloc^.loc:=LOC_REFERENCE;
|
||||||
paraloc^.size:=int_cgsize(paralen);
|
paraloc^.size:=int_cgsize(paralen);
|
||||||
paraloc^.def:=get_paraloc_def(paradef,paracgsize,paralen,firstparaloc);
|
paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc);
|
||||||
|
|
||||||
if (side=callerside) then
|
if (side=callerside) then
|
||||||
paraloc^.reference.index:=NR_STACK_POINTER_REG;
|
paraloc^.reference.index:=NR_STACK_POINTER_REG;
|
||||||
|
@ -531,7 +531,7 @@ unit cpupara;
|
|||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
l:=paralen;
|
l:=paralen;
|
||||||
paraloc^.def:=get_paraloc_def(paradef,paracgsize,l,firstparaloc);
|
paraloc^.def:=get_paraloc_def(paradef,l,firstparaloc);
|
||||||
end;
|
end;
|
||||||
paraloc^.size:=int_cgsize(l);
|
paraloc^.size:=int_cgsize(l);
|
||||||
end;
|
end;
|
||||||
|
@ -396,7 +396,7 @@ unit cpupara;
|
|||||||
{$endif DEBUG_CHARLIE}
|
{$endif DEBUG_CHARLIE}
|
||||||
paraloc^.loc:=LOC_REFERENCE;
|
paraloc^.loc:=LOC_REFERENCE;
|
||||||
paraloc^.size:=int_cgsize(paralen);
|
paraloc^.size:=int_cgsize(paralen);
|
||||||
paraloc^.def:=get_paraloc_def(paradef,paraloc^.size,paralen,firstparaloc);
|
paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc);
|
||||||
if (side = callerside) then
|
if (side = callerside) then
|
||||||
paraloc^.reference.index:=NR_STACK_POINTER_REG
|
paraloc^.reference.index:=NR_STACK_POINTER_REG
|
||||||
else
|
else
|
||||||
|
@ -463,7 +463,7 @@ implementation
|
|||||||
begin
|
begin
|
||||||
paraloc^.loc:=LOC_REFERENCE;
|
paraloc^.loc:=LOC_REFERENCE;
|
||||||
paraloc^.size:=int_cgsize(paralen);
|
paraloc^.size:=int_cgsize(paralen);
|
||||||
paraloc^.def:=get_paraloc_def(locdef,paraloc^.size,paralen,firstparaloc);
|
paraloc^.def:=get_paraloc_def(locdef,paralen,firstparaloc);
|
||||||
|
|
||||||
if side=callerside then
|
if side=callerside then
|
||||||
begin
|
begin
|
||||||
|
@ -151,9 +151,9 @@ unit paramgr;
|
|||||||
function handle_common_ret_in_param(def:tdef;pd:tabstractprocdef;out retinparam:boolean):boolean;
|
function handle_common_ret_in_param(def:tdef;pd:tabstractprocdef;out retinparam:boolean):boolean;
|
||||||
|
|
||||||
{ returns the def to use for a tparalocation part of a cgpara for paradef,
|
{ returns the def to use for a tparalocation part of a cgpara for paradef,
|
||||||
for which the tcgsize is locsize and the integer length is restlen.
|
for which the def is paradef and the integer length is restlen.
|
||||||
fullsize is true if restlen equals the full paradef size }
|
fullsize is true if restlen equals the full paradef size }
|
||||||
function get_paraloc_def(paradef: tdef; paracgsize: tcgsize; restlen: aint; fullsize: boolean): tdef;
|
function get_paraloc_def(paradef: tdef; restlen: aint; fullsize: boolean): tdef;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -610,14 +610,14 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function tparamanager.get_paraloc_def(paradef: tdef; paracgsize: tcgsize; restlen: aint; fullsize: boolean): tdef;
|
function tparamanager.get_paraloc_def(paradef: tdef; restlen: aint; fullsize: boolean): tdef;
|
||||||
begin
|
begin
|
||||||
if fullsize then
|
if fullsize then
|
||||||
result:=paradef
|
result:=paradef
|
||||||
{ no support for 128 bit ints -> tcgsize2orddef can't handle
|
{ no support for 128 bit ints -> tcgsize2orddef can't handle
|
||||||
OS_(S)128 }
|
OS_(S)128 }
|
||||||
else if not(paracgsize in [OS_NO,OS_128,OS_S128]) then
|
else if restlen in [1,2,4,8] then
|
||||||
result:=cgsize_orddef(paracgsize)
|
result:=cgsize_orddef(int_cgsize(paracgsize))
|
||||||
else
|
else
|
||||||
result:=getarraydef(u8inttype,restlen);
|
result:=getarraydef(u8inttype,restlen);
|
||||||
end;
|
end;
|
||||||
|
@ -480,7 +480,7 @@ unit cpupara;
|
|||||||
if (paradef.typ<>orddef) then
|
if (paradef.typ<>orddef) then
|
||||||
begin
|
begin
|
||||||
paracgsize:=int_cgsize(paralen);
|
paracgsize:=int_cgsize(paralen);
|
||||||
locdef:=get_paraloc_def(paradef,paracgsize,paralen,firstparaloc);
|
locdef:=get_paraloc_def(paradef,paralen,firstparaloc);
|
||||||
end;
|
end;
|
||||||
if (paracgsize in [OS_NO,OS_64,OS_S64,OS_128,OS_S128]) then
|
if (paracgsize in [OS_NO,OS_64,OS_S64,OS_128,OS_S128]) then
|
||||||
begin
|
begin
|
||||||
|
@ -387,7 +387,7 @@ begin
|
|||||||
if (paracgsize <> OS_NO) and (paradef.typ <> orddef) then
|
if (paracgsize <> OS_NO) and (paradef.typ <> orddef) then
|
||||||
begin
|
begin
|
||||||
paracgsize := int_cgsize(paralen);
|
paracgsize := int_cgsize(paralen);
|
||||||
locdef:=get_paraloc_def(paradef,paracgsize,paralen,firstparaloc);
|
locdef:=get_paraloc_def(paradef,paralen,firstparaloc);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ aix requires that record data (including partial data) stored in
|
{ aix requires that record data (including partial data) stored in
|
||||||
|
Loading…
Reference in New Issue
Block a user