mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 19:39:31 +02:00
* fixed endless loop with web bug #1571 (merged)
This commit is contained in:
parent
68ed130f45
commit
64f266bf07
@ -434,7 +434,7 @@ Var
|
||||
End;
|
||||
End;
|
||||
|
||||
Procedure GetFinalDestination(AsmL: TAAsmOutput; hp: Taicpu);
|
||||
function GetFinalDestination(AsmL: TAAsmOutput; hp: Taicpu; level: longint): boolean;
|
||||
{traces sucessive jumps to their final destination and sets it, e.g.
|
||||
je l1 je l3
|
||||
<code> <code>
|
||||
@ -442,7 +442,10 @@ Var
|
||||
je l2 je l3
|
||||
<code> <code>
|
||||
l2: l2:
|
||||
jmp l3 jmp l3}
|
||||
jmp l3 jmp l3
|
||||
|
||||
the level parameter denotes how deeep we have already followed the jump,
|
||||
to avoid endless loops with constructs such as "l5: ; jmp l5" }
|
||||
|
||||
Var p1, p2: Tai;
|
||||
l: tasmlabel;
|
||||
@ -462,6 +465,9 @@ Var
|
||||
End;
|
||||
|
||||
Begin
|
||||
if level > 20 then
|
||||
exit;
|
||||
GetfinalDestination := false;
|
||||
If (tasmlabel(hp.oper[0].sym).labelnr >= LoLab) and
|
||||
(tasmlabel(hp.oper[0].sym).labelnr <= HiLab) and {range check, a jump can go past an assembler block!}
|
||||
Assigned(LTable^[tasmlabel(hp.oper[0].sym).labelnr-LoLab].TaiObj) Then
|
||||
@ -485,7 +491,12 @@ Var
|
||||
(Taicpu(p2).condition in [C_None,hp.condition]) and
|
||||
SkipLabels(p1,p1)) Then
|
||||
Begin
|
||||
GetFinalDestination(asml, Taicpu(p1));
|
||||
{ quick check for loops of the form "l5: ; jmp l5 }
|
||||
if (tasmlabel(Taicpu(p1).oper[0].sym).labelnr =
|
||||
tasmlabel(hp.oper[0].sym).labelnr) then
|
||||
exit;
|
||||
if not GetFinalDestination(asml, Taicpu(p1),succ(level)) then
|
||||
exit;
|
||||
Dec(tasmlabel(hp.oper[0].sym).refs);
|
||||
hp.oper[0].sym:=Taicpu(p1).oper[0].sym;
|
||||
inc(tasmlabel(hp.oper[0].sym).refs);
|
||||
@ -516,9 +527,11 @@ Var
|
||||
{$endif finaldestdebug}
|
||||
inc(l.refs);
|
||||
hp.oper[0].sym := l;
|
||||
GetFinalDestination(asml, hp);
|
||||
if not GetFinalDestination(asml, hp,succ(level)) then
|
||||
exit;
|
||||
end;
|
||||
End;
|
||||
GetFinalDestination := true;
|
||||
End;
|
||||
|
||||
Function DoSubAddOpt(var p: Tai): Boolean;
|
||||
@ -617,7 +630,7 @@ Begin
|
||||
else
|
||||
begin
|
||||
If (LabDif <> 0) Then
|
||||
GetFinalDestination(asml, Taicpu(p));
|
||||
GetFinalDestination(asml, Taicpu(p),0);
|
||||
p:=Tai(p.next);
|
||||
continue;
|
||||
end;
|
||||
@ -627,11 +640,11 @@ Begin
|
||||
asml.remove(hp1);
|
||||
hp1.free;
|
||||
If (LabDif <> 0) Then
|
||||
GetFinalDestination(asml, Taicpu(p));
|
||||
GetFinalDestination(asml, Taicpu(p),0);
|
||||
end
|
||||
else
|
||||
If (LabDif <> 0) Then
|
||||
GetFinalDestination(asml, Taicpu(p));
|
||||
GetFinalDestination(asml, Taicpu(p),0);
|
||||
end;
|
||||
end;
|
||||
end
|
||||
@ -2008,7 +2021,10 @@ End.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.13 2001-04-13 01:22:19 peter
|
||||
Revision 1.14 2001-08-01 09:46:55 jonas
|
||||
* fixed endless loop with web bug 1571 (merged)
|
||||
|
||||
Revision 1.13 2001/04/13 01:22:19 peter
|
||||
* symtable change to classes
|
||||
* range check generation and errors fixed, make cycle DEBUG=1 works
|
||||
* memory leaks fixed
|
||||
|
Loading…
Reference in New Issue
Block a user