Enhancement of call graph API

* cgraph.h (expand_thunk): New argument added.
	(address_taken_from_non_vtable_p): New global function.
	* ipa-visibility.c (address_taken_from_non_vtable_p): Likewise.
	* cgraphclones.c (duplicate_thunk_for_node): Argument added to call.
	* cgraphunit.c (analyze_function): Likewise.
	(assemble_thunks_and_aliases): Argument added to call.
	(expand_thunk): New argument forces to produce GIMPLE thunk.

From-SVN: r211218
This commit is contained in:
Martin Liska 2014-06-04 11:39:24 +02:00 committed by Martin Liska
parent a96bf0d3ce
commit d211e47192
5 changed files with 20 additions and 7 deletions

View File

@ -1,3 +1,13 @@
2014-06-04 Martin Liska <mliska@suse.cz>
* cgraph.h (expand_thunk): New argument added.
(address_taken_from_non_vtable_p): New global function.
* ipa-visibility.c (address_taken_from_non_vtable_p): Likewise.
* cgraphclones.c (duplicate_thunk_for_node): Argument added to call.
* cgraphunit.c (analyze_function): Likewise.
(assemble_thunks_and_aliases): Argument added to call.
(expand_thunk): New argument forces to produce GIMPLE thunk.
2014-06-04 Martin Liska <mliska@suse.cz> 2014-06-04 Martin Liska <mliska@suse.cz>
* coverage.h (coverage_compute_cfg_checksum): Argument added. * coverage.h (coverage_compute_cfg_checksum): Argument added.

View File

@ -911,7 +911,7 @@ void fixup_same_cpp_alias_visibility (symtab_node *, symtab_node *target, tree);
IN_SSA is true if the gimple is in SSA. */ IN_SSA is true if the gimple is in SSA. */
basic_block init_lowered_empty_function (tree, bool); basic_block init_lowered_empty_function (tree, bool);
void cgraph_reset_node (struct cgraph_node *); void cgraph_reset_node (struct cgraph_node *);
bool expand_thunk (struct cgraph_node *, bool); bool expand_thunk (struct cgraph_node *, bool, bool);
/* In cgraphclones.c */ /* In cgraphclones.c */
@ -979,6 +979,7 @@ bool varpool_externally_visible_p (varpool_node *);
/* In ipa-visibility.c */ /* In ipa-visibility.c */
bool cgraph_local_node_p (struct cgraph_node *); bool cgraph_local_node_p (struct cgraph_node *);
bool address_taken_from_non_vtable_p (symtab_node *node);
/* In predict.c */ /* In predict.c */

View File

@ -353,7 +353,7 @@ duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node,
CGRAPH_FREQ_BASE); CGRAPH_FREQ_BASE);
e->call_stmt_cannot_inline_p = true; e->call_stmt_cannot_inline_p = true;
cgraph_call_edge_duplication_hooks (thunk->callees, e); cgraph_call_edge_duplication_hooks (thunk->callees, e);
if (!expand_thunk (new_thunk, false)) if (!expand_thunk (new_thunk, false, false))
new_thunk->analyzed = true; new_thunk->analyzed = true;
cgraph_call_node_duplication_hooks (thunk, new_thunk); cgraph_call_node_duplication_hooks (thunk, new_thunk);
return new_thunk; return new_thunk;

View File

@ -610,7 +610,7 @@ analyze_function (struct cgraph_node *node)
{ {
cgraph_create_edge (node, cgraph_get_node (node->thunk.alias), cgraph_create_edge (node, cgraph_get_node (node->thunk.alias),
NULL, 0, CGRAPH_FREQ_BASE); NULL, 0, CGRAPH_FREQ_BASE);
if (!expand_thunk (node, false)) if (!expand_thunk (node, false, false))
{ {
node->thunk.alias = NULL; node->thunk.alias = NULL;
node->analyzed = true; node->analyzed = true;
@ -1466,11 +1466,13 @@ thunk_adjust (gimple_stmt_iterator * bsi,
} }
/* Expand thunk NODE to gimple if possible. /* Expand thunk NODE to gimple if possible.
When FORCE_GIMPLE_THUNK is true, gimple thunk is created and
no assembler is produced.
When OUTPUT_ASM_THUNK is true, also produce assembler for When OUTPUT_ASM_THUNK is true, also produce assembler for
thunks that are not lowered. */ thunks that are not lowered. */
bool bool
expand_thunk (struct cgraph_node *node, bool output_asm_thunks) expand_thunk (struct cgraph_node *node, bool output_asm_thunks, bool force_gimple_thunk)
{ {
bool this_adjusting = node->thunk.this_adjusting; bool this_adjusting = node->thunk.this_adjusting;
HOST_WIDE_INT fixed_offset = node->thunk.fixed_offset; HOST_WIDE_INT fixed_offset = node->thunk.fixed_offset;
@ -1481,7 +1483,7 @@ expand_thunk (struct cgraph_node *node, bool output_asm_thunks)
tree a; tree a;
if (this_adjusting if (!force_gimple_thunk && this_adjusting
&& targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset, && targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
virtual_value, alias)) virtual_value, alias))
{ {
@ -1719,7 +1721,7 @@ assemble_thunks_and_aliases (struct cgraph_node *node)
e = e->next_caller; e = e->next_caller;
assemble_thunks_and_aliases (thunk); assemble_thunks_and_aliases (thunk);
expand_thunk (thunk, true); expand_thunk (thunk, true, false);
} }
else else
e = e->next_caller; e = e->next_caller;

View File

@ -115,7 +115,7 @@ cgraph_local_node_p (struct cgraph_node *node)
} }
/* Return true when there is a reference to node and it is not vtable. */ /* Return true when there is a reference to node and it is not vtable. */
static bool bool
address_taken_from_non_vtable_p (symtab_node *node) address_taken_from_non_vtable_p (symtab_node *node)
{ {
int i; int i;