From ebedcab50d2c7699ced23f4cf4eae712c0a9ca40 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Mon, 3 Jan 2011 13:11:06 +0000 Subject: gdb/ * frame.c (get_prev_frame_1) : New variables this_pc_in_block, morestack_msym and morestack_name. Check for "__morestack" minimal symbol there. gdb/testsuite/ * gdb.base/morestack.exp: New file. * gdb.base/morestack.c: New file. --- gdb/testsuite/gdb.base/morestack.c | 105 +++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 gdb/testsuite/gdb.base/morestack.c (limited to 'gdb/testsuite/gdb.base/morestack.c') diff --git a/gdb/testsuite/gdb.base/morestack.c b/gdb/testsuite/gdb.base/morestack.c new file mode 100644 index 0000000..e612c73 --- /dev/null +++ b/gdb/testsuite/gdb.base/morestack.c @@ -0,0 +1,105 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Based on the gcc testcase `gcc/testsuite/gcc.dg/split-1.c'. This test + needs to use setrlimit to set the stack size, so it can only run on Unix. + */ + +#include +#include +#include +#include +#include + +/* Use a noinline function to ensure that the buffer is not removed + from the stack. */ +static void use_buffer (char *buf) __attribute__ ((noinline)); +static void +use_buffer (char *buf) +{ + buf[0] = '\0'; +} + +static volatile int marker_var; + +static void +marker_miss (void) +{ + marker_var = 0; +} + +static void +marker_hit (void) +{ + marker_var = 0; +} + +void *reserved; +#define RESERVED_SIZE 0x1000000 + +/* Each recursive call uses 10,000 bytes. We call it 1000 times, + using a total of 10,000,000 bytes. If -fsplit-stack is not + working, that will overflow our stack limit. */ + +static void +down (int i) +{ + char buf[10000]; + static void *last; + + if (last && last < (void *) buf) + { + printf ("%d: %p < %p\n", i, last, buf); + marker_hit (); + } + last = buf; + + if (i == 500) + { + if (munmap (reserved, RESERVED_SIZE) != 0) + abort (); + reserved = NULL; + } + + if (i > 0) + { + use_buffer (buf); + down (i - 1); + } + else + marker_miss (); +} + +int +main (void) +{ + struct rlimit r; + + reserved = mmap (NULL, RESERVED_SIZE, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (reserved == MAP_FAILED) + abort (); + + /* 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 (); + down (1000); + return 0; +} -- cgit v1.1