aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2014-06-04 11:39:24 +0200
committerMartin Liska <marxin@gcc.gnu.org>2014-06-04 09:39:24 +0000
commitd211e4719264a66f3a310870d7459751c335ce7f (patch)
tree9145c7839e56bc45a6609950c9b5e844507d3d03 /gcc
parenta96bf0d3ceb411299cc5dedfc7705de9ac21988a (diff)
downloadgcc-d211e4719264a66f3a310870d7459751c335ce7f.zip
gcc-d211e4719264a66f3a310870d7459751c335ce7f.tar.gz
gcc-d211e4719264a66f3a310870d7459751c335ce7f.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/cgraph.h3
-rw-r--r--gcc/cgraphclones.c2
-rw-r--r--gcc/cgraphunit.c10
-rw-r--r--gcc/ipa-visibility.c2
5 files changed, 20 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 853a034..1f42a28 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,15 @@
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>
+
* coverage.h (coverage_compute_cfg_checksum): Argument added.
* coverage.c (coverage_compute_cfg_checksum): Likewise.
* profile.c (branch_prob): Likewise.
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index e5aa833..202c746 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -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. */
basic_block init_lowered_empty_function (tree, bool);
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 */
@@ -979,6 +979,7 @@ bool varpool_externally_visible_p (varpool_node *);
/* In ipa-visibility.c */
bool cgraph_local_node_p (struct cgraph_node *);
+bool address_taken_from_non_vtable_p (symtab_node *node);
/* In predict.c */
diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c
index 4387b99..75eba6d 100644
--- a/gcc/cgraphclones.c
+++ b/gcc/cgraphclones.c
@@ -353,7 +353,7 @@ duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node,
CGRAPH_FREQ_BASE);
e->call_stmt_cannot_inline_p = true;
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;
cgraph_call_node_duplication_hooks (thunk, new_thunk);
return new_thunk;
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index e19b0a2..55bf378 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -610,7 +610,7 @@ analyze_function (struct cgraph_node *node)
{
cgraph_create_edge (node, cgraph_get_node (node->thunk.alias),
NULL, 0, CGRAPH_FREQ_BASE);
- if (!expand_thunk (node, false))
+ if (!expand_thunk (node, false, false))
{
node->thunk.alias = NULL;
node->analyzed = true;
@@ -1466,11 +1466,13 @@ thunk_adjust (gimple_stmt_iterator * bsi,
}
/* 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
thunks that are not lowered. */
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;
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;
- if (this_adjusting
+ if (!force_gimple_thunk && this_adjusting
&& targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
virtual_value, alias))
{
@@ -1719,7 +1721,7 @@ assemble_thunks_and_aliases (struct cgraph_node *node)
e = e->next_caller;
assemble_thunks_and_aliases (thunk);
- expand_thunk (thunk, true);
+ expand_thunk (thunk, true, false);
}
else
e = e->next_caller;
diff --git a/gcc/ipa-visibility.c b/gcc/ipa-visibility.c
index dc22b2e..7886722 100644
--- a/gcc/ipa-visibility.c
+++ b/gcc/ipa-visibility.c
@@ -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. */
-static bool
+bool
address_taken_from_non_vtable_p (symtab_node *node)
{
int i;