diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-02-15 22:29:35 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-02-15 22:29:35 +0000 |
commit | 9f89fc14b517dd5af3dc205885b9e798ebbbf2cb (patch) | |
tree | 8479da6f747b3bcc95251ebeec9fd6caef172543 /libgo | |
parent | 3619a9e53146fa41ef55d870aa3d3ed2f0f55ea6 (diff) |
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
Diffstat (limited to 'libgo')
-rw-r--r-- | libgo/config.h.in | 3 | ||||
-rwxr-xr-x | libgo/configure | 17 | ||||
-rw-r--r-- | libgo/configure.ac | 18 | ||||
-rw-r--r-- | libgo/runtime/proc.c | 3 |
4 files changed, 41 insertions, 0 deletions
diff --git a/libgo/config.h.in b/libgo/config.h.in index ae81ff45b471..5318cf58c441 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 9bbdfe92985d..7da2e3f7c2a0 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 249918b15d0c..479ced0ef8a2 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 <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; diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c index 609920a56197..d7e1e5ff405b 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); |