From d3f2e41eae66b3699aaa6e2bfc4ce5b86cedd37e Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Wed, 11 Feb 2015 20:11:47 +0100 Subject: [PATCH] ipa.c (symbol_table::remove_unreachable_nodes): Avoid releasing bodies of thunks; comment on why. * 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. From-SVN: r220630 --- gcc/ChangeLog | 7 +++++++ gcc/ipa.c | 8 +++++++- gcc/symtab.c | 4 +++- 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 + + * 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 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 (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 (this)->definition) + else if (!dyn_cast (this)->function_symbol ()->definition) return SYMBOL_EXTERNAL; /* Linker discardable symbols are duplicated to every use unless they are -- 2.30.2