aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-07-24 15:50:31 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2014-07-24 13:50:31 +0000
commit10a3a880c1c39baa9e0d6c792c665a5b80eb41d0 (patch)
tree9627af636077948ca1b0b54017736df9f2a61982
parentc4bc3399f7605a632da40532e19d5fd3c33cc09d (diff)
downloadgcc-10a3a880c1c39baa9e0d6c792c665a5b80eb41d0.zip
gcc-10a3a880c1c39baa9e0d6c792c665a5b80eb41d0.tar.gz
gcc-10a3a880c1c39baa9e0d6c792c665a5b80eb41d0.tar.bz2
re PR lto/61802 (AArch64 execute.exp failures with LTO after r212467)
PR lto/61802 * varasm.c (bss_initializer_p): Handle offlined ctors. (align_variable, get_variable_align): Likewise. (make_decl_one_only): Likewise. (default_binds_local_p_1): Likewise. (decl_binds_to_current_def_p): Likewise. (get_variable_section): Get constructor if it is offlined. (assemble_variable_contents): Sanity check that the caller streamed in the ctor in LTO. From-SVN: r212991
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/varasm.c37
2 files changed, 40 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9ba6bfb..f902436 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2014-07-24 Jan Hubicka <hubicka@ucw.cz>
+
+ PR lto/61802
+ * varasm.c (bss_initializer_p): Handle offlined ctors.
+ (align_variable, get_variable_align): Likewise.
+ (make_decl_one_only): Likewise.
+ (default_binds_local_p_1): Likewise.
+ (decl_binds_to_current_def_p): Likewise.
+ (get_variable_section): Get constructor if it is offlined.
+ (assemble_variable_contents): Sanity check that the caller
+ streamed in the ctor in LTO.
+
2014-07-24 Roman Gareev <gareevroman@gmail.com>
* graphite-isl-ast-to-gimple.c:
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 275b65f..819ec26 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -956,7 +956,10 @@ bool
bss_initializer_p (const_tree decl)
{
return (DECL_INITIAL (decl) == NULL
- || DECL_INITIAL (decl) == error_mark_node
+ /* In LTO we have no errors in program; error_mark_node is used
+ to mark offlined constructors. */
+ || (DECL_INITIAL (decl) == error_mark_node
+ && !in_lto_p)
|| (flag_zero_initialized_in_bss
/* Leave constant zeroes in .rodata so they
can be shared. */
@@ -1017,7 +1020,9 @@ align_variable (tree decl, bool dont_output_data)
#endif
#ifdef CONSTANT_ALIGNMENT
if (DECL_INITIAL (decl) != 0
- && DECL_INITIAL (decl) != error_mark_node)
+ /* In LTO we have no errors in program; error_mark_node is used
+ to mark offlined constructors. */
+ && (in_lto_p || DECL_INITIAL (decl) != error_mark_node))
{
unsigned int const_align
= CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
@@ -1068,7 +1073,10 @@ get_variable_align (tree decl)
align = data_align;
#endif
#ifdef CONSTANT_ALIGNMENT
- if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node)
+ if (DECL_INITIAL (decl) != 0
+ /* In LTO we have no errors in program; error_mark_node is used
+ to mark offlined constructors. */
+ && (in_lto_p || DECL_INITIAL (decl) != error_mark_node))
{
unsigned int const_align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl),
align);
@@ -1092,13 +1100,20 @@ get_variable_section (tree decl, bool prefer_noswitch_p)
{
addr_space_t as = ADDR_SPACE_GENERIC;
int reloc;
- symtab_node *snode = symtab_node::get (decl);
- if (snode)
- decl = snode->ultimate_alias_target ()->decl;
+ varpool_node *vnode = varpool_node::get (decl);
+ if (vnode)
+ {
+ vnode = vnode->ultimate_alias_target ();
+ decl = vnode->decl;
+ }
if (TREE_TYPE (decl) != error_mark_node)
as = TYPE_ADDR_SPACE (TREE_TYPE (decl));
+ /* We need the constructor to figure out reloc flag. */
+ if (vnode)
+ vnode->get_constructor ();
+
if (DECL_COMMON (decl))
{
/* If the decl has been given an explicit section name, or it resides
@@ -1963,6 +1978,9 @@ assemble_variable_contents (tree decl, const char *name,
if (!dont_output_data)
{
+ /* Caller is supposed to use varpool_get_constructor when it wants
+ to output the body. */
+ gcc_assert (!in_lto_p || DECL_INITIAL (decl) != error_mark_node);
if (DECL_INITIAL (decl)
&& DECL_INITIAL (decl) != error_mark_node
&& !initializer_zerop (DECL_INITIAL (decl)))
@@ -5890,7 +5908,8 @@ make_decl_one_only (tree decl, tree comdat_group)
symbol->set_comdat_group (comdat_group);
}
else if (TREE_CODE (decl) == VAR_DECL
- && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
+ && (DECL_INITIAL (decl) == 0
+ || (!in_lto_p && DECL_INITIAL (decl) == error_mark_node)))
DECL_COMMON (decl) = 1;
else
{
@@ -6752,7 +6771,7 @@ default_binds_local_p_1 (const_tree exp, int shlib)
else if (DECL_COMMON (exp)
&& !resolved_locally
&& (DECL_INITIAL (exp) == NULL
- || DECL_INITIAL (exp) == error_mark_node))
+ || (!in_lto_p && DECL_INITIAL (exp) == error_mark_node)))
local_p = false;
/* Otherwise we're left with initialized (or non-common) global data
which is of necessity defined locally. */
@@ -6807,7 +6826,7 @@ decl_binds_to_current_def_p (const_tree decl)
return false;
if (DECL_COMMON (decl)
&& (DECL_INITIAL (decl) == NULL
- || DECL_INITIAL (decl) == error_mark_node))
+ || (!in_lto_p && DECL_INITIAL (decl) == error_mark_node)))
return false;
if (DECL_EXTERNAL (decl))
return false;