* patch by Do-wan Kim: fix loop unrolling for try .. finally blocks in win32,

similiar to r48972 for win64

git-svn-id: trunk@49057 -
This commit is contained in:
florian 2021-03-26 22:21:09 +00:00
parent 1ad9091763
commit 4d82e814a0

View File

@ -46,6 +46,7 @@ interface
constructor create(l,r:TNode);override;
constructor create_implicit(l,r:TNode);override;
function pass_1: tnode;override;
function dogetcopy : tnode;override;
function simplify(forinline: boolean): tnode;override;
procedure pass_generate_code;override;
end;
@ -59,7 +60,7 @@ implementation
cgbase,cgobj,cgcpu,cgutils,tgobj,
cpubase,htypechk,
parabase,paramgr,pass_1,pass_2,ncgutil,cga,
aasmbase,aasmtai,aasmdata,aasmcpu,procinfo,cpupi;
aasmbase,aasmtai,aasmdata,aasmcpu,procinfo,cpupi,procdefutil;
var
endexceptlabel: tasmlabel;
@ -215,6 +216,30 @@ function ti386tryfinallynode.pass_1: tnode;
end;
end;
function ti386tryfinallynode.dogetcopy: tnode;
var
n: ti386tryfinallynode;
begin
n:=ti386tryfinallynode(inherited dogetcopy);
if target_info.system=system_i386_win32 then
begin
n.finalizepi:=tcgprocinfo(cprocinfo.create(finalizepi.parent));
n.finalizepi.force_nested;
n.finalizepi.procdef:=create_outline_procdef('$fin$',current_procinfo.procdef.struct,potype_exceptfilter,voidtype);
n.finalizepi.entrypos:=finalizepi.entrypos;
n.finalizepi.entryswitches:=finalizepi.entryswitches;
n.finalizepi.exitpos:=finalizepi.exitpos;
n.finalizepi.exitswitches:=finalizepi.exitswitches;
n.finalizepi.flags:=finalizepi.flags;
{ node already transformed? }
if assigned(finalizepi.code) then
begin
n.finalizepi.code:=finalizepi.code.getcopy;
n.right:=ccallnode.create(nil,tprocsym(n.finalizepi.procdef.procsym),nil,nil,[],nil);
end;
end;
result:=n;
end;
function ti386tryfinallynode.simplify(forinline: boolean): tnode;
begin
@ -222,7 +247,8 @@ function ti386tryfinallynode.simplify(forinline: boolean): tnode;
if (target_info.system<>system_i386_win32) then
exit;
if (result=nil) and assigned(finalizepi) then
{ actually, this is not really the right place to do a node transformation like this }
if (result=nil) and assigned(finalizepi) and (not(assigned(finalizepi.code))) then
begin
finalizepi.code:=right;
foreachnodestatic(right,@copy_parasize,finalizepi);