[fpc-devel] Issue 3.2.3 (ok in 3.3.1) Win64 "raise exception" does not go to "except"

J. Gareth Moreton gareth at moreton-family.com
Wed Jan 19 00:28:13 CET 2022


Commit af107ca8fee33355e8c35fab6fc5ba5290bd3ebc fixes the problem in the 
main branch, so this one should be merged into fixes_3_2.

Note that this commit also extends an optimisation in OptPass2JMP that 
is unrelated to the bug fix.  If this proves incompatible with the fixes 
branch, it can be ignored, because the bug fix is wholly contained 
within compiler/aoptobj.pas, while the additional optimisation is in 
compiler/x86/aoptx86.pas.

If needs be, the following can be merged manually:

diff --git a/compiler/aoptobj.pas b/compiler/aoptobj.pas
index 33efd80aad..67b62606cb 100644
--- a/compiler/aoptobj.pas
+++ b/compiler/aoptobj.pas
@@ -1616,6 +1616,15 @@ Unit AoptObj;

      { Removes all instructions between an unconditional jump and the 
next label }
      procedure TAOptObj.RemoveDeadCodeAfterJump(p: tai);
+      const
+{$ifdef JVM}
+        TaiFence = SkipInstr + [ait_const, ait_realconst, 
ait_typedconst, ait_label, ait_jcatch];
+{$else JVM}
+        { Stop if it reaches SEH directive information in the form of
+          consts, which may occur if RemoveDeadCodeAfterJump is called on
+          the final RET instruction on x86, for example }
+        TaiFence = SkipInstr + [ait_const, ait_realconst, 
ait_typedconst, ait_label];
+{$endif JVM}
        var
          hp1, hp2: tai;
        begin
@@ -1624,12 +1633,7 @@ Unit AoptObj;
          }
          while GetNextInstruction(p, hp1) and
                (hp1 <> BlockEnd) and
-              (hp1.typ <> ait_label)
-{$ifdef JVM}
-              and (hp1.typ <> ait_jcatch)
-{$endif}
-              do
-          if not(hp1.typ in ([ait_label]+skipinstr)) then
+              not (hp1.typ in TaiFence) do
              begin
                if (hp1.typ = ait_instruction) and
                   taicpu(hp1).is_jmp and
@@ -1658,9 +1662,7 @@ Unit AoptObj;
                  end
                else
                  p:=hp1;
-            end
-          else
-            Break;
+            end;
        end;

      { If hp is a label, strip it if its reference count is zero.  
Repeat until

Gareth aka. Kit


-- 
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus



More information about the fpc-devel mailing list