generic-morestack.c (__splitstack_find): Adjust returned stack pointer to include...
authorIan Lance Taylor <iant@google.com>
Mon, 7 Mar 2011 21:47:10 +0000 (21:47 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 7 Mar 2011 21:47:10 +0000 (21:47 +0000)
* generic-morestack.c (__splitstack_find): Adjust returned stack
pointer to include all registers pushed by __morestack.

From-SVN: r170757

libgcc/ChangeLog
libgcc/generic-morestack.c

index 3368dec..4092218 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        PR target/40125
index 3709d32..7e29bbc 100644 (file)
@@ -1,5 +1,5 @@
 /* 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>.
 
 This file is part of GCC.
@@ -846,20 +846,24 @@ __splitstack_find (void *segment_arg, void *sp, size_t *len,
          parameters       <- old_stack
          return in f1
         return in f2
-        data pushed by __morestack
+        registers pushed by __morestack
 
-     On x86, the data pushed by __morestack includes the saved value
-     of the ebp/rbp register.  We want our caller to be able to see
-     that value, which can not be found on any other stack.  So we
-     adjust accordingly.  This may need to be tweaked for other
-     targets.  */
+     The registers pushed by __morestack may not be visible on any
+     other stack, if we are being called by a signal handler
+     immediately after the call to __morestack_unblock_signals.  We
+     want to adjust our return value to include those registers.  This
+     is target dependent.  */
 
   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
-  nsp += 3 * sizeof (void *);
+#error "unrecognized target"
 #endif
+
   *next_sp = (void *) nsp;
 
 #ifdef STACK_GROWS_DOWNWARD