aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2019-12-16 10:33:59 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-12-16 10:33:59 +0000
commit9c9535f974cb9a348fd99a90d0ab08a32583d337 (patch)
tree44efba3654310f78c99a78a54dc0e6a88b8f111f /gcc/ada
parent90393d3ca7fe7547777473f4b197792f1cb3fca9 (diff)
downloadgcc-9c9535f974cb9a348fd99a90d0ab08a32583d337.zip
gcc-9c9535f974cb9a348fd99a90d0ab08a32583d337.tar.gz
gcc-9c9535f974cb9a348fd99a90d0ab08a32583d337.tar.bz2
[Ada] Expand renamings of subcomponents of an atomic or VFA object
2019-12-16 Eric Botcazou <ebotcazou@adacore.com> gcc/ada/ * exp_ch8.adb (Expand_N_Object_Renaming_Declaration): Document third special case of renamings requiring special handling. (Evaluation_Required): Return true for an atomic or VFA prefix. From-SVN: r279423
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/exp_ch8.adb24
2 files changed, 25 insertions, 5 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index e0f821b..2151a4e 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+2019-12-16 Eric Botcazou <ebotcazou@adacore.com>
+
+ * exp_ch8.adb (Expand_N_Object_Renaming_Declaration): Document
+ third special case of renamings requiring special handling.
+ (Evaluation_Required): Return true for an atomic or VFA prefix.
+
2019-12-16 Ed Schonberg <schonberg@adacore.com>
* checks.adb (Apply_Float_Conversion_Check): Use node of type
diff --git a/gcc/ada/exp_ch8.adb b/gcc/ada/exp_ch8.adb
index c3a77ed..dcb51ef6 100644
--- a/gcc/ada/exp_ch8.adb
+++ b/gcc/ada/exp_ch8.adb
@@ -72,7 +72,14 @@ package body Exp_Ch8 is
-- clause applies (that can specify an arbitrary bit boundary), or where
-- the enclosing record itself has a non-standard representation.
- -- In these two cases, we pre-evaluate the renaming expression, by
+ -- In Ada 2020, a third case arises when the renamed object is a nonatomic
+ -- subcomponent of an atomic object, because reads of or writes to it must
+ -- access the enclosing atomic object. That's also the case for an object
+ -- subject to the Volatile_Full_Access GNAT aspect/pragma in any language
+ -- version. For the sake of simplicity, we treat any subcomponent of an
+ -- atomic or Volatile_Full_Access object in any language version this way.
+
+ -- In these three cases, we pre-evaluate the renaming expression, by
-- extracting and freezing the values of any subscripts, and then we
-- set the flag Is_Renaming_Of_Object which means that any reference
-- to the object will be handled by macro substitution in the front
@@ -102,10 +109,10 @@ package body Exp_Ch8 is
-- Determines whether it is necessary to do static name evaluation for
-- renaming of Nam. It is considered necessary if evaluating the name
-- involves indexing a packed array, or extracting a component of a
- -- record to which a component clause applies. Note that we are only
- -- interested in these operations if they occur as part of the name
- -- itself, subscripts are just values that are computed as part of the
- -- evaluation, so their form is unimportant.
+ -- record to which a component clause applies, or a subcomponent of an
+ -- atomic object. Note that we are only interested in these operations
+ -- if they occur as part of the name itself, subscripts are just values
+ -- that are computed as part of the evaluation, so they are unimportant.
-- In addition, always return True for Modify_Tree_For_C since the
-- code generator doesn't know how to handle renamings.
@@ -121,6 +128,10 @@ package body Exp_Ch8 is
elsif Nkind_In (Nam, N_Indexed_Component, N_Slice) then
if Is_Packed (Etype (Prefix (Nam))) then
return True;
+
+ elsif Is_Atomic_Or_VFA_Object (Prefix (Nam)) then
+ return True;
+
else
return Evaluation_Required (Prefix (Nam));
end if;
@@ -141,6 +152,9 @@ package body Exp_Ch8 is
then
return True;
+ elsif Is_Atomic_Or_VFA_Object (Prefix (Nam)) then
+ return True;
+
else
return Evaluation_Required (Prefix (Nam));
end if;