OSDN Git Service

runtime: Support broken makecontext on Solaris 8/9.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Feb 2012 22:29:35 +0000 (22:29 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Feb 2012 22:29:35 +0000 (22:29 +0000)
From Rainer Orth.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184289 138bc75d-0d04-0410-961f-82ee72b054a4

libgo/config.h.in
libgo/configure
libgo/configure.ac
libgo/runtime/proc.c

index ae81ff4..5318cf5 100644 (file)
    */
 #undef LT_OBJDIR
 
+/* Define if makecontext expects top of stack in uc_stack. */
+#undef MAKECONTEXT_STACK_TOP
+
 /* Name of package */
 #undef PACKAGE
 
index 9bbdfe9..7da2e3f 100755 (executable)
@@ -14873,6 +14873,20 @@ $as_echo "#define HAVE_STRUCT_EXCEPTION 1" >>confdefs.h
 
 fi
 
+case "$target" in
+  sparc*-*-solaris2.[89]*)
+    libgo_cv_lib_makecontext_stack_top=yes
+    ;;
+  *)
+    libgo_cv_lib_makecontext_stack_top=no
+    ;;
+esac
+if test "$libgo_cv_lib_makecontext_stack_top" = "yes"; then
+
+$as_echo "#define MAKECONTEXT_STACK_TOP 1" >>confdefs.h
+
+fi
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setcontext clobbers TLS variables" >&5
 $as_echo_n "checking whether setcontext clobbers TLS variables... " >&6; }
 if test "${libgo_cv_lib_setcontext_clobbers_tls+set}" = set; then :
@@ -14974,6 +14988,9 @@ main ()
     abort ();
 
   c.uc_stack.ss_sp = stack;
+#ifdef MAKECONTEXT_STACK_TOP
+  c.uc_stack.ss_sp += sizeof stack;
+#endif
   c.uc_stack.ss_flags = 0;
   c.uc_stack.ss_size = sizeof stack;
   c.uc_link = NULL;
index 249918b..479ced0 100644 (file)
@@ -611,6 +611,21 @@ if test "$libgo_has_struct_exception" = "yes"; then
             [Define to 1 if <math.h> defines struct exception])
 fi
 
+dnl Check if makecontext expects the uc_stack member of ucontext to point
+dnl to the top of the stack.
+case "$target" in
+  sparc*-*-solaris2.[[89]]*)
+    libgo_cv_lib_makecontext_stack_top=yes
+    ;;
+  *)
+    libgo_cv_lib_makecontext_stack_top=no
+    ;;
+esac
+if test "$libgo_cv_lib_makecontext_stack_top" = "yes"; then
+  AC_DEFINE(MAKECONTEXT_STACK_TOP, 1,
+           [Define if makecontext expects top of stack in uc_stack.])
+fi
+
 dnl See whether setcontext changes the value of TLS variables.
 AC_CACHE_CHECK([whether setcontext clobbers TLS variables],
 [libgo_cv_lib_setcontext_clobbers_tls],
@@ -667,6 +682,9 @@ main ()
     abort ();
 
   c.uc_stack.ss_sp = stack;
+#ifdef MAKECONTEXT_STACK_TOP
+  c.uc_stack.ss_sp += sizeof stack;
+#endif
   c.uc_stack.ss_flags = 0;
   c.uc_stack.ss_size = sizeof stack;
   c.uc_link = NULL;
index 609920a..d7e1e5f 100644 (file)
@@ -1316,6 +1316,9 @@ __go_go(void (*fn)(void*), void* arg)
 
        getcontext(&newg->context);
        newg->context.uc_stack.ss_sp = sp;
+#ifdef MAKECONTEXT_STACK_TOP
+       newg->context.uc_stack.ss_sp += spsize;
+#endif
        newg->context.uc_stack.ss_size = spsize;
        makecontext(&newg->context, kickoff, 0);