mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-12 17:49:07 +02:00
* moved po_has_inlininginfo from procoptions to procimploptions so that
the availability of the body of a function declared as "inline" no longer changes the CRC and hence no longer triggers recompilations (mantis #24121) git-svn-id: trunk@27192 -
This commit is contained in:
parent
72c1e2a8ce
commit
1ac4021178
@ -3437,7 +3437,9 @@ implementation
|
||||
para : tcallparanode;
|
||||
begin
|
||||
{ Can we inline the procedure? }
|
||||
if ([po_inline,po_has_inlininginfo] <= procdefinition.procoptions) then
|
||||
if (po_inline in procdefinition.procoptions) and
|
||||
(procdefinition.typ=procdef) and
|
||||
tprocdef(procdefinition).has_inlininginfo then
|
||||
begin
|
||||
include(callnodeflags,cnf_do_inline);
|
||||
{ Check if we can inline the procedure when it references proc/var that
|
||||
@ -3527,7 +3529,7 @@ implementation
|
||||
{ allow only certain proc options }
|
||||
((tprocdef(procdefinition).procoptions-[po_none,po_classmethod,po_staticmethod,
|
||||
po_interrupt,po_iocheck,po_assembler,po_msgstr,po_msgint,po_exports,po_external,po_overload,
|
||||
po_nostackframe,po_has_mangledname,po_has_public_name,po_forward,po_global,po_has_inlininginfo,
|
||||
po_nostackframe,po_has_mangledname,po_has_public_name,po_forward,po_global,
|
||||
po_inline,po_compilerproc,po_has_importdll,po_has_importname,po_kylixlocal,po_dispid,po_delphi_nested_cc,
|
||||
po_rtlproc,po_ignore_for_overload_resolution,po_auto_raised_visibility])=[]) then
|
||||
begin
|
||||
|
@ -43,7 +43,7 @@ type
|
||||
{$endif Test_Double_checksum}
|
||||
|
||||
const
|
||||
CurrentPPUVersion = 166;
|
||||
CurrentPPUVersion = 167;
|
||||
|
||||
{ buffer sizes }
|
||||
maxentrysize = 1024;
|
||||
|
@ -1128,12 +1128,12 @@ implementation
|
||||
procedure TCGProcinfo.CreateInlineInfo;
|
||||
begin
|
||||
new(procdef.inlininginfo);
|
||||
include(procdef.procoptions,po_has_inlininginfo);
|
||||
procdef.inlininginfo^.code:=code.getcopy;
|
||||
procdef.inlininginfo^.flags:=flags;
|
||||
{ The blocknode needs to set an exit label }
|
||||
if procdef.inlininginfo^.code.nodetype=blockn then
|
||||
include(procdef.inlininginfo^.code.flags,nf_block_with_exit);
|
||||
procdef.has_inlininginfo:=true;
|
||||
end;
|
||||
|
||||
|
||||
@ -1218,7 +1218,7 @@ implementation
|
||||
{ inlining not turned off? }
|
||||
(cs_do_inline in current_settings.localswitches) and
|
||||
{ no inlining yet? }
|
||||
not(po_has_inlininginfo in procdef.procoptions) and not(has_nestedprocs) and
|
||||
not(procdef.has_inlininginfo) and not(has_nestedprocs) and
|
||||
not(procdef.proctypeoption in [potype_proginit,potype_unitinit,potype_unitfinalize,potype_constructor,
|
||||
potype_destructor,potype_class_constructor,potype_class_destructor]) and
|
||||
((procdef.procoptions*[po_exports,po_external,po_interrupt,po_virtualmethod,po_iocheck])=[]) and
|
||||
|
@ -303,7 +303,6 @@ type
|
||||
po_has_public_name,
|
||||
po_forward,
|
||||
po_global,
|
||||
po_has_inlininginfo,
|
||||
{ The different kind of syscalls on MorphOS }
|
||||
po_syscall_legacy,
|
||||
po_syscall_sysv,
|
||||
@ -362,7 +361,9 @@ type
|
||||
between the interface and the implementation }
|
||||
timplprocoption = (
|
||||
{ the routine contains no code }
|
||||
pio_empty
|
||||
pio_empty,
|
||||
{ the inline body of this routine is available }
|
||||
pio_has_inlininginfo
|
||||
);
|
||||
timplprocoptions = set of timplprocoption;
|
||||
|
||||
|
@ -644,6 +644,8 @@ interface
|
||||
procedure Sethasforward(AValue: boolean);
|
||||
function GetIsEmpty: boolean;
|
||||
procedure SetIsEmpty(AValue: boolean);
|
||||
function GetHasInliningInfo: boolean;
|
||||
procedure SetHasInliningInfo(AValue: boolean);
|
||||
public
|
||||
messageinf : tmessageinf;
|
||||
dispid : longint;
|
||||
@ -771,6 +773,8 @@ interface
|
||||
property hasforward: boolean read Gethasforward write Sethasforward;
|
||||
{ true if the routine's body is empty }
|
||||
property isempty: boolean read GetIsEmpty write SetIsEmpty;
|
||||
{ true if all information required to inline this routine is available }
|
||||
property has_inlininginfo: boolean read GetHasInliningInfo write SetHasInliningInfo;
|
||||
end;
|
||||
|
||||
{ single linked list of overloaded procs }
|
||||
@ -4677,6 +4681,21 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
function tprocdef.GetHasInliningInfo: boolean;
|
||||
begin
|
||||
result:=pio_has_inlininginfo in implprocoptions;
|
||||
end;
|
||||
|
||||
|
||||
procedure tprocdef.SetHasInliningInfo(AValue: boolean);
|
||||
begin
|
||||
if AValue then
|
||||
include(implprocoptions,pio_has_inlininginfo)
|
||||
else
|
||||
exclude(implprocoptions,pio_has_inlininginfo);
|
||||
end;
|
||||
|
||||
|
||||
procedure tprocdef.Setinterfacedef(AValue: boolean);
|
||||
begin
|
||||
if not assigned(implprocdefinfo) then
|
||||
@ -4788,7 +4807,8 @@ implementation
|
||||
if (po_dispid in procoptions) then
|
||||
dispid:=ppufile.getlongint;
|
||||
{ inline stuff }
|
||||
if (po_has_inlininginfo in procoptions) then
|
||||
ppufile.getsmallset(implprocoptions);
|
||||
if has_inlininginfo then
|
||||
begin
|
||||
ppufile.getderef(funcretsymderef);
|
||||
new(inlininginfo);
|
||||
@ -4806,13 +4826,11 @@ implementation
|
||||
for i:=1 to aliasnamescount do
|
||||
aliasnames.insert(ppufile.getstring);
|
||||
|
||||
ppufile.getsmallset(implprocoptions);
|
||||
|
||||
{ load para symtable }
|
||||
parast:=tparasymtable.create(self,level);
|
||||
tparasymtable(parast).ppuload(ppufile);
|
||||
{ load local symtable }
|
||||
if (po_has_inlininginfo in procoptions) then
|
||||
if has_inlininginfo then
|
||||
begin
|
||||
localst:=tlocalsymtable.create(self,level);
|
||||
tlocalsymtable(localst).ppuload(ppufile);
|
||||
@ -4820,7 +4838,7 @@ implementation
|
||||
else
|
||||
localst:=nil;
|
||||
{ inline stuff }
|
||||
if (po_has_inlininginfo in procoptions) then
|
||||
if has_inlininginfo then
|
||||
inlininginfo^.code:=ppuloadnodetree(ppufile);
|
||||
{ default values for no persistent data }
|
||||
if (cs_link_deffile in current_settings.globalswitches) and
|
||||
@ -4828,7 +4846,7 @@ implementation
|
||||
(po_exports in procoptions) then
|
||||
deffile.AddExport(mangledname);
|
||||
{ Disable po_has_inlining until the derefimpl is done }
|
||||
exclude(procoptions,po_has_inlininginfo);
|
||||
has_inlininginfo:=false;
|
||||
{$ifdef i386}
|
||||
fpu_used:=maxfpuregs;
|
||||
{$endif i386}
|
||||
@ -4941,7 +4959,8 @@ implementation
|
||||
{ inline stuff }
|
||||
oldintfcrc:=ppufile.do_crc;
|
||||
ppufile.do_crc:=false;
|
||||
if (po_has_inlininginfo in procoptions) then
|
||||
ppufile.putsmallset(implprocoptions);
|
||||
if has_inlininginfo then
|
||||
begin
|
||||
ppufile.putderef(funcretsymderef);
|
||||
ppufile.putsmallset(inlininginfo^.flags);
|
||||
@ -4965,8 +4984,6 @@ implementation
|
||||
item:=TCmdStrListItem(item.next);
|
||||
end;
|
||||
|
||||
ppufile.putsmallset(implprocoptions);
|
||||
|
||||
ppufile.do_crc:=oldintfcrc;
|
||||
|
||||
{ write this entry }
|
||||
@ -4977,7 +4994,7 @@ implementation
|
||||
|
||||
{ save localsymtable for inline procedures or when local
|
||||
browser info is requested, this has no influence on the crc }
|
||||
if (po_has_inlininginfo in procoptions) then
|
||||
if has_inlininginfo then
|
||||
begin
|
||||
oldintfcrc:=ppufile.do_crc;
|
||||
ppufile.do_crc:=false;
|
||||
@ -4988,7 +5005,7 @@ implementation
|
||||
{ node tree for inlining }
|
||||
oldintfcrc:=ppufile.do_crc;
|
||||
ppufile.do_crc:=false;
|
||||
if (po_has_inlininginfo in procoptions) then
|
||||
if has_inlininginfo then
|
||||
ppuwritenodetree(ppufile,inlininginfo^.code);
|
||||
ppufile.do_crc:=oldintfcrc;
|
||||
end;
|
||||
@ -5204,7 +5221,7 @@ implementation
|
||||
inherited buildderefimpl;
|
||||
|
||||
{ inline tree }
|
||||
if (po_has_inlininginfo in procoptions) then
|
||||
if has_inlininginfo then
|
||||
begin
|
||||
{ Localst is not available for main/unit init }
|
||||
if assigned(localst) then
|
||||
@ -5239,10 +5256,10 @@ implementation
|
||||
structure is available. The has_inlininginfo was disabled
|
||||
after the load, since the data was invalid }
|
||||
if assigned(inlininginfo) then
|
||||
include(procoptions,po_has_inlininginfo);
|
||||
has_inlininginfo:=true;
|
||||
|
||||
{ Inline }
|
||||
if (po_has_inlininginfo in procoptions) then
|
||||
if has_inlininginfo then
|
||||
begin
|
||||
{ Locals }
|
||||
if assigned(localst) then
|
||||
|
@ -1717,7 +1717,6 @@ const
|
||||
(mask:po_has_public_name; str:'HasPublicName'),
|
||||
(mask:po_forward; str:'Forward'),
|
||||
(mask:po_global; str:'Global'),
|
||||
(mask:po_has_inlininginfo;str:'HasInliningInfo'),
|
||||
(mask:po_syscall_legacy; str:'SyscallLegacy'),
|
||||
(mask:po_syscall_sysv; str:'SyscallSysV'),
|
||||
(mask:po_syscall_basesysv;str:'SyscallBaseSysV'),
|
||||
@ -1952,7 +1951,7 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
procedure readprocimploptions(const space: string);
|
||||
procedure readprocimploptions(const space: string; out implprocoptions: timplprocoptions);
|
||||
type
|
||||
tpiopt=record
|
||||
mask : timplprocoption;
|
||||
@ -1960,10 +1959,10 @@ type
|
||||
end;
|
||||
const
|
||||
piopt : array[low(timplprocoption)..high(timplprocoption)] of tpiopt=(
|
||||
(mask:pio_empty; str:'IsEmpty')
|
||||
(mask:pio_empty; str:'IsEmpty'),
|
||||
(mask:pio_has_inlininginfo; str:'HasInliningInfo')
|
||||
);
|
||||
var
|
||||
implprocoptions: timplprocoptions;
|
||||
i: timplprocoption;
|
||||
first: boolean;
|
||||
begin
|
||||
@ -2620,6 +2619,7 @@ var
|
||||
l,j : longint;
|
||||
calloption : tproccalloption;
|
||||
procoptions : tprocoptions;
|
||||
implprocoptions: timplprocoptions;
|
||||
defoptions: tdefoptions;
|
||||
iexpr: Tconstexprint;
|
||||
def: TPpuDef;
|
||||
@ -2906,7 +2906,8 @@ begin
|
||||
writeln([space,' MsgStr : ',getstring]);
|
||||
if (po_dispid in procoptions) then
|
||||
writeln([space,' DispID: ',ppufile.getlongint]);
|
||||
if (po_has_inlininginfo in procoptions) then
|
||||
readprocimploptions(space,implprocoptions);
|
||||
if (pio_has_inlininginfo in implprocoptions) then
|
||||
begin
|
||||
write ([space,' FuncretSym : ']);
|
||||
readderef('');
|
||||
@ -2924,16 +2925,15 @@ begin
|
||||
end;
|
||||
writeln;
|
||||
end;
|
||||
readprocimploptions(space);
|
||||
if not EndOfEntry then
|
||||
HasMoreInfos;
|
||||
space:=' '+space;
|
||||
{ parast }
|
||||
readsymtable('parast', TPpuProcDef(def));
|
||||
{ localst }
|
||||
if (po_has_inlininginfo in procoptions) then
|
||||
if (pio_has_inlininginfo in implprocoptions) then
|
||||
readsymtable('localst');
|
||||
if (po_has_inlininginfo in procoptions) then
|
||||
if (pio_has_inlininginfo in implprocoptions) then
|
||||
readnodetree;
|
||||
delete(space,1,4);
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user