From f300163e617c181da8b69e1146391bcf3330257f Mon Sep 17 00:00:00 2001 From: hubicka Date: Sun, 22 Mar 2015 21:10:24 +0000 Subject: [PATCH] PR ipa/65502 * ipa-comdats.c (enqueue_references): Walk through thunks. (ipa_comdats): Likewise. (set_comdat_group_1): New function. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221574 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/ipa-comdats.c | 44 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e264920..44eaf45 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2015-03-20 Jan Hubicka + PR ipa/65502 + * ipa-comdats.c (enqueue_references): Walk through thunks. + (ipa_comdats): Likewise. + (set_comdat_group_1): New function. + +2015-03-20 Jan Hubicka + PR ipa/65475 * ipa-devirt.c (add_type_duplicate): Prevail polymorphic type over non-polymorphic diff --git a/gcc/ipa-comdats.c b/gcc/ipa-comdats.c index 9f43f29..f349f9f 100644 --- a/gcc/ipa-comdats.c +++ b/gcc/ipa-comdats.c @@ -182,6 +182,10 @@ enqueue_references (symtab_node **first, for (i = 0; symbol->iterate_reference (i, ref); i++) { symtab_node *node = ref->referred->ultimate_alias_target (); + + /* Always keep thunks in same sections as target function. */ + if (is_a (node)) + node = dyn_cast (node)->function_symbol (); if (!node->aux && node->definition) { node->aux = *first; @@ -199,6 +203,10 @@ enqueue_references (symtab_node **first, else { symtab_node *node = edge->callee->ultimate_alias_target (); + + /* Always keep thunks in same sections as target function. */ + if (is_a (node)) + node = dyn_cast (node)->function_symbol (); if (!node->aux && node->definition) { node->aux = *first; @@ -209,7 +217,7 @@ enqueue_references (symtab_node **first, } /* Set comdat group of SYMBOL to GROUP. - Callback for symtab_for_node_and_aliases. */ + Callback for for_node_and_aliases. */ bool set_comdat_group (symtab_node *symbol, @@ -223,6 +231,16 @@ set_comdat_group (symtab_node *symbol, return false; } +/* Set comdat group of SYMBOL to GROUP. + Callback for for_node_thunks_and_aliases. */ + +bool +set_comdat_group_1 (cgraph_node *symbol, + void *head_p) +{ + return set_comdat_group (symbol, head_p); +} + /* The actual pass with the main dataflow loop. */ static unsigned int @@ -263,7 +281,12 @@ ipa_comdats (void) && (DECL_STATIC_CONSTRUCTOR (symbol->decl) || DECL_STATIC_DESTRUCTOR (symbol->decl)))) { - map.put (symbol->ultimate_alias_target (), error_mark_node); + symtab_node *target = symbol->ultimate_alias_target (); + + /* Always keep thunks in same sections as target function. */ + if (is_a (target)) + target = dyn_cast (target)->function_symbol (); + map.put (target, error_mark_node); /* Mark the symbol so we won't waste time visiting it for dataflow. */ symbol->aux = (symtab_node *) (void *) 1; @@ -332,10 +355,8 @@ ipa_comdats (void) symbol->aux = NULL; if (!symbol->get_comdat_group () && !symbol->alias - /* Thunks to external functions do not need to be categorized. */ && (!(fun = dyn_cast (symbol)) - || !fun->thunk.thunk_p - || fun->function_symbol ()->definition) + || !fun->thunk.thunk_p) && symbol->real_symbol_p ()) { tree *val = map.get (symbol); @@ -355,9 +376,16 @@ ipa_comdats (void) symbol->dump (dump_file); fprintf (dump_file, "To group: %s\n", IDENTIFIER_POINTER (group)); } - symbol->call_for_symbol_and_aliases (set_comdat_group, - *comdat_head_map.get (group), - true); + if (is_a (symbol)) + dyn_cast (symbol)->call_for_symbol_and_aliases + (set_comdat_group_1, + *comdat_head_map.get (group), + true); + else + symbol->call_for_symbol_and_aliases + (set_comdat_group, + *comdat_head_map.get (group), + true); } } return 0; -- 2.7.4