From: ian Date: Wed, 15 Feb 2012 22:29:35 +0000 (+0000) Subject: runtime: Support broken makecontext on Solaris 8/9. X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=9f89fc14b517dd5af3dc205885b9e798ebbbf2cb runtime: Support broken makecontext on Solaris 8/9. From Rainer Orth. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184289 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libgo/config.h.in b/libgo/config.h.in index ae81ff45b47..5318cf58c44 100644 --- a/libgo/config.h.in +++ b/libgo/config.h.in @@ -182,6 +182,9 @@ */ #undef LT_OBJDIR +/* Define if makecontext expects top of stack in uc_stack. */ +#undef MAKECONTEXT_STACK_TOP + /* Name of package */ #undef PACKAGE diff --git a/libgo/configure b/libgo/configure index 9bbdfe92985..7da2e3f7c2a 100755 --- a/libgo/configure +++ b/libgo/configure @@ -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; diff --git a/libgo/configure.ac b/libgo/configure.ac index 249918b15d0..479ced0ef8a 100644 --- a/libgo/configure.ac +++ b/libgo/configure.ac @@ -611,6 +611,21 @@ if test "$libgo_has_struct_exception" = "yes"; then [Define to 1 if 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; diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c index 609920a5619..d7e1e5ff405 100644 --- a/libgo/runtime/proc.c +++ b/libgo/runtime/proc.c @@ -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);