comperr.adb (Abort_In_Progress): New.
authorRichard Henderson <rth@redhat.com>
Mon, 8 Oct 2001 17:09:23 +0000 (10:09 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 8 Oct 2001 17:09:23 +0000 (10:09 -0700)
        * comperr.adb (Abort_In_Progress): New.
        (Compiler_Abort): Use it to prevent recursion.

From-SVN: r46082

gcc/ada/ChangeLog
gcc/ada/comperr.adb

index 8801866187327d9071d30cbe13784512f923f5f4..c7138f7090ed4cb377637a4d8cea804fede2a122 100644 (file)
@@ -1,3 +1,8 @@
+2001-10-08  Richard Henderson  <rth@redhat.com>
+
+       * comperr.adb (Abort_In_Progress): New.
+       (Compiler_Abort): Use it to prevent recursion.
+
 2001-10-08  Robert Dewar <dewar@gnat.com>
 
        * atree.adb: Set Error_Posted in Error node, helps error recovery.
index e92e0c4a97e6453305b27073c5703ced5ff3770e..b3d868fab607e67fa5e377ade5fddad7569340d6 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---                            $Revision: 1.57 $
+--                            $Revision: 1.1 $
 --                                                                          --
 --          Copyright (C) 1992-2001 Free Software Foundation, Inc.          --
 --                                                                          --
@@ -51,6 +51,14 @@ with System.Soft_Links; use System.Soft_Links;
 
 package body Comperr is
 
+   ----------------
+   -- Local Data --
+   ----------------
+
+   Abort_In_Progress : Boolean := False;
+   --  Used to prevent runaway recursion if something segfaults
+   --  while processing a previous abort.
+
    -----------------------
    -- Local Subprograms --
    -----------------------
@@ -82,6 +90,14 @@ package body Comperr is
    --  Start of processing for Compiler_Abort
 
    begin
+      --  Prevent recursion through Compiler_Abort, e.g. via SIGSEGV.
+
+      if Abort_In_Progress then
+         Exit_Program (E_Abort);
+      end if;
+
+      Abort_In_Progress := True;
+
       --  If errors have already occured, then we guess that the abort may
       --  well be caused by previous errors, and we don't make too much fuss
       --  about it, since we want to let the programmer fix the errors first.