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.
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 */
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"
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 *);