mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-15 07:19:35 +02:00
* execute the tempinitcode whent the tempcreate node gets processed rather
than when the first temprefnode to it gets processed. Solves the issue the foreachnodestatic processes the tempinitcode when seeing the tempcreatenode and ignores it when seeing temprefnodes, even though it may actually be executed/generated for the temprefnode. It's impossible to easily process it for the "correct" temprefnode (since there may be multiple temprefnodes for the same tempcreatenode) o fixes tarray12 for Darwin/i386 and Linux/i386 git-svn-id: trunk@46457 -
This commit is contained in:
parent
2ab7cceeaa
commit
f26735fc77
@ -140,25 +140,16 @@ interface
|
||||
even if the creator didn't mind)
|
||||
}
|
||||
ti_addr_taken,
|
||||
{ temps can get an extra node tree that contains the value to which
|
||||
they should be initialised when they are created. this initialisation
|
||||
has to be performed right before the first reference to the temp.
|
||||
this flag indicates that the ttempcreatenode has been
|
||||
processed by pass_generate_code, but that the first ttemprefnode
|
||||
hasn't yet and hence will have to perform the initialisation
|
||||
}
|
||||
ti_executeinitialisation,
|
||||
{ in case an expression like "inc(x[func()],1)" is translated into
|
||||
a regular addition, you have to create a temp to hold the address
|
||||
representing x[func()], since otherwise func() will be called twice
|
||||
and that can spell trouble in case it has side effects. on platforms
|
||||
without pointers, we cannot just take the address though. this flag
|
||||
has to be combined with ti_executeinitialisation above and will,
|
||||
without pointers, we cannot just take the address though. This flag will,
|
||||
rather than loading the value at the calculated location and store
|
||||
it in the temp, keep a copy of the calculated location if possible
|
||||
and required (not possible for regvars, because SSA may change their
|
||||
register, but not required for them either since calculating their
|
||||
location has no side-effects
|
||||
location has no side-effects)
|
||||
}
|
||||
ti_reference,
|
||||
{ this temp only allows reading (makes it possible to safely use as
|
||||
|
@ -510,20 +510,7 @@ interface
|
||||
end;
|
||||
includetempflag(ti_valid);
|
||||
if assigned(tempinfo^.tempinitcode) then
|
||||
includetempflag(ti_executeinitialisation);
|
||||
end;
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
TTEMPREFNODE
|
||||
*****************************************************************************}
|
||||
|
||||
procedure tcgtemprefnode.pass_generate_code;
|
||||
begin
|
||||
if ti_executeinitialisation in tempflags then
|
||||
begin
|
||||
{ avoid recursion }
|
||||
excludetempflag(ti_executeinitialisation);
|
||||
secondpass(tempinfo^.tempinitcode);
|
||||
if (ti_reference in tempflags) then
|
||||
begin
|
||||
@ -549,6 +536,15 @@ interface
|
||||
hlcg.g_reference_loc(current_asmdata.CurrAsmList,tempinfo^.typedef,tempinfo^.tempinitcode.location,tempinfo^.location);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
TTEMPREFNODE
|
||||
*****************************************************************************}
|
||||
|
||||
procedure tcgtemprefnode.pass_generate_code;
|
||||
begin
|
||||
{ check if the temp is valid }
|
||||
if not(ti_valid in tempflags) then
|
||||
internalerror(200108231);
|
||||
|
@ -1442,12 +1442,7 @@ implementation
|
||||
(vo_volatile in tabstractvarsym(tloadnode(n).symtableentry).varoptions)
|
||||
)
|
||||
)
|
||||
) or
|
||||
{ foreachonode does not recurse into the init code for temprefnode as this is done for
|
||||
by the tempcreatenode but the considered tree might not contain the tempcreatenode so play
|
||||
save and recurce into the init code if there is any }
|
||||
((n.nodetype=temprefn) and (ti_executeinitialisation in ttemprefnode(n).tempflags) and
|
||||
might_have_sideeffects(ttemprefnode(n).tempinfo^.tempinitcode,pmhs_flags(arg)^)) then
|
||||
) then
|
||||
result:=fen_norecurse_true
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user