Enhancement of call graph API
authormarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Jun 2014 09:39:24 +0000 (09:39 +0000)
committermarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Jun 2014 09:39:24 +0000 (09:39 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211218 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cgraph.h
gcc/cgraphclones.c
gcc/cgraphunit.c
gcc/ipa-visibility.c

index 853a034..1f42a28 100644 (file)
@@ -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.
index e5aa833..202c746 100644 (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.  */
 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  */
index 4387b99..75eba6d 100644 (file)
@@ -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;
index e19b0a2..55bf378 100644 (file)
@@ -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;
index dc22b2e..7886722 100644 (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.  */
-static bool
+bool
 address_taken_from_non_vtable_p (symtab_node *node)
 {
   int i;