From cb8994e9e2886f6c541f94030edef89fe0a3a7c9 Mon Sep 17 00:00:00 2001 From: marxin Date: Wed, 4 Jun 2014 11:11:09 +0000 Subject: [PATCH] New callgraph wrapper function creation added * 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 | 7 +++++++ gcc/cgraph.h | 2 ++ gcc/cgraphunit.c | 36 ++++++++++++++++++++++++++++++++++++ gcc/ipa-inline-analysis.c | 2 +- gcc/ipa-inline.h | 1 + 5 files changed, 47 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index de07e5c..e892d70 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2014-06-04 Martin Liska + * 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 + * tree.h (private_lookup_attribute_starting): New function. (lookup_attribute_starting): Likewise. * tree.c (private_lookup_attribute_starting): Likewise. diff --git a/gcc/cgraph.h b/gcc/cgraph.h index 202c746..9c6f558 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -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 */ diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 55bf378..7b40583 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -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" diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index 2bb3759..c50a722 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -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)); diff --git a/gcc/ipa-inline.h b/gcc/ipa-inline.h index bddf29a..15e9d1c 100644 --- a/gcc/ipa-inline.h +++ b/gcc/ipa-inline.h @@ -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 *); -- 2.7.4