From 7352723b9e9a7f04d68aca3f09386d1a14c87f7e Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 11 Jul 2016 08:16:48 +0000 Subject: [PATCH] trans.c (add_decl_expr): Minor tweak. * 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 | 7 +++++++ gcc/ada/gcc-interface/trans.c | 17 +++++++---------- gcc/ada/gcc-interface/utils.c | 20 ++++++++++++++++---- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 21d6187..24756a3 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,12 @@ 2016-07-11 Eric Botcazou + * 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 + PR ada/71817 * adaint.c (__gnat_is_read_accessible_file): Add parentheses. (__gnat_is_write_accessible_file): Likewise. diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index e237243..9d76fb9 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -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); } } diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 66c5408..3a546ff 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, -- 2.7.4