summaryrefslogtreecommitdiff
path: root/gcc/ipa-comdats.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2015-03-22 22:10:24 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2015-03-22 21:10:24 +0000
commitdcbde1f881e5e15f9e3e2efde0680734a74d327e (patch)
treefb2d3bfeee17bb863c1cb4a35e4b1dbea1e364e2 /gcc/ipa-comdats.c
parenta6bfa7c773c7e5ec130de14d426b5eabddc26205 (diff)
re PR ipa/65502 (pure-const should play well with clobbers.)
PR ipa/65502 * ipa-comdats.c (enqueue_references): Walk through thunks. (ipa_comdats): Likewise. (set_comdat_group_1): New function. From-SVN: r221574
Diffstat (limited to 'gcc/ipa-comdats.c')
-rw-r--r--gcc/ipa-comdats.c44
1 files changed, 36 insertions, 8 deletions
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;