diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a2117040071..a5f8d09513d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-04-30 Jan Hubicka + + * lto-cgraph.c (lto_output_varpool_node): Always output constant pool + references. + 2010-04-30 Jan Hubicka * tree-profile.c (tree_init_ic_make_global_vars): Mark new decls as diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index 338250aeb0d..8a8855a70c1 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -374,10 +374,21 @@ lto_output_varpool_node (struct lto_simple_output_block *ob, struct varpool_node gcc_assert (node->finalized || !node->analyzed); gcc_assert (node->needed); gcc_assert (!node->alias); - /* FIXME: We have no idea how we move references around. For moment assume that - everything is used externally. */ - bp_pack_value (bp, flag_wpa, 1); /* used_from_other_parition. */ - bp_pack_value (bp, boundary_p, 1); /* in_other_partition. */ + /* Constant pool initializers can be de-unified into individual ltrans units. + FIXME: Alternatively at -Os we may want to avoid generating for them the local + labels and share them across LTRANS partitions. */ + if (DECL_IN_CONSTANT_POOL (node->decl)) + { + bp_pack_value (bp, 0, 1); /* used_from_other_parition. */ + bp_pack_value (bp, 0, 1); /* in_other_partition. */ + } + else + { + /* FIXME: We have no idea how we move references around. For moment assume that + everything is used externally. */ + bp_pack_value (bp, flag_wpa, 1); /* used_from_other_parition. */ + bp_pack_value (bp, boundary_p, 1); /* in_other_partition. */ + } /* Also emit any extra name aliases. */ for (alias = node->extra_name; alias; alias = alias->next) count++; diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 52663e75078..78452a759b2 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,7 @@ +2010-04-30 Jan Hubicka + + * lto.c: Do not attempt to make constant pool references global. + 2010-04-28 Jan Hubicka * lto/lto.c (lto_read_in_decl_state): Use GGC. diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index ae3d90eaf4c..18fef05317d 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -723,9 +723,13 @@ lto_promote_cross_file_statics (void) gcc_assert (flag_wpa); /* At moment we make no attempt to figure out who is refering the variables, - so all must become global. */ + so all must become global. + + Constant pool references use internal labels and thus can not be made global. + It is sensible to keep those ltrans local to allow better optimization. */ for (vnode = varpool_nodes; vnode; vnode = vnode->next) - if (!vnode->externally_visible && vnode->analyzed) + if (!vnode->externally_visible && vnode->analyzed + && !DECL_IN_CONSTANT_POOL (vnode->decl)) { TREE_PUBLIC (vnode->decl) = 1; DECL_VISIBILITY (vnode->decl) = VISIBILITY_HIDDEN;