diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-03-22 21:10:24 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-03-22 21:10:24 +0000 |
commit | f300163e617c181da8b69e1146391bcf3330257f (patch) | |
tree | fb2d3bfeee17bb863c1cb4a35e4b1dbea1e364e2 /gcc | |
parent | 98fec08e6e74b663b4083f5e55f3bdbe76108ba5 (diff) | |
download | gcc-f300163e617c181da8b69e1146391bcf3330257f.tar.gz |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/ipa-comdats.c | 44 |
2 files changed, 43 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e2649206fe4..44eaf45415c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2015-03-20 Jan Hubicka <hubicka@ucw.cz> + 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 <hubicka@ucw.cz> + 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 9f43f299dbb..f349f9f087e 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 <cgraph_node *>(node)) + node = dyn_cast <cgraph_node *> (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 <cgraph_node *>(node)) + node = dyn_cast <cgraph_node *> (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 <cgraph_node *>(target)) + target = dyn_cast <cgraph_node *> (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 <cgraph_node *> (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 <cgraph_node *> (symbol)) + dyn_cast <cgraph_node *>(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; |