re PR target/46084 (gcc.dg/split-4.c failed with -mavx -m32)
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. From-SVN: r166383
This commit is contained in:
parent
037de943dc
commit
c3928dde21
4 changed files with 92 additions and 2 deletions
|
@ -1,3 +1,10 @@
|
|||
2010-11-05 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
PR target/46084
|
||||
* explow.c (allocate_dynamic_stack_space): If flag_split_stack,
|
||||
request enough additional space for alignment, and force
|
||||
alignment.
|
||||
|
||||
2010-11-05 Kai Tietz <kai.tietz@onevision.com>
|
||||
|
||||
* config/i386/i386.c (legitimate_pic_address_disp_p):
|
||||
|
|
13
gcc/explow.c
13
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;
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-11-05 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
PR target/46084
|
||||
* gcc.target/i386/pr46084.c: New test.
|
||||
|
||||
2010-11-05 Steve Ellcey <sje@cup.hp.com>
|
||||
|
||||
* lib/target-supports.exp (check_function_available): Use -fno-builtin.
|
||||
|
|
69
gcc/testsuite/gcc.target/i386/pr46084.c
Normal file
69
gcc/testsuite/gcc.target/i386/pr46084.c
Normal file
|
@ -0,0 +1,69 @@
|
|||
/* This test needs to use setrlimit to set the stack size, so it can
|
||||
only run on Unix. */
|
||||
/* { dg-do run { target *-*-linux* *-*-solaris* *-*-darwin* } } */
|
||||
/* { dg-require-effective-target avx } */
|
||||
/* { dg-require-effective-target split_stack } */
|
||||
/* { dg-options "-fsplit-stack -O2 -mavx" } */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/resource.h>
|
||||
|
||||
/* Use a noinline function to ensure that the buffer is not removed
|
||||
from the stack. */
|
||||
static void use_buffer (char *buf, size_t) __attribute__ ((noinline));
|
||||
static void
|
||||
use_buffer (char *buf, size_t c)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < c; ++i)
|
||||
buf[i] = (char) i;
|
||||
}
|
||||
|
||||
/* Each recursive call uses 10 * i bytes. We call it 1000 times,
|
||||
using a total of 5,000,000 bytes. If -fsplit-stack is not working,
|
||||
that will overflow our stack limit. */
|
||||
|
||||
static void
|
||||
down1 (int i)
|
||||
{
|
||||
char buf[10 * i];
|
||||
|
||||
if (i > 0)
|
||||
{
|
||||
use_buffer (buf, 10 * i);
|
||||
down1 (i - 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Same thing, using alloca. */
|
||||
|
||||
static void
|
||||
down2 (int i)
|
||||
{
|
||||
char *buf = alloca (10 * i);
|
||||
|
||||
if (i > 0)
|
||||
{
|
||||
use_buffer (buf, 10 * i);
|
||||
down2 (i - 1);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
struct rlimit r;
|
||||
|
||||
/* We set a stack limit because we are usually invoked via make, and
|
||||
make sets the stack limit to be as large as possible. */
|
||||
r.rlim_cur = 8192 * 1024;
|
||||
r.rlim_max = 8192 * 1024;
|
||||
if (setrlimit (RLIMIT_STACK, &r) != 0)
|
||||
abort ();
|
||||
down1 (1000);
|
||||
down2 (1000);
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue