mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-29 20:39:36 +02:00
* tvarsym.get_push_size replaced by paramanager.push_size
This commit is contained in:
parent
4532dbd680
commit
3d696d9c7c
@ -268,7 +268,7 @@ uses
|
||||
CUtils,
|
||||
globtype,globals,comphook,
|
||||
finput,fmodule,
|
||||
cpuinfo,aasmbase,aasmtai,
|
||||
cpuinfo,aasmbase,aasmtai,paramgr,
|
||||
symsym,symdef,symtype,symbase;
|
||||
|
||||
const
|
||||
@ -1454,7 +1454,7 @@ end;
|
||||
else
|
||||
MemInfo.Size:=getsize;
|
||||
{ this is not completely correct... }
|
||||
MemInfo.PushSize:=getpushsize(pocall_none);
|
||||
MemInfo.PushSize:=paramanager.push_size(varspez,vartype.def,pocall_none);
|
||||
Symbol^.SetMemInfo(MemInfo);
|
||||
end;
|
||||
constsym :
|
||||
@ -2118,7 +2118,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.30 2002-11-24 18:17:29 carl
|
||||
Revision 1.31 2002-11-27 20:04:10 peter
|
||||
* tvarsym.get_push_size replaced by paramanager.push_size
|
||||
|
||||
Revision 1.30 2002/11/24 18:17:29 carl
|
||||
* fix compilation problems after my changes to tcontsym
|
||||
|
||||
Revision 1.29 2002/11/20 22:48:42 pierre
|
||||
|
@ -31,7 +31,7 @@ unit paramgr;
|
||||
uses
|
||||
cpubase,
|
||||
globtype,
|
||||
symtype,symdef;
|
||||
symconst,symtype,symdef;
|
||||
|
||||
type
|
||||
{# This class defines some methods to take care of routine
|
||||
@ -58,6 +58,8 @@ unit paramgr;
|
||||
the address is pushed
|
||||
}
|
||||
function push_addr_param(def : tdef;calloption : tproccalloption) : boolean;virtual;
|
||||
{ return the size of a push }
|
||||
function push_size(varspez:tvarspez;def : tdef;calloption : tproccalloption) : longint;
|
||||
{ Returns true if a parameter needs to be copied on the stack, this
|
||||
is required for cdecl procedures
|
||||
}
|
||||
@ -110,7 +112,7 @@ unit paramgr;
|
||||
|
||||
uses
|
||||
cpuinfo,globals,systems,
|
||||
symconst,symbase,symsym,
|
||||
symbase,symsym,
|
||||
rgobj,
|
||||
defutil,cgbase,cginfo,verbose;
|
||||
|
||||
@ -145,7 +147,8 @@ unit paramgr;
|
||||
begin
|
||||
push_high_param:=is_open_array(def) or
|
||||
is_open_string(def) or
|
||||
is_array_of_const(def);
|
||||
(is_array_of_const(def) and
|
||||
not(calloption in [pocall_cdecl,pocall_cppdecl]));
|
||||
end;
|
||||
|
||||
|
||||
@ -173,7 +176,9 @@ unit paramgr;
|
||||
)
|
||||
) or
|
||||
is_open_array(def) or
|
||||
is_array_of_const(def) or
|
||||
{ array of const for cdecl are only pushed values }
|
||||
(is_array_of_const(def) and
|
||||
not(calloption in [pocall_cdecl,pocall_cppdecl])) or
|
||||
is_array_constructor(def);
|
||||
objectdef :
|
||||
push_addr_param:=is_object(def);
|
||||
@ -224,6 +229,34 @@ unit paramgr;
|
||||
end;
|
||||
|
||||
|
||||
{ return the size of a push }
|
||||
function tparamanager.push_size(varspez:tvarspez;def : tdef;calloption : tproccalloption) : longint;
|
||||
begin
|
||||
push_size:=-1;
|
||||
case varspez of
|
||||
vs_out,
|
||||
vs_var :
|
||||
push_size:=pointer_size;
|
||||
vs_value,
|
||||
vs_const :
|
||||
begin
|
||||
if push_addr_param(def,calloption) then
|
||||
push_size:=pointer_size
|
||||
else
|
||||
begin
|
||||
{ special array are normally pushed by addr, only for
|
||||
cdecl array of const it comes here and the pushsize
|
||||
is unknown }
|
||||
if is_array_of_const(def) then
|
||||
push_size:=0
|
||||
else
|
||||
push_size:=def.size;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function tparamanager.getfuncretparaloc(p : tabstractprocdef) : tparalocation;
|
||||
begin
|
||||
result.loc:=LOC_REFERENCE;
|
||||
@ -379,7 +412,10 @@ end.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.25 2002-11-27 02:33:19 peter
|
||||
Revision 1.26 2002-11-27 20:04:09 peter
|
||||
* tvarsym.get_push_size replaced by paramanager.push_size
|
||||
|
||||
Revision 1.25 2002/11/27 02:33:19 peter
|
||||
* copy_value_on_stack method added for cdecl record passing
|
||||
|
||||
Revision 1.24 2002/11/25 17:43:21 peter
|
||||
|
@ -3158,19 +3158,7 @@ implementation
|
||||
pdc:=TParaItem(Para.first);
|
||||
while assigned(pdc) do
|
||||
begin
|
||||
case pdc.paratyp of
|
||||
vs_out,
|
||||
vs_var :
|
||||
inc(l,POINTER_SIZE);
|
||||
vs_value,
|
||||
vs_const :
|
||||
begin
|
||||
if paramanager.push_addr_param(pdc.paratype.def,proccalloption) then
|
||||
inc(l,POINTER_SIZE)
|
||||
else
|
||||
inc(l,pdc.paratype.def.size);
|
||||
end;
|
||||
end;
|
||||
inc(l,paramanager.push_size(pdc.paratyp,pdc.paratype.def,proccalloption));
|
||||
l:=align(l,alignsize);
|
||||
if assigned(pdc.paratype.def) and
|
||||
is_special_array(pdc.paratype.def) then
|
||||
@ -5529,7 +5517,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.112 2002-11-25 21:05:53 carl
|
||||
Revision 1.113 2002-11-27 20:04:09 peter
|
||||
* tvarsym.get_push_size replaced by paramanager.push_size
|
||||
|
||||
Revision 1.112 2002/11/25 21:05:53 carl
|
||||
* several mistakes fixed in message files
|
||||
|
||||
Revision 1.111 2002/11/25 18:43:33 carl
|
||||
|
@ -192,7 +192,6 @@ interface
|
||||
procedure set_mangledname(const s:string);
|
||||
function getsize : longint;
|
||||
function getvaluesize : longint;
|
||||
function getpushsize(calloption:tproccalloption): longint;
|
||||
{$ifdef var_notification}
|
||||
function register_notification(flags:Tnotification_flags;
|
||||
callback:Tnotification_callback):cardinal;
|
||||
@ -1653,27 +1652,6 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
function tvarsym.getpushsize(calloption:tproccalloption) : longint;
|
||||
begin
|
||||
getpushsize:=-1;
|
||||
if assigned(vartype.def) then
|
||||
begin
|
||||
case varspez of
|
||||
vs_out,
|
||||
vs_var :
|
||||
getpushsize:=pointer_size;
|
||||
vs_value,
|
||||
vs_const :
|
||||
begin
|
||||
if paramanager.push_addr_param(vartype.def,calloption) then
|
||||
getpushsize:=pointer_size
|
||||
else
|
||||
getpushsize:=vartype.def.size;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
{$ifdef var_notification}
|
||||
function Tvarsym.register_notification(flags:Tnotification_flags;callback:
|
||||
Tnotification_callback):cardinal;
|
||||
@ -2479,7 +2457,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.78 2002-11-27 02:34:20 peter
|
||||
Revision 1.79 2002-11-27 20:04:10 peter
|
||||
* tvarsym.get_push_size replaced by paramanager.push_size
|
||||
|
||||
Revision 1.78 2002/11/27 02:34:20 peter
|
||||
* only find real equal procvars
|
||||
|
||||
Revision 1.77 2002/11/25 18:43:34 carl
|
||||
|
@ -1436,7 +1436,7 @@ implementation
|
||||
internalerror(200208256);
|
||||
{ here we need the size of a push instead of the
|
||||
size of the data }
|
||||
l:=tvarsym(sym).getpushsize(tprocdef(defowner).proccalloption);
|
||||
l:=paramanager.push_size(tvarsym(sym).varspez,tvarsym(sym).vartype.def,tprocdef(defowner).proccalloption);
|
||||
varalign:=size_2_align(l);
|
||||
tvarsym(sym).varstate:=vs_assigned;
|
||||
{ we need the new datasize already aligned so we can't
|
||||
@ -2337,7 +2337,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.80 2002-11-22 22:45:49 carl
|
||||
Revision 1.81 2002-11-27 20:04:09 peter
|
||||
* tvarsym.get_push_size replaced by paramanager.push_size
|
||||
|
||||
Revision 1.80 2002/11/22 22:45:49 carl
|
||||
+ small optimization for speed
|
||||
|
||||
Revision 1.79 2002/11/19 16:26:33 pierre
|
||||
|
Loading…
Reference in New Issue
Block a user