diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2011-01-03 13:11:06 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2011-01-03 13:11:06 +0000 |
commit | ebedcab50d2c7699ced23f4cf4eae712c0a9ca40 (patch) | |
tree | f203ddc5ac237d64a2233448d8837045355078c0 /gdb/testsuite/gdb.base/morestack.c | |
parent | 42ea3d7a0895f6748f2f888d6e993bc0ba6cc013 (diff) | |
download | binutils-ebedcab50d2c7699ced23f4cf4eae712c0a9ca40.zip binutils-ebedcab50d2c7699ced23f4cf4eae712c0a9ca40.tar.gz binutils-ebedcab50d2c7699ced23f4cf4eae712c0a9ca40.tar.bz2 |
gdb/
* frame.c (get_prev_frame_1) <UNWIND_INNER_ID>: 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.
Diffstat (limited to 'gdb/testsuite/gdb.base/morestack.c')
-rw-r--r-- | gdb/testsuite/gdb.base/morestack.c | 105 |
1 files changed, 105 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>. */ + +/* 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 <stdlib.h> +#include <sys/types.h> +#include <sys/resource.h> +#include <stdio.h> +#include <sys/mman.h> + +/* 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; +} |