diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-11-05 23:45:32 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-11-05 23:45:32 +0000 |
commit | 70c912cff7f00414cad5c3dee2ab969f7f4acf08 (patch) | |
tree | 9f086d2faa96f90607a0c59d97ffe86a12e067f3 /gcc/explow.c | |
parent | 250df4353fca5426f50209db9982a69966bfe239 (diff) | |
download | gcc-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.c | 13 |
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; |