aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2010-04-30 16:26:51 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2010-04-30 14:26:51 +0000
commit05575e078047eec2ec0730ffd9f2f99f344c3f35 (patch)
tree5ecd0243cf1b240d9c4aba38a058cf969ac70a4d
parent9c6e0798279c7a954be6eb782d07edc14f3b9ee8 (diff)
downloadgcc-05575e078047eec2ec0730ffd9f2f99f344c3f35.zip
gcc-05575e078047eec2ec0730ffd9f2f99f344c3f35.tar.gz
gcc-05575e078047eec2ec0730ffd9f2f99f344c3f35.tar.bz2
lto-cgraph.c (lto_output_varpool_node): Always output constant pool references.
* lto-cgraph.c (lto_output_varpool_node): Always output constant pool references. * lto.c: Do not attempt to make constant pool references global. From-SVN: r158938
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/lto-cgraph.c19
-rw-r--r--gcc/lto/ChangeLog4
-rw-r--r--gcc/lto/lto.c8
4 files changed, 30 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a211704..a5f8d09 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2010-04-30 Jan Hubicka <jh@suse.cz>
+ * lto-cgraph.c (lto_output_varpool_node): Always output constant pool
+ references.
+
+2010-04-30 Jan Hubicka <jh@suse.cz>
+
* tree-profile.c (tree_init_ic_make_global_vars): Mark new decls as
needed.
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
index 338250a..8a8855a 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 52663e7..78452a7 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,7 @@
+2010-04-30 Jan Hubicka <jh@suse.cz>
+
+ * lto.c: Do not attempt to make constant pool references global.
+
2010-04-28 Jan Hubicka <jh@suse.cz>
* lto/lto.c (lto_read_in_decl_state): Use GGC.
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index ae3d90e..18fef05 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;