aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2009-11-12 00:45:09 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2009-11-11 23:45:09 +0000
commit62a0a52e3520e97cd6eff19cfb223d90dbc94211 (patch)
tree88ca223a07a028e0c9a49394506c73c5de5d0d5a /gcc
parentef2bbc8c9ae52d39b509cb8687c093e7617fdda3 (diff)
downloadgcc-62a0a52e3520e97cd6eff19cfb223d90dbc94211.zip
gcc-62a0a52e3520e97cd6eff19cfb223d90dbc94211.tar.gz
gcc-62a0a52e3520e97cd6eff19cfb223d90dbc94211.tar.bz2
re PR middle-end/41729 (Undefined reference with -fPIC -fwhole-program -flto)
PR middle-end/41729 * ipa.c (function_and_variable_visibility): Do not privatize COMDAT and WEAK variables at -fwhole-program. PR middle-end/41735 * ipa.c (whole_program_function_and_variable_visility): COMDAT functions/variables are not needed even if they are externally visible. From-SVN: r154108
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/ipa.c10
2 files changed, 18 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3e4d5be..8c9e6e5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,15 @@
2009-11-11 Jan Hubicka <jh@suse.cz>
+ PR middle-end/41729
+ * ipa.c (function_and_variable_visibility): Do not privatize COMDAT
+ and WEAK variables at -fwhole-program.
+
+ PR middle-end/41735
+ * ipa.c (whole_program_function_and_variable_visility): COMDAT
+ functions/variables are not needed even if they are externally visible.
+
+2009-11-11 Jan Hubicka <jh@suse.cz>
+
(patch by Richard Guenther)
* lto-streamer-out.c (output_function): Output head of argument list
earlier.
diff --git a/gcc/ipa.c b/gcc/ipa.c
index b082efe7..1e5f22c 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -319,6 +319,11 @@ function_and_variable_visibility (bool whole_program)
if (vnode->needed
&& (DECL_COMDAT (vnode->decl) || TREE_PUBLIC (vnode->decl))
&& (!whole_program
+ /* We can privatize comdat readonly variables whose address is not taken,
+ but doing so is not going to bring us optimization oppurtunities until
+ we start reordering datastructures. */
+ || DECL_COMDAT (vnode->decl)
+ || DECL_WEAK (vnode->decl)
|| lookup_attribute ("externally_visible",
DECL_ATTRIBUTES (vnode->decl))))
vnode->externally_visible = true;
@@ -396,10 +401,11 @@ whole_program_function_and_variable_visibility (void)
function_and_variable_visibility (flag_whole_program);
for (node = cgraph_nodes; node; node = node->next)
- if (node->local.externally_visible && node->local.finalized)
+ if ((node->local.externally_visible && !DECL_COMDAT (node->decl))
+ && node->local.finalized)
cgraph_mark_needed_node (node);
for (vnode = varpool_nodes_queue; vnode; vnode = vnode->next_needed)
- if (vnode->externally_visible)
+ if (vnode->externally_visible && !DECL_COMDAT (vnode->decl))
varpool_mark_needed_node (vnode);
return 0;
}