Commit 31de7606 by Jan Hubicka Committed by Jan Hubicka

ipa-chkp.c: Use iterate_direct_aliases.


	* ipa-chkp.c: Use iterate_direct_aliases.
	* symtab.c (resolution_used_from_other_file_p): Move inline.
	(symtab_node::create_reference): Fix formating.
	(symtab_node::has_aliases_p): Move inline; use iterate_direct_aliases.
	(symtab_node::iterate_reference): Move inline.
	(symtab_node::iterate_referring): Move inline.
	(symtab_node::iterate_direct_aliases): Move inline.
	(symtab_node::used_from_object_file_p_worker): Inline into ...
	(symtab_node::used_from_object_file_p): ... this one; move inline.
	(symtab_node::call_for_symbol_and_aliases): Move inline;
	use iterate_direct_aliases.
	(symtab_node::call_for_symbol_and_aliases_1): New method.
	(cgraph_node::call_for_symbol_and_aliases): Move inline;
	use iterate_direct_aliases.
	(cgraph_node::call_for_symbol_and_aliases_1): New method.
	(varpool_node::call_for_node_and_aliases): Rename to ...
	(varpool_node::call_for_symbol_and_aliases): ... this one; Move inline;
	use iterate_direct_aliases.
	(varpool_node::call_for_symbol_and_aliases_1): New method.
	* ipa.c (ipa_single_use): Use iterate_direct_aliases.
	(ipa_discover_readonly_nonaddressable_var): Update.
	* ipa-devirt.c: Fix formating.
	* cgraph.c (cgraph_node::can_remove_if_no_direct_calls_and_refs_p):
	Move inline.
	(cgraph_node::call_for_symbol_and_aliases): Move inline.
	(cgraph_node::call_for_symbol_and_aliases_1): New function..
	* cgraph.h (used_from_object_file_p_worker): Remove.
	(resolution_used_from_other_file_p): Move inline.
	(symtab_node::has_aliases_p): Move inline; use iterate_direct_aliases.
	(symtab_node::iterate_reference): Move inline.
	(symtab_node::iterate_referring): Move inline.
	(symtab_node::iterate_direct_aliases): Move inline.
	(symtab_node::used_from_object_file_p_worker): Inline into ...
	(symtab_node::used_from_object_file_p): Move inline.
	* tree-emutls.c (ipa_lower_emutls): Update.
	* varpool.c (varpool_node::call_for_symbol_and_aliases_1): New method.
	(varpool_node::call_for_node_and_aliases): Remove.

From-SVN: r220709
parent 065d214c
2015-02-14 Jan Hubicka <hubicka@ucw.cz>
* ipa-chkp.c: Use iterate_direct_aliases.
* symtab.c (resolution_used_from_other_file_p): Move inline.
(symtab_node::create_reference): Fix formating.
(symtab_node::has_aliases_p): Move inline; use iterate_direct_aliases.
(symtab_node::iterate_reference): Move inline.
(symtab_node::iterate_referring): Move inline.
(symtab_node::iterate_direct_aliases): Move inline.
(symtab_node::used_from_object_file_p_worker): Inline into ...
(symtab_node::used_from_object_file_p): ... this one; move inline.
(symtab_node::call_for_symbol_and_aliases): Move inline;
use iterate_direct_aliases.
(symtab_node::call_for_symbol_and_aliases_1): New method.
(cgraph_node::call_for_symbol_and_aliases): Move inline;
use iterate_direct_aliases.
(cgraph_node::call_for_symbol_and_aliases_1): New method.
(varpool_node::call_for_node_and_aliases): Rename to ...
(varpool_node::call_for_symbol_and_aliases): ... this one; Move inline;
use iterate_direct_aliases.
(varpool_node::call_for_symbol_and_aliases_1): New method.
* ipa.c (ipa_single_use): Use iterate_direct_aliases.
(ipa_discover_readonly_nonaddressable_var): Update.
* ipa-devirt.c: Fix formating.
* cgraph.c (cgraph_node::can_remove_if_no_direct_calls_and_refs_p):
Move inline.
(cgraph_node::call_for_symbol_and_aliases): Move inline.
(cgraph_node::call_for_symbol_and_aliases_1): New function..
* cgraph.h (used_from_object_file_p_worker): Remove.
(resolution_used_from_other_file_p): Move inline.
(symtab_node::has_aliases_p): Move inline; use iterate_direct_aliases.
(symtab_node::iterate_reference): Move inline.
(symtab_node::iterate_referring): Move inline.
(symtab_node::iterate_direct_aliases): Move inline.
(symtab_node::used_from_object_file_p_worker): Inline into ...
(symtab_node::used_from_object_file_p): Move inline.
* tree-emutls.c (ipa_lower_emutls): Update.
* varpool.c (varpool_node::call_for_symbol_and_aliases_1): New method.
(varpool_node::call_for_node_and_aliases): Remove.
2015-02-14 Jakub Jelinek <jakub@redhat.com> 2015-02-14 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/62209 PR tree-optimization/62209
......
...@@ -2215,33 +2215,6 @@ cgraph_node::call_for_symbol_thunks_and_aliases (bool (*callback) ...@@ -2215,33 +2215,6 @@ cgraph_node::call_for_symbol_thunks_and_aliases (bool (*callback)
return false; return false;
} }
/* Call callback on function and aliases associated to the function.
When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
skipped. */
bool
cgraph_node::call_for_symbol_and_aliases (bool (*callback) (cgraph_node *,
void *),
void *data,
bool include_overwritable)
{
ipa_ref *ref;
if (callback (this, data))
return true;
FOR_EACH_ALIAS (this, ref)
{
cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
if (include_overwritable
|| alias->get_availability () > AVAIL_INTERPOSABLE)
if (alias->call_for_symbol_and_aliases (callback, data,
include_overwritable))
return true;
}
return false;
}
/* Worker to bring NODE local. */ /* Worker to bring NODE local. */
bool bool
...@@ -2430,37 +2403,6 @@ cgraph_edge::maybe_hot_p (void) ...@@ -2430,37 +2403,6 @@ cgraph_edge::maybe_hot_p (void)
return true; return true;
} }
/* Return true when function can be removed from callgraph
if all direct calls are eliminated. */
bool
cgraph_node::can_remove_if_no_direct_calls_and_refs_p (void)
{
gcc_assert (!global.inlined_to);
/* Instrumentation clones should not be removed before
instrumentation happens. New callers may appear after
instrumentation. */
if (instrumentation_clone
&& !chkp_function_instrumented_p (decl))
return false;
/* Extern inlines can always go, we will use the external definition. */
if (DECL_EXTERNAL (decl))
return true;
/* When function is needed, we can not remove it. */
if (force_output || used_from_other_partition)
return false;
if (DECL_STATIC_CONSTRUCTOR (decl)
|| DECL_STATIC_DESTRUCTOR (decl))
return false;
/* Only COMDAT functions can be removed if externally visible. */
if (externally_visible
&& (!DECL_COMDAT (decl)
|| forced_by_abi
|| used_from_object_file_p ()))
return false;
return true;
}
/* Worker for cgraph_can_remove_if_no_direct_calls_p. */ /* Worker for cgraph_can_remove_if_no_direct_calls_p. */
static bool static bool
...@@ -3363,4 +3305,24 @@ cgraph_c_finalize (void) ...@@ -3363,4 +3305,24 @@ cgraph_c_finalize (void)
version_info_node = NULL; version_info_node = NULL;
} }
/* A wroker for call_for_symbol_and_aliases. */
bool
cgraph_node::call_for_symbol_and_aliases_1 (bool (*callback) (cgraph_node *,
void *),
void *data,
bool include_overwritable)
{
ipa_ref *ref;
FOR_EACH_ALIAS (this, ref)
{
cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
if (include_overwritable
|| alias->get_availability () > AVAIL_INTERPOSABLE)
if (alias->call_for_symbol_and_aliases (callback, data,
include_overwritable))
return true;
}
return false;
}
#include "gt-cgraph.h" #include "gt-cgraph.h"
...@@ -534,8 +534,7 @@ chkp_maybe_create_clone (tree fndecl) ...@@ -534,8 +534,7 @@ chkp_maybe_create_clone (tree fndecl)
symtab->call_cgraph_insertion_hooks (clone); symtab->call_cgraph_insertion_hooks (clone);
/* Clone all aliases. */ /* Clone all aliases. */
for (i = 0; node->iterate_referring (i, ref); i++) for (i = 0; node->iterate_direct_aliases (i, ref); i++)
if (ref->use == IPA_REF_ALIAS)
{ {
struct cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring); struct cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
struct cgraph_node *chkp_alias struct cgraph_node *chkp_alias
......
...@@ -1710,7 +1710,6 @@ referenced_from_vtable_p (struct cgraph_node *node) ...@@ -1710,7 +1710,6 @@ referenced_from_vtable_p (struct cgraph_node *node)
return true; return true;
for (i = 0; node->iterate_referring (i, ref); i++) for (i = 0; node->iterate_referring (i, ref); i++)
if ((ref->use == IPA_REF_ALIAS if ((ref->use == IPA_REF_ALIAS
&& referenced_from_vtable_p (dyn_cast<cgraph_node *> (ref->referring))) && referenced_from_vtable_p (dyn_cast<cgraph_node *> (ref->referring)))
|| (ref->use == IPA_REF_ADDR || (ref->use == IPA_REF_ADDR
......
...@@ -808,7 +808,7 @@ ipa_discover_readonly_nonaddressable_vars (void) ...@@ -808,7 +808,7 @@ ipa_discover_readonly_nonaddressable_vars (void)
{ {
if (TREE_ADDRESSABLE (vnode->decl) && dump_file) if (TREE_ADDRESSABLE (vnode->decl) && dump_file)
fprintf (dump_file, " %s (non-addressable)", vnode->name ()); fprintf (dump_file, " %s (non-addressable)", vnode->name ());
vnode->call_for_node_and_aliases (clear_addressable_bit, NULL, vnode->call_for_symbol_and_aliases (clear_addressable_bit, NULL,
true); true);
} }
if (!address_taken && !written if (!address_taken && !written
...@@ -819,13 +819,13 @@ ipa_discover_readonly_nonaddressable_vars (void) ...@@ -819,13 +819,13 @@ ipa_discover_readonly_nonaddressable_vars (void)
{ {
if (!TREE_READONLY (vnode->decl) && dump_file) if (!TREE_READONLY (vnode->decl) && dump_file)
fprintf (dump_file, " %s (read-only)", vnode->name ()); fprintf (dump_file, " %s (read-only)", vnode->name ());
vnode->call_for_node_and_aliases (set_readonly_bit, NULL, true); vnode->call_for_symbol_and_aliases (set_readonly_bit, NULL, true);
} }
if (!vnode->writeonly && !read && !address_taken && written) if (!vnode->writeonly && !read && !address_taken && written)
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, " %s (write-only)", vnode->name ()); fprintf (dump_file, " %s (write-only)", vnode->name ());
vnode->call_for_node_and_aliases (set_writeonly_bit, &remove_p, vnode->call_for_symbol_and_aliases (set_writeonly_bit, &remove_p,
true); true);
} }
} }
...@@ -1343,9 +1343,8 @@ ipa_single_use (void) ...@@ -1343,9 +1343,8 @@ ipa_single_use (void)
single_user_map.put (var, user); single_user_map.put (var, user);
/* Enqueue all aliases for re-processing. */ /* Enqueue all aliases for re-processing. */
for (i = 0; var->iterate_referring (i, ref); i++) for (i = 0; var->iterate_direct_aliases (i, ref); i++)
if (ref->use == IPA_REF_ALIAS if (!ref->referring->aux)
&& !ref->referring->aux)
{ {
ref->referring->aux = first; ref->referring->aux = first;
first = dyn_cast <varpool_node *> (ref->referring); first = dyn_cast <varpool_node *> (ref->referring);
......
...@@ -313,18 +313,6 @@ symbol_table::change_decl_assembler_name (tree decl, tree name) ...@@ -313,18 +313,6 @@ symbol_table::change_decl_assembler_name (tree decl, tree name)
} }
} }
/* Return true when RESOLUTION indicate that linker will use
the symbol from non-LTO object files. */
bool
resolution_used_from_other_file_p (enum ld_plugin_symbol_resolution resolution)
{
return (resolution == LDPR_PREVAILING_DEF
|| resolution == LDPR_PREEMPTED_REG
|| resolution == LDPR_RESOLVED_EXEC
|| resolution == LDPR_RESOLVED_DYN);
}
/* Hash sections by their names. */ /* Hash sections by their names. */
hashval_t hashval_t
...@@ -743,52 +731,6 @@ symtab_node::dump_referring (FILE *file) ...@@ -743,52 +731,6 @@ symtab_node::dump_referring (FILE *file)
fprintf (file, "\n"); fprintf (file, "\n");
} }
/* Return true if list contains an alias. */
bool
symtab_node::has_aliases_p (void)
{
ipa_ref *ref = NULL;
int i;
for (i = 0; iterate_referring (i, ref); i++)
if (ref->use == IPA_REF_ALIAS)
return true;
return false;
}
/* Iterates I-th reference in the list, REF is also set. */
ipa_ref *
symtab_node::iterate_reference (unsigned i, ipa_ref *&ref)
{
vec_safe_iterate (ref_list.references, i, &ref);
return ref;
}
/* Iterates I-th referring item in the list, REF is also set. */
ipa_ref *
symtab_node::iterate_referring (unsigned i, ipa_ref *&ref)
{
ref_list.referring.iterate (i, &ref);
return ref;
}
/* Iterates I-th referring alias item in the list, REF is also set. */
ipa_ref *
symtab_node::iterate_direct_aliases (unsigned i, ipa_ref *&ref)
{
ref_list.referring.iterate (i, &ref);
if (ref && ref->use != IPA_REF_ALIAS)
return NULL;
return ref;
}
static const char * const symtab_type_names[] = {"symbol", "function", "variable"}; static const char * const symtab_type_names[] = {"symbol", "function", "variable"};
/* Dump base fields of symtab nodes to F. Not to be used directly. */ /* Dump base fields of symtab nodes to F. Not to be used directly. */
...@@ -1196,29 +1138,6 @@ symtab_node::verify_symtab_nodes (void) ...@@ -1196,29 +1138,6 @@ symtab_node::verify_symtab_nodes (void)
} }
} }
/* Return true when NODE is known to be used from other (non-LTO)
object file. Known only when doing LTO via linker plugin. */
bool
symtab_node::used_from_object_file_p_worker (symtab_node *node)
{
if (!TREE_PUBLIC (node->decl) || DECL_EXTERNAL (node->decl))
return false;
if (resolution_used_from_other_file_p (node->resolution))
return true;
return false;
}
/* Return true when symtab_node is known to be used from other (non-LTO)
object file. Known only when doing LTO via linker plugin. */
bool
symtab_node::used_from_object_file_p (void)
{
return symtab_node::used_from_object_file_p_worker (this);
}
/* Make DECL local. FIXME: We shouldn't need to mess with rtl this early, /* Make DECL local. FIXME: We shouldn't need to mess with rtl this early,
but other code such as notice_global_symbol generates rtl. */ but other code such as notice_global_symbol generates rtl. */
...@@ -1260,20 +1179,13 @@ symtab_node::make_decl_local (void) ...@@ -1260,20 +1179,13 @@ symtab_node::make_decl_local (void)
/* Walk the alias chain to return the symbol NODE is alias of. /* Walk the alias chain to return the symbol NODE is alias of.
If NODE is not an alias, return NODE. If NODE is not an alias, return NODE.
When AVAILABILITY is non-NULL, get minimal availability in the chain. */ Assumes NODE is known to be alias. */
symtab_node * symtab_node *
symtab_node::ultimate_alias_target (enum availability *availability) symtab_node::ultimate_alias_target_1 (enum availability *availability)
{ {
bool weakref_p = false; bool weakref_p = false;
if (!alias)
{
if (availability)
*availability = get_availability ();
return this;
}
/* To determine visibility of the target, we follow ELF semantic of aliases. /* To determine visibility of the target, we follow ELF semantic of aliases.
Here alias is an alternative assembler name of a given definition. Its Here alias is an alternative assembler name of a given definition. Its
availability prevails the availability of its target (i.e. static alias of availability prevails the availability of its target (i.e. static alias of
...@@ -1453,16 +1365,6 @@ symtab_node::get_init_priority () ...@@ -1453,16 +1365,6 @@ symtab_node::get_init_priority ()
return h ? h->init : DEFAULT_INIT_PRIORITY; return h ? h->init : DEFAULT_INIT_PRIORITY;
} }
/* Return availability of NODE. */
enum availability symtab_node::get_availability (void)
{
if (is_a <cgraph_node *> (this))
return dyn_cast <cgraph_node *> (this)->get_availability ();
else
return dyn_cast <varpool_node *> (this)->get_availability ();;
}
/* Return the finalization priority. */ /* Return the finalization priority. */
priority_type priority_type
...@@ -1608,33 +1510,6 @@ symtab_node::resolve_alias (symtab_node *target) ...@@ -1608,33 +1510,6 @@ symtab_node::resolve_alias (symtab_node *target)
return true; return true;
} }
/* Call calback on symtab node and aliases associated to this node.
When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
skipped. */
bool
symtab_node::call_for_symbol_and_aliases (bool (*callback) (symtab_node *,
void *),
void *data, bool include_overwritable)
{
int i;
ipa_ref *ref;
if (callback (this, data))
return true;
for (i = 0; iterate_referring (i, ref); i++)
if (ref->use == IPA_REF_ALIAS)
{
symtab_node *alias = ref->referring;
if (include_overwritable
|| alias->get_availability () > AVAIL_INTERPOSABLE)
if (alias->call_for_symbol_and_aliases (callback, data,
include_overwritable))
return true;
}
return false;
}
/* Worker searching noninterposable alias. */ /* Worker searching noninterposable alias. */
bool bool
...@@ -1961,3 +1836,24 @@ symtab_node::equal_address_to (symtab_node *s2) ...@@ -1961,3 +1836,24 @@ symtab_node::equal_address_to (symtab_node *s2)
return 2; return 2;
} }
/* Worker for call_for_symbol_and_aliases. */
bool
symtab_node::call_for_symbol_and_aliases_1 (bool (*callback) (symtab_node *,
void *),
void *data,
bool include_overwritable)
{
ipa_ref *ref;
FOR_EACH_ALIAS (this, ref)
{
symtab_node *alias = ref->referring;
if (include_overwritable
|| alias->get_availability () > AVAIL_INTERPOSABLE)
if (alias->call_for_symbol_and_aliases (callback, data,
include_overwritable))
return true;
}
return false;
}
...@@ -787,7 +787,7 @@ ipa_lower_emutls (void) ...@@ -787,7 +787,7 @@ ipa_lower_emutls (void)
if (var->alias && !var->analyzed) if (var->alias && !var->analyzed)
any_aliases = true; any_aliases = true;
else if (!var->alias) else if (!var->alias)
var->call_for_node_and_aliases (create_emultls_var, &ctor_body, true); var->call_for_symbol_and_aliases (create_emultls_var, &ctor_body, true);
} }
/* If there were any aliases, then frob the alias_pairs vector. */ /* If there were any aliases, then frob the alias_pairs vector. */
......
...@@ -817,27 +817,22 @@ varpool_node::create_extra_name_alias (tree alias, tree decl) ...@@ -817,27 +817,22 @@ varpool_node::create_extra_name_alias (tree alias, tree decl)
return alias_node; return alias_node;
} }
/* Call calback on varpool symbol and aliases associated to varpool symbol. /* Worker for call_for_symbol_and_aliases. */
When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
skipped. */
bool bool
varpool_node::call_for_node_and_aliases (bool (*callback) (varpool_node *, varpool_node::call_for_symbol_and_aliases_1 (bool (*callback) (varpool_node *,
void *), void *),
void *data, void *data,
bool include_overwritable) bool include_overwritable)
{ {
ipa_ref *ref; ipa_ref *ref;
if (callback (this, data))
return true;
FOR_EACH_ALIAS (this, ref) FOR_EACH_ALIAS (this, ref)
{ {
varpool_node *alias = dyn_cast <varpool_node *> (ref->referring); varpool_node *alias = dyn_cast <varpool_node *> (ref->referring);
if (include_overwritable if (include_overwritable
|| alias->get_availability () > AVAIL_INTERPOSABLE) || alias->get_availability () > AVAIL_INTERPOSABLE)
if (alias->call_for_node_and_aliases (callback, data, if (alias->call_for_symbol_and_aliases (callback, data,
include_overwritable)) include_overwritable))
return true; return true;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment