aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2014-10-07 09:18:37 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2014-10-07 09:18:37 +0000
commit8ccda8bce69d8e511e38689fb75b7f5a404e00c3 (patch)
tree72fe163acf91a73fc92b843156c63ac32b67292f
parent2f77200b3f168ebf0b07acd63d68096d8840fc1d (diff)
downloadgcc-8ccda8bce69d8e511e38689fb75b7f5a404e00c3.zip
gcc-8ccda8bce69d8e511e38689fb75b7f5a404e00c3.tar.gz
gcc-8ccda8bce69d8e511e38689fb75b7f5a404e00c3.tar.bz2
cgraph.h (cgraph_node::get_fun): Declare.
* cgraph.h (cgraph_node::get_fun): Declare. * cgraph.c (cgraph_node::get_fun): New method. * ipa-inline.c (can_inline_edge_p): Use it. From-SVN: r215968
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cgraph.c17
-rw-r--r--gcc/cgraph.h3
-rw-r--r--gcc/ipa-inline.c17
4 files changed, 31 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9349546..f1f16ee 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
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
and -ftrapping-math.
* lto-wrapper.c (merge_and_complain): Likewise.
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 38dc7e6..f842b1b 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -2992,6 +2992,23 @@ cgraph_node::get_body (void)
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. */
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index 20b5c4e..1df7534 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -919,6 +919,9 @@ public:
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);
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index d7a232c..9ac1929 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -273,15 +273,8 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
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);
@@ -296,7 +289,7 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
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;
@@ -333,8 +326,8 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
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;