[Ada] Disable calls to Abort defer/undefer when ZCX_By_Default
authorArnaud Charlet <charlet@adacore.com>
Tue, 9 Jul 2019 07:54:50 +0000 (07:54 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 9 Jul 2019 07:54:50 +0000 (07:54 +0000)
2019-07-09  Arnaud Charlet  <charlet@adacore.com>

gcc/ada/

* libgnat/s-memory.adb: Disable calls to Abort defer/undefer
when ZCX_By_Default.

From-SVN: r273284

gcc/ada/ChangeLog
gcc/ada/libgnat/s-memory.adb

index d8f7de624dbe96fb5b7f08ab31a9299e561c3774..3832b31eaadcdd3d0808ef0ea9250049d4b44dfb 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-09  Arnaud Charlet  <charlet@adacore.com>
+
+       * libgnat/s-memory.adb: Disable calls to Abort defer/undefer
+       when ZCX_By_Default.
+
 2019-07-09  Javier Miranda  <miranda@adacore.com>
 
        * sem_ch13.adb (Rep_Item_Too_Early): Representation clauses are
index f34a92bb5f773842601b0a5a0ea1c49b0fb21b48..ebc168e912edea77411246a3b7b6538a39900fb0 100644 (file)
 
 --  This implementation assumes that the underlying malloc/free/realloc
 --  implementation is thread safe, and thus, no additional lock is required.
---  Note that we still need to defer abort because on most systems, an
---  asynchronous signal (as used for implementing asynchronous abort of
---  task) cannot safely be handled while malloc is executing.
-
---  If you are not using Ada constructs containing the "abort" keyword, then
---  you can remove the calls to Abort_Defer.all and Abort_Undefer.all from
---  this unit.
+--  Note that when using sjlj exception handling, we still need to defer abort
+--  because an asynchronous signal (as used for implementing asynchronous abort
+--  of task on sjlj runtimes) cannot safely be handled while malloc is
+--  executing.
 
 pragma Compiler_Unit_Warning;
 
@@ -80,7 +77,7 @@ package body System.Memory is
          raise Storage_Error with "object too large";
       end if;
 
-      if Parameters.No_Abort then
+      if ZCX_By_Default or else Parameters.No_Abort then
          Result := c_malloc (System.CRTL.size_t (Size));
       else
          Abort_Defer.all;
@@ -121,7 +118,7 @@ package body System.Memory is
 
    procedure Free (Ptr : System.Address) is
    begin
-      if Parameters.No_Abort then
+      if ZCX_By_Default or else Parameters.No_Abort then
          c_free (Ptr);
       else
          Abort_Defer.all;
@@ -145,7 +142,7 @@ package body System.Memory is
          raise Storage_Error with "object too large";
       end if;
 
-      if Parameters.No_Abort then
+      if ZCX_By_Default or else Parameters.No_Abort then
          Result := c_realloc (Ptr, System.CRTL.size_t (Size));
       else
          Abort_Defer.all;