[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Mon, 29 Aug 2011 10:34:32 +0000 (12:34 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 29 Aug 2011 10:34:32 +0000 (12:34 +0200)
2011-08-29  Tristan Gingold  <gingold@adacore.com>

* exp_sel.ads (Build_Abort_BLock_Handler): New function spec.
Adjust comment.
* exp_sel.adb (Build_Abort_Block): Use Build_Abort_Block_Handler.
(Build_Abort_Block_Handler): New function to build an Abort_Signal
exception handler.
* exp_ch9.adb (Expand_N_Asynchronous_Select): Call
Build_Abort_Block_Handler to build the exception handler. Do not
undefer aborts for the Abort_Signal exception handler if back-end
exception mechanism.
* exp_ch11.adb (Expand_Exception_Handlers): Do not undefer aborts if
back_end exceptions for all others and abort_signal.
* s-except.ads (ZCX_By_Default): New constant.
* a-except-2005.adb (Raise_Exception): Do not defer abort if ZCX.
(Raise_Exception_Always): Ditto.
(Raise_From_Signal_Handler): Ditto.
(Raise_With_Location_And_Msg): Ditto.
(Raise_With_Msg): Ditto.
(Reraise): Ditto.
(Reraise_Occurence): Ditto.
(Reraise_Occurrence_Always): Ditto.
* s-tasren.adb (Exceptional_Complete_Rendezvous): Defer aborts if ZCX.
* s-tpobop.adb: (Exceptional_Complete_Body): Undefer abort if ZCX.
* s-interr-hwint.adb (Interrupt_Manager): Defer abort if ZCX.

2011-08-29  Thomas Quinot  <quinot@adacore.com>

* sem_util.ads (Get_Enum_Lit_From_Pos): Clarify documentation.

From-SVN: r178194

gcc/ada/ChangeLog
gcc/ada/a-except-2005.adb
gcc/ada/exp_ch11.adb
gcc/ada/exp_ch9.adb
gcc/ada/exp_sel.adb
gcc/ada/exp_sel.ads
gcc/ada/s-except.ads
gcc/ada/s-interr-hwint.adb
gcc/ada/s-tasren.adb
gcc/ada/s-tpobop.adb
gcc/ada/sem_util.ads

index d6e5955949aee8e3f41b1e499fe076d6b7656e6d..4905b45a65e059e91f6dbcce611af695cf939766 100644 (file)
@@ -1,3 +1,33 @@
+2011-08-29  Tristan Gingold  <gingold@adacore.com>
+
+       * exp_sel.ads (Build_Abort_BLock_Handler): New function spec.
+       Adjust comment.
+       * exp_sel.adb (Build_Abort_Block): Use Build_Abort_Block_Handler.
+       (Build_Abort_Block_Handler): New function to build an Abort_Signal
+       exception handler.
+       * exp_ch9.adb (Expand_N_Asynchronous_Select): Call
+       Build_Abort_Block_Handler to build the exception handler. Do not
+       undefer aborts for the Abort_Signal exception handler if back-end
+       exception mechanism.
+       * exp_ch11.adb (Expand_Exception_Handlers): Do not undefer aborts if
+       back_end exceptions for all others and abort_signal.
+       * s-except.ads (ZCX_By_Default): New constant.
+       * a-except-2005.adb (Raise_Exception): Do not defer abort if ZCX.
+       (Raise_Exception_Always): Ditto.
+       (Raise_From_Signal_Handler): Ditto.
+       (Raise_With_Location_And_Msg): Ditto.
+       (Raise_With_Msg): Ditto.
+       (Reraise): Ditto.
+       (Reraise_Occurence): Ditto.
+       (Reraise_Occurrence_Always): Ditto.
+       * s-tasren.adb (Exceptional_Complete_Rendezvous): Defer aborts if ZCX.
+       * s-tpobop.adb: (Exceptional_Complete_Body): Undefer abort if ZCX.
+       * s-interr-hwint.adb (Interrupt_Manager): Defer abort if ZCX.
+
+2011-08-29  Thomas Quinot  <quinot@adacore.com>
+
+       * sem_util.ads (Get_Enum_Lit_From_Pos): Clarify documentation.
+
 2011-08-29  Robert Dewar  <dewar@adacore.com>
 
        * snames.adb-tmpl, sem_ch13.adb: Minor reformatting
index 3b72130cbe8b5e40b8bd9add1058c9a0d2a207a3..0ff0b5bb8fb29748393fb8216b602183228ee930 100644 (file)
@@ -855,7 +855,9 @@ package body Ada.Exceptions is
       --  Go ahead and raise appropriate exception
 
       Exception_Data.Set_Exception_Msg (EF, Message);
-      Abort_Defer.all;
+      if not ZCX_By_Default then
+         Abort_Defer.all;
+      end if;
       Raise_Current_Excep (EF);
    end Raise_Exception;
 
@@ -869,7 +871,9 @@ package body Ada.Exceptions is
    is
    begin
       Exception_Data.Set_Exception_Msg (E, Message);
-      Abort_Defer.all;
+      if not ZCX_By_Default then
+         Abort_Defer.all;
+      end if;
       Raise_Current_Excep (E);
    end Raise_Exception_Always;
 
@@ -944,7 +948,9 @@ package body Ada.Exceptions is
    is
    begin
       Exception_Data.Set_Exception_C_Msg (E, M);
-      Abort_Defer.all;
+      if not ZCX_By_Default then
+         Abort_Defer.all;
+      end if;
       Debug_Raise_Exception (E => SSL.Exception_Data_Ptr (E));
       Exception_Propagation.Propagate_Exception
         (E => E, From_Signal_Handler => True);
@@ -1015,7 +1021,9 @@ package body Ada.Exceptions is
    is
    begin
       Exception_Data.Set_Exception_C_Msg (E, F, L, C, M);
-      Abort_Defer.all;
+      if not ZCX_By_Default then
+         Abort_Defer.all;
+      end if;
       Raise_Current_Excep (E);
    end Raise_With_Location_And_Msg;
 
@@ -1034,7 +1042,9 @@ package body Ada.Exceptions is
       Excep.Num_Tracebacks   := 0;
       Excep.Cleanup_Flag     := False;
       Excep.Pid              := Local_Partition_ID;
-      Abort_Defer.all;
+      if not ZCX_By_Default then
+         Abort_Defer.all;
+      end if;
       Raise_Current_Excep (E);
    end Raise_With_Msg;
 
@@ -1276,7 +1286,9 @@ package body Ada.Exceptions is
    procedure Reraise is
       Excep : constant EOA := Get_Current_Excep.all;
    begin
-      Abort_Defer.all;
+      if not ZCX_By_Default then
+         Abort_Defer.all;
+      end if;
       Exception_Propagation.Setup_Exception (Excep, Excep, Reraised => True);
       Raise_Current_Excep (Excep.Id);
    end Reraise;
@@ -1288,7 +1300,9 @@ package body Ada.Exceptions is
    procedure Reraise_Occurrence (X : Exception_Occurrence) is
    begin
       if X.Id /= null then
-         Abort_Defer.all;
+         if not ZCX_By_Default then
+            Abort_Defer.all;
+         end if;
          Exception_Propagation.Setup_Exception
            (X'Unrestricted_Access, Get_Current_Excep.all, Reraised => True);
          Save_Occurrence_No_Private (Get_Current_Excep.all.all, X);
@@ -1302,7 +1316,9 @@ package body Ada.Exceptions is
 
    procedure Reraise_Occurrence_Always (X : Exception_Occurrence) is
    begin
-      Abort_Defer.all;
+      if not ZCX_By_Default then
+         Abort_Defer.all;
+      end if;
       Exception_Propagation.Setup_Exception
         (X'Unrestricted_Access, Get_Current_Excep.all, Reraised => True);
       Save_Occurrence_No_Private (Get_Current_Excep.all.all, X);
index fc55d1567cbb8a84b34e4e7aae37bfd316e95577..65ab2bd32bcb4dc4ce5ac7a30f63963da1eb20ad 100644 (file)
@@ -1097,7 +1097,9 @@ package body Exp_Ch11 is
                   --  any case this entire handling is relevant only if aborts
                   --  are allowed!
 
-               elsif Abort_Allowed then
+               elsif Abort_Allowed
+                 and then Exception_Mechanism /= Back_End_Exceptions
+               then
 
                   --  There are some special cases in which we do not do the
                   --  undefer. In particular a finalization (AT END) handler
@@ -1122,7 +1124,6 @@ package body Exp_Ch11 is
                       (Others_Choice
                         and then
                           All_Others (First (Exception_Choices (Handler))))
-                    and then Abort_Allowed
                   then
                      Prepend_Call_To_Handler (RE_Abort_Undefer);
                   end if;
index fc6751a92e00fbef377c6619121b32e1a033210c..e5d6ac58fd93fd8b78734fa07917af7aef0e38f6 100644 (file)
@@ -5848,6 +5848,7 @@ package body Exp_Ch9 is
       Enqueue_Call      : Node_Id;
       Formals           : List_Id;
       Hdle              : List_Id;
+      Handler_Stmt      : Node_Id;
       Index             : Node_Id;
       Lim_Typ_Stmts     : List_Id;
       N_Orig            : Node_Id;
@@ -5859,9 +5860,7 @@ package body Exp_Ch9 is
       ProtP_Stmts       : List_Id;
       Stmt              : Node_Id;
       Stmts             : List_Id;
-      Target_Undefer    : RE_Id;
       TaskE_Stmts       : List_Id;
-      Undefer_Args      : List_Id := No_List;
 
       B   : Entity_Id;  --  Call status flag
       Bnn : Entity_Id;  --  Communication block
@@ -6352,13 +6351,7 @@ package body Exp_Ch9 is
 
             --  Create the inner block to protect the abortable part
 
-            Hdle := New_List (
-              Make_Implicit_Exception_Handler (Loc,
-                Exception_Choices =>
-                  New_List (New_Reference_To (Stand.Abort_Signal, Loc)),
-                Statements => New_List (
-                  Make_Procedure_Call_Statement (Loc,
-                    Name => New_Reference_To (RTE (RE_Abort_Undefer), Loc)))));
+            Hdle := New_List (Build_Abort_Block_Handler (Loc));
 
             Prepend_To (Astats,
               Make_Procedure_Call_Statement (Loc,
@@ -6513,13 +6506,21 @@ package body Exp_Ch9 is
          --  See 4jexcept.ads for an explanation.
 
          if VM_Target = No_VM then
-            Target_Undefer := RE_Abort_Undefer;
+            if Exception_Mechanism = Back_End_Exceptions then
+               --  Aborts are not deferred at beginning of exception handlers
+               --  in ZCX.
+               Handler_Stmt := Make_Null_Statement (Loc);
+            else
+               Handler_Stmt := Make_Procedure_Call_Statement (Loc,
+                 Name => New_Reference_To (RTE (RE_Abort_Undefer), Loc),
+                 Parameter_Associations => No_List);
+            end if;
          else
-            Target_Undefer := RE_Update_Exception;
-            Undefer_Args :=
-              New_List (Make_Function_Call (Loc,
-                          Name => New_Occurrence_Of
-                                    (RTE (RE_Current_Target_Exception), Loc)));
+            Handler_Stmt := Make_Procedure_Call_Statement (Loc,
+              Name => New_Reference_To (RTE (RE_Update_Exception), Loc),
+              Parameter_Associations => New_List (Make_Function_Call (Loc,
+                Name => New_Occurrence_Of (RTE (RE_Current_Target_Exception),
+                                           Loc))));
          end if;
 
          Stmts := New_List (
@@ -6542,11 +6543,7 @@ package body Exp_Ch9 is
 
                      Exception_Choices =>
                        New_List (New_Reference_To (Stand.Abort_Signal, Loc)),
-                     Statements => New_List (
-                       Make_Procedure_Call_Statement (Loc,
-                         Name => New_Reference_To (
-                           RTE (Target_Undefer), Loc),
-                         Parameter_Associations => Undefer_Args)))))),
+                     Statements => New_List (Handler_Stmt))))),
 
          --  if not Cancelled (Bnn) then
          --     triggered statements
@@ -6602,14 +6599,7 @@ package body Exp_Ch9 is
 
          --  Create the inner block to protect the abortable part
 
-         Hdle :=  New_List (
-           Make_Implicit_Exception_Handler (Loc,
-             Exception_Choices =>
-               New_List (New_Reference_To (Stand.Abort_Signal, Loc)),
-             Statements =>
-               New_List (
-                 Make_Procedure_Call_Statement (Loc,
-                   Name => New_Reference_To (RTE (RE_Abort_Undefer), Loc)))));
+         Hdle :=  New_List (Build_Abort_Block_Handler (Loc));
 
          Prepend_To (Astats,
            Make_Procedure_Call_Statement (Loc,
index 5596f8a10f967f4334a2ca4d45c7a94b85260756..6751cbf0ee044b2c4eea5f3f96cc484344132f1f 100644 (file)
@@ -64,20 +64,38 @@ package body Exp_Sel is
                   Blk),
 
               Exception_Handlers =>
-                New_List (
-                  Make_Implicit_Exception_Handler (Loc,
-                    Exception_Choices =>
-                      New_List (
-                        New_Reference_To (Stand.Abort_Signal, Loc)),
-                    Statements =>
-                      New_List (
-                        Make_Procedure_Call_Statement (Loc,
-                          Name =>
-                            New_Reference_To (RTE (
-                              RE_Abort_Undefer), Loc),
-                          Parameter_Associations => No_List))))));
+                New_List (Build_Abort_Block_Handler (Loc))));
    end Build_Abort_Block;
 
+   -------------------------------
+   -- Build_Abort_Block_Handler --
+   -------------------------------
+
+   function Build_Abort_Block_Handler
+     (Loc : Source_Ptr) return Node_Id
+   is
+      Stmt : Node_Id;
+   begin
+      if Exception_Mechanism = Back_End_Exceptions then
+         --  With ZCX, aborts are not defered in handlers.
+
+         Stmt := Make_Null_Statement (Loc);
+      else
+         --  With FE SJLJ, aborts are defered at the beginning of Abort_Signal
+         --  handlers.
+
+         Stmt := Make_Procedure_Call_Statement (Loc,
+           Name => New_Reference_To (RTE (RE_Abort_Undefer), Loc),
+           Parameter_Associations => No_List);
+      end if;
+
+      return Make_Implicit_Exception_Handler (Loc,
+        Exception_Choices =>
+          New_List (New_Reference_To (Stand.Abort_Signal, Loc)),
+        Statements =>
+          New_List (Stmt));
+   end Build_Abort_Block_Handler;
+
    -------------
    -- Build_B --
    -------------
index a68459de9d24f6ef945f8b06839ce63092a2fbb0..426e682952061b3e0406d1620e174af9a5b1e562 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2007, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2011, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -39,10 +39,22 @@ package Exp_Sel is
    --    begin
    --       Blk
    --    exception
-   --       when Abort_Signal => Abort_Undefer;
+   --       when Abort_Signal => Abort_Undefer / null;
    --    end;
    --  Abr_Blk_Ent is the name of the generated block, Cln_Blk_Ent is the name
    --  of the encapsulated cleanup block, Blk is the actual block name.
+   --  The exception handler code is built by Build_Abort_Block_Handler.
+
+   function Build_Abort_Block_Handler
+     (Loc : Source_Ptr) return Node_Id;
+   --  Generate if front-end exception:
+   --    when others =>
+   --      Abort_Under;
+   --  or if back-end exception:
+   --    when others =>
+   --      null;
+   --  This is an exception handler to stop propagation of aborts, without
+   --  modifying the deferal level.
 
    function Build_B
      (Loc   : Source_Ptr;
index 10232978260ece0decd429f461876a49902fbbba..30bc23aa59b2af9740282a6ef328836246876e9d 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 2006-2009, Free Software Foundation, Inc.         --
+--          Copyright (C) 2006-2011, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -42,6 +42,9 @@ package System.Exceptions is
    pragma Preelaborate_05;
    --  To let Ada.Exceptions "with" us and let us "with" Standard_Library
 
+   ZCX_By_Default : constant Boolean;
+   --  Visible copy to allow Ada.Exceptions to know the exception model.
+
    package SSL renames System.Standard_Library;
    --  To let some of the hooks below have formal parameters typed in
    --  accordance with what GDB expects.
@@ -75,4 +78,7 @@ package System.Exceptions is
    --
    --  The argument is the address of the exception data
 
+private
+   ZCX_By_Default : constant Boolean := System.ZCX_By_Default;
+
 end System.Exceptions;
index 038db362f230373cb167b9074438010fc4c61729..3cd50020ff8346ec0002afe3fc9cf69ad4f00b73 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                  B o d y                                 --
 --                                                                          --
---         Copyright (C) 1992-2009, Free Software Foundation, Inc.          --
+--         Copyright (C) 1992-2011, Free Software Foundation, Inc.          --
 --                                                                          --
 -- GNARL is free software; you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -1025,6 +1025,10 @@ package body System.Interrupts is
 
    exception
       when Standard'Abort_Signal =>
+         if ZCX_By_Default then
+            Initialization.Defer_Abort_Nestable (STPO.Self);
+         end if;
+
          --  Flush interrupt server semaphores, so they can terminate
          Finalize_Interrupt_Servers;
          raise;
index 8c604c90a7933bb5185848982fc8cd7b26b794f2..4846ef0731c21958f3e8b99d6fe61a9e2f2a328a 100644 (file)
@@ -552,6 +552,11 @@ package body System.Tasking.Rendezvous is
             Send_Trace_Info (M_RDV_Complete, Entry_Call.Self);
          end if;
 
+         Initialization.Defer_Abort_Nestable (Self_Id);
+
+      elsif ZCX_By_Default then
+         --  With ZCX, aborts are not automatically deferred in handlers
+
          Initialization.Defer_Abort_Nestable (Self_Id);
       end if;
 
index 0890181544d6f5fb49ed9ba84a9379a6d66bba74..9e227ed3e26fa86e41ca7abc3453a888ccf8f0d0 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                  B o d y                                 --
 --                                                                          --
---         Copyright (C) 1998-2010, Free Software Foundation, Inc.          --
+--         Copyright (C) 1998-2011, Free Software Foundation, Inc.          --
 --                                                                          --
 -- GNARL is free software; you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -258,7 +258,9 @@ package body System.Tasking.Protected_Objects.Operations is
             --  enabled for its remaining life.
 
             Self_Id := STPO.Self;
-            Initialization.Undefer_Abort_Nestable (Self_Id);
+            if not ZCX_By_Default then
+               Initialization.Undefer_Abort_Nestable (Self_Id);
+            end if;
             Transfer_Occurrence
               (Entry_Call.Self.Common.Compiler_Data.Current_Excep'Access,
                Self_Id.Common.Compiler_Data.Current_Excep);
@@ -270,6 +272,7 @@ package body System.Tasking.Protected_Objects.Operations is
       end if;
 
       if Runtime_Traces then
+         --  ??? Entry_Call can be null
          Send_Trace_Info (PO_Done, Entry_Call.Self);
       end if;
    end Exceptional_Complete_Entry_Body;
index ef2d35546716fb80bbd38d9b4d9dd39bb2559c4c..1d0d23eb647fea9656ed5f2577ecf649fa7981d2 100644 (file)
@@ -507,11 +507,11 @@ package Sem_Util is
      (T   : Entity_Id;
       Pos : Uint;
       Loc : Source_Ptr) return Node_Id;
-   --  This function obtains the E_Enumeration_Literal entity for the specified
-   --  value from the enumeration type or subtype T and returns an identifier
-   --  node referencing this value. The second argument is the Pos value, which
-   --  is assumed to be in range. The third argument supplies a source location
-   --  for constructed nodes returned by this function.
+   --  This function returns an identifier denoting the E_Enumeration_Literal
+   --  entity for the specified value from the enumeration type or subtype T.
+   --  The second argument is the Pos value, which is assumed to be in range.
+   --  The third argument supplies a source location for constructed nodes
+   --  returned by this function.
 
    procedure Get_Library_Unit_Name_String (Decl_Node : Node_Id);
    --  Retrieve the fully expanded name of the library unit declared by
@@ -1297,7 +1297,7 @@ package Sem_Util is
    procedure Set_Current_Entity (E : Entity_Id);
    pragma Inline (Set_Current_Entity);
    --  Establish the entity E as the currently visible definition of its
-   --  associated name (i.e. the Node_Id associated with its name)
+   --  associated name (i.e. the Node_Id associated with its name).
 
    procedure Set_Debug_Info_Needed (T : Entity_Id);
    --  Sets the Debug_Info_Needed flag on entity T , and also on any entities