diff options
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cgraph.h | 3 | ||||
-rw-r--r-- | gcc/cgraphclones.c | 2 | ||||
-rw-r--r-- | gcc/cgraphunit.c | 10 | ||||
-rw-r--r-- | gcc/ipa-visibility.c | 2 |
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; |