+2014-10-07 Eric Botcazou <ebotcazou@adacore.com>
+
+ * cgraph.h (cgraph_node::get_fun): Declare.
+ * cgraph.c (cgraph_node::get_fun): New method.
+ * ipa-inline.c (can_inline_edge_p): Use it.
+
2014-10-07 Eric Botcazou <ebotcazou@adacore.com>
* lto-opts.c (lto_write_options): Handle -fmath-errno, -fsigned-zeros
return true;
}
+/* Return the DECL_STRUCT_FUNCTION of the function. */
+
+struct function *
+cgraph_node::get_fun (void)
+{
+ cgraph_node *node = this;
+ struct function *fun = DECL_STRUCT_FUNCTION (node->decl);
+
+ while (!fun && node->clone_of)
+ {
+ node = node->clone_of;
+ fun = DECL_STRUCT_FUNCTION (node->decl);
+ }
+
+ return fun;
+}
+
/* Verify if the type of the argument matches that of the function
declaration. If we cannot verify this or there is a mismatch,
return false. */
are free'd in final.c via free_after_compilation(). */
void release_body (bool keep_arguments = false);
+ /* Return the DECL_STRUCT_FUNCTION of the function. */
+ struct function *get_fun (void);
+
/* cgraph_node is no longer nested function; update cgraph accordingly. */
void unnest (void);
tree caller_tree = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (e->caller->decl);
tree callee_tree
= callee ? DECL_FUNCTION_SPECIFIC_OPTIMIZATION (callee->decl) : NULL;
- struct function *caller_cfun = DECL_STRUCT_FUNCTION (e->caller->decl);
- struct function *callee_cfun
- = callee ? DECL_STRUCT_FUNCTION (callee->decl) : NULL;
-
- if (!caller_cfun && e->caller->clone_of)
- caller_cfun = DECL_STRUCT_FUNCTION (e->caller->clone_of->decl);
-
- if (!callee_cfun && callee && callee->clone_of)
- callee_cfun = DECL_STRUCT_FUNCTION (callee->clone_of->decl);
+ struct function *caller_fun = e->caller->get_fun ();
+ struct function *callee_fun = callee ? callee->get_fun () : NULL;
gcc_assert (e->inline_failed);
inlinable = false;
}
else if (!inline_summary (callee)->inlinable
- || (caller_cfun && fn_contains_cilk_spawn_p (caller_cfun)))
+ || (caller_fun && fn_contains_cilk_spawn_p (caller_fun)))
{
e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
inlinable = false;
caller cannot.
FIXME: this is obviously wrong for LTO where STRUCT_FUNCTION is missing.
Move the flag into cgraph node or mirror it in the inline summary. */
- else if (callee_cfun && callee_cfun->can_throw_non_call_exceptions
- && !(caller_cfun && caller_cfun->can_throw_non_call_exceptions))
+ else if (callee_fun && callee_fun->can_throw_non_call_exceptions
+ && !(caller_fun && caller_fun->can_throw_non_call_exceptions))
{
e->inline_failed = CIF_NON_CALL_EXCEPTIONS;
inlinable = false;