mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 08:09:33 +02:00
* disable inlining across units when the inline procedure references
a variable or procedure in the static symtable
This commit is contained in:
parent
fad0e529a4
commit
29db12ecfa
@ -236,7 +236,9 @@ than 255 characters. That's why using Ansi Strings}
|
||||
{ procedure uses fpu}
|
||||
pi_uses_fpu,
|
||||
{ procedure uses GOT for PIC code }
|
||||
pi_needs_got
|
||||
pi_needs_got,
|
||||
{ references local var/proc }
|
||||
pi_inline_local_only
|
||||
);
|
||||
tprocinfoflags=set of tprocinfoflag;
|
||||
|
||||
@ -313,7 +315,11 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.64 2004-10-31 21:45:03 peter
|
||||
Revision 1.65 2004-12-15 21:08:15 peter
|
||||
* disable inlining across units when the inline procedure references
|
||||
a variable or procedure in the static symtable
|
||||
|
||||
Revision 1.64 2004/10/31 21:45:03 peter
|
||||
* generic tlocation
|
||||
* move tlocation to cgutils
|
||||
|
||||
|
@ -2119,6 +2119,8 @@ type
|
||||
|
||||
|
||||
function tcallnode.pass_1 : tnode;
|
||||
var
|
||||
st : tsymtable;
|
||||
begin
|
||||
result:=nil;
|
||||
|
||||
@ -2126,8 +2128,21 @@ type
|
||||
if (procdefinition.proccalloption=pocall_inline) and
|
||||
(po_has_inlininginfo in procdefinition.procoptions) then
|
||||
begin
|
||||
result:=pass1_inline;
|
||||
exit;
|
||||
{ Check if we can inline the procedure when it references proc/var that
|
||||
are not in the globally available }
|
||||
st:=procdefinition.owner;
|
||||
if (st.symtabletype=objectsymtable) then
|
||||
st:=st.defowner.owner;
|
||||
if (pi_inline_local_only in tprocdef(procdefinition).inlininginfo^.flags) and
|
||||
(st.unitid<>0) then
|
||||
begin
|
||||
Comment(V_lineinfo+V_Debug,'Not inlining "'+tprocdef(procdefinition).procsym.realname+'", references static symtable');
|
||||
end
|
||||
else
|
||||
begin
|
||||
result:=pass1_inline;
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ calculate the parameter info for the procdef }
|
||||
@ -2434,7 +2449,11 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.270 2004-12-15 19:30:16 peter
|
||||
Revision 1.271 2004-12-15 21:08:15 peter
|
||||
* disable inlining across units when the inline procedure references
|
||||
a variable or procedure in the static symtable
|
||||
|
||||
Revision 1.270 2004/12/15 19:30:16 peter
|
||||
* give error when paraloc is not filled in order_parameter
|
||||
|
||||
Revision 1.269 2004/12/07 16:11:52 peter
|
||||
|
@ -959,6 +959,20 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
function checklocalinlining(var n: tnode; arg: pointer): foreachnoderesult;
|
||||
begin
|
||||
result:=fen_false;
|
||||
case n.nodetype of
|
||||
loadn :
|
||||
if tloadnode(n).symtableentry.owner.symtabletype=staticsymtable then
|
||||
result:=fen_norecurse_true;
|
||||
calln :
|
||||
if tcallnode(n).procdefinition.owner.symtabletype=staticsymtable then
|
||||
result:=fen_norecurse_true;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgprocinfo.parse_body;
|
||||
var
|
||||
oldprocinfo : tprocinfo;
|
||||
@ -1046,6 +1060,10 @@ implementation
|
||||
include(procdef.procoptions,po_has_inlininginfo);
|
||||
procdef.inlininginfo^.code:=code.getcopy;
|
||||
procdef.inlininginfo^.flags:=current_procinfo.flags;
|
||||
{ References a local var or proc? }
|
||||
if foreachnodestatic(procdef.inlininginfo^.code,@checklocalinlining,nil) then
|
||||
include(procdef.inlininginfo^.flags,pi_inline_local_only);
|
||||
{ The blocknode needs to set an exit label }
|
||||
if procdef.inlininginfo^.code.nodetype=blockn then
|
||||
include(procdef.inlininginfo^.code.flags,nf_block_with_exit);
|
||||
end;
|
||||
@ -1446,7 +1464,11 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.224 2004-12-15 17:01:28 peter
|
||||
Revision 1.225 2004-12-15 21:08:15 peter
|
||||
* disable inlining across units when the inline procedure references
|
||||
a variable or procedure in the static symtable
|
||||
|
||||
Revision 1.224 2004/12/15 17:01:28 peter
|
||||
* fixed crash with -vp
|
||||
|
||||
Revision 1.223 2004/12/15 16:00:16 peter
|
||||
|
Loading…
Reference in New Issue
Block a user