]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
exp_ch4.adb (Expand_N_Indexed_Component): Active synchronization if the prefix denote...
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 17 Feb 2016 09:21:58 +0000 (09:21 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 17 Feb 2016 09:21:58 +0000 (09:21 +0000)
* exp_ch4.adb (Expand_N_Indexed_Component): Active synchronization if
the prefix denotes an entity which Has_Atomic_Components.
* gcc-interface/trans.c (node_is_atomic): Return true if the prefix
denotes an entity which Has_Atomic_Components.

From-SVN: r233485

gcc/ada/ChangeLog
gcc/ada/exp_ch4.adb
gcc/ada/gcc-interface/trans.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/atomic8.adb [new file with mode: 0644]

index 60ff796610222dd7f86c87c759d8a60b7c011ea4..4868cae34a2fd1e9443d96d8f533a68d149868ad 100644 (file)
@@ -1,3 +1,10 @@
+2016-02-17  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * exp_ch4.adb (Expand_N_Indexed_Component): Active synchronization if
+       the prefix denotes an entity which Has_Atomic_Components.
+       * gcc-interface/trans.c (node_is_atomic): Return true if the prefix
+       denotes an entity which Has_Atomic_Components.
+
 2016-02-17  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/utils2.c (gnat_protect_expr): Make a SAVE_EXPR only
index 0b1fe7920a071f0a2914fe4a9048238fab276283..eff75c25ab0260eb3b5d317503bb1442dc31c3d3 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2015, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2016, 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- --
@@ -6269,6 +6269,9 @@ package body Exp_Ch4 is
            and then not Atomic_Synchronization_Disabled (Atp))
         or else (Is_Atomic (Typ)
                   and then not Atomic_Synchronization_Disabled (Typ))
+        or else (Is_Entity_Name (P)
+                  and then Has_Atomic_Components (Entity (P))
+                  and then not Atomic_Synchronization_Disabled (Entity (P)))
       then
          Activate_Atomic_Synchronization (N);
       end if;
index 0f626d4e07c732c4e20db50495b3fa78d2bc3510..fce3f0e2633b7afc8626f23eb89ba0986fae5028 100644 (file)
@@ -4028,6 +4028,9 @@ node_is_atomic (Node_Id gnat_node)
     case N_Indexed_Component:
       if (Has_Atomic_Components (Etype (Prefix (gnat_node))))
        return true;
+      if (Is_Entity_Name (Prefix (gnat_node))
+         && Has_Atomic_Components (Entity (Prefix (gnat_node))))
+       return true;
 
       /* ... fall through ... */
 
index 397b40f4049d22c9ddb748eb400b1032cac62cc7..59ce25469f4f8568163b1b4b3c5bad53576a8ca9 100644 (file)
@@ -1,3 +1,7 @@
+2016-02-17  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/atomic8.adb: New test.
+
 2016-02-17  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/discr46.ad[sb]: New test.
diff --git a/gcc/testsuite/gnat.dg/atomic8.adb b/gcc/testsuite/gnat.dg/atomic8.adb
new file mode 100644 (file)
index 0000000..76a110d
--- /dev/null
@@ -0,0 +1,33 @@
+-- { dg-do run }
+
+procedure Atomic8 is
+
+   V : array (1 .. 2) of Natural := (0,0) with Atomic_Components;
+
+   task type TT1;
+   task body TT1 is
+   begin
+      while V (1) + V (2) < 1_000_000 loop
+         V (1) := V (1) + 1;
+      end loop;
+   end TT1;
+
+   task type TT2;
+   task body TT2 is
+   begin
+      while V (1) + V (2) < 1_000_000 loop
+         V (2) := V (2) + 1;
+      end loop;
+   end TT2;
+
+begin
+   declare
+      T1 : TT1;
+      T2 : TT2;
+   begin
+      null;
+   end;
+   if V (1) + V (2) not in 1_000_000 | 1_000_001 then
+      raise Program_Error;
+   end if;
+end;