aboutsummaryrefslogtreecommitdiff
path: root/gcc/calls.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2002-11-18 20:30:34 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2002-11-18 19:30:34 +0000
commitc986baf631d89169f339f1d23014e62614d2e93e (patch)
treeb27ad2e3073c9b341aab81f1ef722dd6924c452c /gcc/calls.c
parent5602b49d692730366a6e554b52fefa604459d136 (diff)
downloadgcc-c986baf631d89169f339f1d23014e62614d2e93e.zip
gcc-c986baf631d89169f339f1d23014e62614d2e93e.tar.gz
gcc-c986baf631d89169f339f1d23014e62614d2e93e.tar.bz2
calls.c (alloca_call_p): New global function.
* calls.c (alloca_call_p): New global function. * tree.h (alloca_call_p): New. * tree-inline.c (inlinable_function_p): Do not inline when function calls alloca. (find_alloca_call, find_alloca_call_1): New functions. From-SVN: r59228
Diffstat (limited to 'gcc/calls.c')
-rw-r--r--gcc/calls.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/calls.c b/gcc/calls.c
index f2f9c57..99722b5 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -801,6 +801,21 @@ setjmp_call_p (fndecl)
return special_function_p (fndecl, 0) & ECF_RETURNS_TWICE;
}
+/* Return true when exp contains alloca call. */
+bool
+alloca_call_p (exp)
+ tree exp;
+{
+ if (TREE_CODE (exp) == CALL_EXPR
+ && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
+ && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
+ == FUNCTION_DECL)
+ && (special_function_p (TREE_OPERAND (TREE_OPERAND (exp, 0), 0),
+ 0) & ECF_MAY_BE_ALLOCA))
+ return true;
+ return false;
+}
+
/* Detect flags (function attributes) from the function decl or type node. */
static int