diff options
author | Jan Hubicka <jh@suse.cz> | 2009-11-12 00:45:09 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2009-11-11 23:45:09 +0000 |
commit | 62a0a52e3520e97cd6eff19cfb223d90dbc94211 (patch) | |
tree | 88ca223a07a028e0c9a49394506c73c5de5d0d5a /gcc | |
parent | ef2bbc8c9ae52d39b509cb8687c093e7617fdda3 (diff) | |
download | gcc-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/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/ipa.c | 10 |
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. @@ -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; } |