Commit 457186f6 by Ian Lance Taylor Committed by Ian Lance Taylor

generic-morestack.c (__splitstack_find): Adjust returned stack pointer to…

generic-morestack.c (__splitstack_find): Adjust returned stack pointer to include all registers pushed by __morestack.

	* generic-morestack.c (__splitstack_find): Adjust returned stack
	pointer to include all registers pushed by __morestack.

From-SVN: r170757
parent c7e529d3
2011-03-07 Ian Lance Taylor <iant@google.com>
* generic-morestack.c (__splitstack_find): Adjust returned stack
pointer to include all registers pushed by __morestack.
2011-01-26 Dave Korn <dave.korn.cygwin@gmail.com> 2011-01-26 Dave Korn <dave.korn.cygwin@gmail.com>
PR target/40125 PR target/40125
......
/* Library support for -fsplit-stack. */ /* Library support for -fsplit-stack. */
/* Copyright (C) 2009, 2010 Free Software Foundation, Inc. /* Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
Contributed by Ian Lance Taylor <iant@google.com>. Contributed by Ian Lance Taylor <iant@google.com>.
This file is part of GCC. This file is part of GCC.
...@@ -846,20 +846,24 @@ __splitstack_find (void *segment_arg, void *sp, size_t *len, ...@@ -846,20 +846,24 @@ __splitstack_find (void *segment_arg, void *sp, size_t *len,
parameters <- old_stack parameters <- old_stack
return in f1 return in f1
return in f2 return in f2
data pushed by __morestack registers pushed by __morestack
On x86, the data pushed by __morestack includes the saved value The registers pushed by __morestack may not be visible on any
of the ebp/rbp register. We want our caller to be able to see other stack, if we are being called by a signal handler
that value, which can not be found on any other stack. So we immediately after the call to __morestack_unblock_signals. We
adjust accordingly. This may need to be tweaked for other want to adjust our return value to include those registers. This
targets. */ is target dependent. */
nsp = (char *) segment->old_stack; nsp = (char *) segment->old_stack;
#ifdef STACK_GROWS_DOWNWARD
nsp -= 3 * sizeof (void *); #if defined (__x86_64__)
nsp -= 12 * sizeof (void *);
#elif defined (__i386__)
nsp -= 6 * sizeof (void *);
#else #else
nsp += 3 * sizeof (void *); #error "unrecognized target"
#endif #endif
*next_sp = (void *) nsp; *next_sp = (void *) nsp;
#ifdef STACK_GROWS_DOWNWARD #ifdef STACK_GROWS_DOWNWARD
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment