summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2015-02-11 19:11:47 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2015-02-11 19:11:47 +0000
commit6cb8fb82f149ffca471ef2217144b19db1554344 (patch)
tree8ab6d8436aa96eaf64d3698bb24df0eaba1b0f19
parentdb7b23e59ac4abf21d314a143d28dd151d4d74a3 (diff)
downloadgcc-6cb8fb82f149ffca471ef2217144b19db1554344.tar.gz
* ipa.c (symbol_table::remove_unreachable_nodes): Avoid releasing
bodies of thunks; comment on why. * symtab.c (symtab_node::get_partitioning_class): Aliases of extern symbols are extern. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220630 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/ipa.c8
-rw-r--r--gcc/symtab.c4
3 files changed, 17 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 87bf089b754..d8952092c43 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2015-02-11 Jan Hubicka <hubicka@ucw.cz>
+
+ * ipa.c (symbol_table::remove_unreachable_nodes): Avoid releasing
+ bodies of thunks; comment on why.
+ * symtab.c (symtab_node::get_partitioning_class): Aliases of extern
+ symbols are extern.
+
2015-02-11 Richard Henderson <rth@redhat.com>
PR sanitize/65000
diff --git a/gcc/ipa.c b/gcc/ipa.c
index 620431c54d6..58ba3097377 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -537,7 +537,13 @@ symbol_table::remove_unreachable_nodes (FILE *file)
/* If node is unreachable, remove its body. */
else if (!reachable.contains (node))
{
- if (!body_needed_for_clonning.contains (node->decl))
+ /* We keep definitions of thunks and aliases in the boundary so
+ we can walk to the ultimate alias targets and function symbols
+ reliably. */
+ if (node->alias || node->thunk.thunk_p)
+ ;
+ else if (!body_needed_for_clonning.contains (node->decl)
+ && !node->alias && !node->thunk.thunk_p)
node->release_body ();
else if (!node->clone_of)
gcc_assert (in_lto_p || DECL_RESULT (node->decl));
diff --git a/gcc/symtab.c b/gcc/symtab.c
index 3bfb04a25c1..3cdf62aeede 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -1779,6 +1779,8 @@ symtab_node::get_partitioning_class (void)
if (varpool_node *vnode = dyn_cast <varpool_node *> (this))
{
+ if (alias && definition && !ultimate_alias_target ()->definition)
+ return SYMBOL_EXTERNAL;
/* Constant pool references use local symbol names that can not
be promoted global. We should never put into a constant pool
objects that can not be duplicated across partitions. */
@@ -1790,7 +1792,7 @@ symtab_node::get_partitioning_class (void)
Handle them as external; compute_ltrans_boundary take care to make
proper things to happen (i.e. to make them appear in the boundary but
with body streamed, so clone can me materialized). */
- else if (!dyn_cast <cgraph_node *> (this)->definition)
+ else if (!dyn_cast <cgraph_node *> (this)->function_symbol ()->definition)
return SYMBOL_EXTERNAL;
/* Linker discardable symbols are duplicated to every use unless they are