From 6779c87f32214b62ed54f3e054c83aa0683fb29e Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Thu, 10 Apr 2008 22:24:11 +0000 Subject: [PATCH] disable inline of functions which call alloca(), causes stack overrun in 176.gcc [r19226] --- ir/opt/opt_inline.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ir/opt/opt_inline.c b/ir/opt/opt_inline.c index 009545ca5..9f8845575 100644 --- a/ir/opt/opt_inline.c +++ b/ir/opt/opt_inline.c @@ -753,6 +753,22 @@ static void find_addr(ir_node *node, void *env) { is_Start(get_Proj_pred(node)) && get_Proj_proj(node) == pn_Start_P_value_arg_base) { *allow_inline = 0; + } else if (is_Alloc(node) && get_Alloc_where(node) == stack_alloc) { + /* From GCC: + * Refuse to inline alloca call unless user explicitly forced so as this + * may change program's memory overhead drastically when the function + * using alloca is called in loop. In GCC present in SPEC2000 inlining + * into schedule_block cause it to require 2GB of ram instead of 256MB. + * + * Sorryly this is true with our implementation also. + * Moreover, we cannot differentiate between alloca() and VLA yet, so this + * disables inlining of functions using VLA (with are completely save). + * + * 2 Solutions: + * - add a flag to the Alloc node for "real" alloca() calls + * - add a new Stack-Restore node at the end of a function using alloca() + */ + *allow_inline = 0; } } -- 2.20.1