summaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/utils.c
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2016-07-11 08:16:48 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2016-07-11 08:16:48 +0000
commit78f7c4e50ed4c74e8362d2955a64a85a9b2e11ab (patch)
treebc751dc234498dcd1192cf177d53d0f58422dcc5 /gcc/ada/gcc-interface/utils.c
parent142436b80c7f92e0096c0f9f361eada7e0edd57c (diff)
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@238206 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/gcc-interface/utils.c')
-rw-r--r--gcc/ada/gcc-interface/utils.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 66c5408c564d..3a546ff0af67 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -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,