trans.c (add_decl_expr): Minor tweak.
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 11 Jul 2016 08:16:48 +0000 (08:16 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 11 Jul 2016 08:16:48 +0000 (08:16 +0000)
* gcc-interface/trans.c (add_decl_expr): Minor tweak.
* gcc-interface/utils.c (create_var_decl): For an external variable,
also clear TREE_READONLY in LTO mode if the initializer is not a valid
constant and set DECL_READONLY_ONCE_ELAB instead.

From-SVN: r238206

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c
gcc/ada/gcc-interface/utils.c

index 21d61873404f1b1ac32e99c1d90ddbc1c9a3504d..24756a3d570bbd1bcb47ee6cc03d25c0e84a6952 100644 (file)
@@ -1,3 +1,10 @@
+2016-07-11  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/trans.c (add_decl_expr): Minor tweak.
+       * gcc-interface/utils.c (create_var_decl): For an external variable,
+       also clear TREE_READONLY in LTO mode if the initializer is not a valid
+       constant and set DECL_READONLY_ONCE_ELAB instead.
+
 2016-07-11  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR ada/71817
index e23724312b711815c1c8a1c8d7bf0b797c7748aa..9d76fb94a733312497f16d8d98daf15003dadb84 100644 (file)
@@ -8012,7 +8012,7 @@ void
 add_decl_expr (tree gnu_decl, Entity_Id gnat_entity)
 {
   tree type = TREE_TYPE (gnu_decl);
-  tree gnu_stmt, gnu_init, t;
+  tree gnu_stmt, gnu_init;
 
   /* If this is a variable that Gigi is to ignore, we may have been given
      an ERROR_MARK.  So test for it.  We also might have been given a
@@ -8059,15 +8059,6 @@ add_decl_expr (tree gnu_decl, Entity_Id gnat_entity)
              && !initializer_constant_valid_p (gnu_init,
                                                TREE_TYPE (gnu_init)))))
     {
-      /* If GNU_DECL has a padded type, convert it to the unpadded
-        type so the assignment is done properly.  */
-      if (TYPE_IS_PADDING_P (type))
-       t = convert (TREE_TYPE (TYPE_FIELDS (type)), gnu_decl);
-      else
-       t = gnu_decl;
-
-      gnu_stmt = build_binary_op (INIT_EXPR, NULL_TREE, t, gnu_init);
-
       DECL_INITIAL (gnu_decl) = NULL_TREE;
       if (TREE_READONLY (gnu_decl))
        {
@@ -8075,6 +8066,12 @@ add_decl_expr (tree gnu_decl, Entity_Id gnat_entity)
          DECL_READONLY_ONCE_ELAB (gnu_decl) = 1;
        }
 
+      /* If GNU_DECL has a padded type, convert it to the unpadded
+        type so the assignment is done properly.  */
+      if (TYPE_IS_PADDING_P (type))
+       gnu_decl = convert (TREE_TYPE (TYPE_FIELDS (type)), gnu_decl);
+
+      gnu_stmt = build_binary_op (INIT_EXPR, NULL_TREE, gnu_decl, gnu_init);
       add_stmt_with_node (gnu_stmt, gnat_entity);
     }
 }
index 66c5408c564d810b9ed4306d9c4d09a2121fd140..3a546ff0af6789a7402a3dae18604ae16fe59131 100644 (file)
@@ -2430,8 +2430,9 @@ create_var_decl (tree name, tree asm_name, tree type, tree init,
      and may be used for scalars in general but not for aggregates.  */
   tree var_decl
     = build_decl (input_location,
-                 (constant_p && const_decl_allowed_p
-                  && !AGGREGATE_TYPE_P (type)) ? CONST_DECL : VAR_DECL,
+                 (constant_p
+                  && const_decl_allowed_p
+                  && !AGGREGATE_TYPE_P (type) ? CONST_DECL : VAR_DECL),
                  name, type);
 
   /* Detect constants created by the front-end to hold 'reference to function
@@ -2456,9 +2457,20 @@ create_var_decl (tree name, tree asm_name, tree type, tree init,
      constant initialization and save any variable elaborations for the
      elaboration routine.  If we are just annotating types, throw away the
      initialization if it isn't a constant.  */
-  if ((extern_flag && !constant_p)
+  if ((extern_flag && init && !constant_p)
       || (type_annotate_only && init && !TREE_CONSTANT (init)))
-    init = NULL_TREE;
+    {
+      init = NULL_TREE;
+
+      /* In LTO mode, also clear TREE_READONLY the same way add_decl_expr
+        would do it if the initializer was not thrown away here, as the
+        WPA phase requires a consistent view across compilation units.  */
+      if (const_flag && flag_generate_lto)
+       {
+         const_flag = false;
+         DECL_READONLY_ONCE_ELAB (var_decl) = 1;
+       }
+    }
 
   /* At the global level, a non-constant initializer generates elaboration
      statements.  Check that such statements are allowed, that is to say,