New callgraph wrapper function creation added
authormarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Jun 2014 11:11:09 +0000 (11:11 +0000)
committermarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Jun 2014 11:11:09 +0000 (11:11 +0000)
* cgraph.h (cgraph_make_wrapper): New function introduced.
* cgraphunit.c (cgraph_make_wrapper): The function implementation.
* ipa-inline.h (inline_analyze_function): The function is global.
* ipa-inline-analysis.c (inline_analyze_function): Likewise.

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

gcc/ChangeLog
gcc/cgraph.h
gcc/cgraphunit.c
gcc/ipa-inline-analysis.c
gcc/ipa-inline.h

index de07e5c..e892d70 100644 (file)
@@ -1,5 +1,12 @@
 2014-06-04  Martin Liska  <mliska@suse.cz>
 
+       * cgraph.h (cgraph_make_wrapper): New function introduced.
+       * cgraphunit.c (cgraph_make_wrapper): The function implementation.
+       * ipa-inline.h (inline_analyze_function): The function is global.
+       * ipa-inline-analysis.c (inline_analyze_function): Likewise.
+
+2014-06-04  Martin Liska  <mliska@suse.cz>
+
        * tree.h (private_lookup_attribute_starting): New function.
        (lookup_attribute_starting): Likewise.
        * tree.c (private_lookup_attribute_starting): Likewise.
index 202c746..9c6f558 100644 (file)
@@ -912,6 +912,8 @@ void fixup_same_cpp_alias_visibility (symtab_node *, symtab_node *target, tree);
 basic_block init_lowered_empty_function (tree, bool);
 void cgraph_reset_node (struct cgraph_node *);
 bool expand_thunk (struct cgraph_node *, bool, bool);
+void cgraph_make_wrapper (struct cgraph_node *source,
+                         struct cgraph_node *target);
 
 /* In cgraphclones.c  */
 
index 55bf378..7b40583 100644 (file)
@@ -2344,5 +2344,41 @@ finalize_compilation_unit (void)
   timevar_pop (TV_CGRAPH);
 }
 
+/* Creates a wrapper from SOURCE node to TARGET node. Thunk is used for this
+   kind of wrapper method.  */
+
+void
+cgraph_make_wrapper (struct cgraph_node *source, struct cgraph_node *target)
+{
+    /* Preserve DECL_RESULT so we get right by reference flag.  */
+    tree decl_result = DECL_RESULT (source->decl);
+
+    /* Remove the function's body.  */
+    cgraph_release_function_body (source);
+    cgraph_reset_node (source);
+
+    DECL_RESULT (source->decl) = decl_result;
+    DECL_INITIAL (source->decl) = NULL;
+    allocate_struct_function (source->decl, false);
+    set_cfun (NULL);
+
+    /* Turn alias into thunk and expand it into GIMPLE representation.  */
+    source->definition = true;
+    source->thunk.thunk_p = true;
+    source->thunk.this_adjusting = false;
+
+    struct cgraph_edge *e = cgraph_create_edge (source, target, NULL, 0,
+                                               CGRAPH_FREQ_BASE);
+
+    if (!expand_thunk (source, false, true))
+      source->analyzed = true;
+
+    e->call_stmt_cannot_inline_p = true;
+
+    /* Inline summary set-up.  */
+
+    analyze_function (source);
+    inline_analyze_function (source);
+}
 
 #include "gt-cgraphunit.h"
index 2bb3759..c50a722 100644 (file)
@@ -3960,7 +3960,7 @@ inline_indirect_intraprocedural_analysis (struct cgraph_node *node)
 
 /* Note function body size.  */
 
-static void
+void
 inline_analyze_function (struct cgraph_node *node)
 {
   push_cfun (DECL_STRUCT_FUNCTION (node->decl));
index bddf29a..15e9d1c 100644 (file)
@@ -216,6 +216,7 @@ void inline_generate_summary (void);
 void inline_read_summary (void);
 void inline_write_summary (void);
 void inline_free_summary (void);
+void inline_analyze_function (struct cgraph_node *node);
 void initialize_inline_failed (struct cgraph_edge *);
 int estimate_time_after_inlining (struct cgraph_node *, struct cgraph_edge *);
 int estimate_size_after_inlining (struct cgraph_node *, struct cgraph_edge *);