summaryrefslogtreecommitdiff
path: root/gcc/explow.c
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-05 23:45:32 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-05 23:45:32 +0000
commit70c912cff7f00414cad5c3dee2ab969f7f4acf08 (patch)
tree9f086d2faa96f90607a0c59d97ffe86a12e067f3 /gcc/explow.c
parent250df4353fca5426f50209db9982a69966bfe239 (diff)
downloadgcc-70c912cff7f00414cad5c3dee2ab969f7f4acf08.tar.gz
gcc/:
PR target/46084 * explow.c (allocate_dynamic_stack_space): If flag_split_stack, request enough additional space for alignment, and force alignment. testsuite/: * gcc.target/i386/pr46084.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166383 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/explow.c')
-rw-r--r--gcc/explow.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/gcc/explow.c b/gcc/explow.c
index a83c6e87388..1d809bc8426 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -1340,7 +1340,7 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
least it doesn't cause a stack overflow. */
if (flag_split_stack)
{
- rtx available_label, space, func;
+ rtx available_label, ask, space, func;
available_label = NULL_RTX;
@@ -1355,10 +1355,19 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
}
#endif
+ /* The __morestack_allocate_stack_space function will allocate
+ memory using malloc. We don't know that the alignment of the
+ memory returned by malloc will meet REQUIRED_ALIGN. Increase
+ SIZE to make sure we allocate enough space. */
+ ask = expand_binop (Pmode, add_optab, size,
+ GEN_INT (required_align / BITS_PER_UNIT - 1),
+ NULL_RTX, 1, OPTAB_LIB_WIDEN);
+ must_align = true;
+
func = init_one_libfunc ("__morestack_allocate_stack_space");
space = emit_library_call_value (func, target, LCT_NORMAL, Pmode,
- 1, size, Pmode);
+ 1, ask, Pmode);
if (available_label == NULL_RTX)
return space;