From: Eric Botcazou Date: Wed, 17 Feb 2016 09:21:58 +0000 (+0000) Subject: exp_ch4.adb (Expand_N_Indexed_Component): Active synchronization if the prefix denote... X-Git-Tag: basepoints/gcc-7~904 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e2f0522e06523c19b62d1acc9925a63401c82b63;p=thirdparty%2Fgcc.git exp_ch4.adb (Expand_N_Indexed_Component): Active synchronization if the prefix denotes an entity which Has_Atomic_Components. * 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 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 60ff79661022..4868cae34a2f 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2016-02-17 Eric Botcazou + + * 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 * gcc-interface/utils2.c (gnat_protect_expr): Make a SAVE_EXPR only diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 0b1fe7920a07..eff75c25ab02 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -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; diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 0f626d4e07c7..fce3f0e2633b 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -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 ... */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 397b40f4049d..59ce25469f4f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-02-17 Eric Botcazou + + * gnat.dg/atomic8.adb: New test. + 2016-02-17 Eric Botcazou * 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 index 000000000000..76a110d72c55 --- /dev/null +++ b/gcc/testsuite/gnat.dg/atomic8.adb @@ -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;