https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88500
--- Comment #1 from Ian Lance Taylor <ian at airs dot com> --- SETCONTEXT_CLOBBERS_TLS is set by libgo/configure.ac if this program fails to exit successfully. So the first step in fixing this bug is finding out why this program fails on SH. #include <pthread.h> #include <stdlib.h> #include <ucontext.h> #include <unistd.h> __thread int tls; static char stack[[10 * 1024 * 1024]]; static ucontext_t c; /* Called via makecontext/setcontext. */ static void cfn (void) { exit (tls); } /* Called via pthread_create. */ static void * tfn (void *dummy) { /* The thread should still see this value after calling setcontext. */ tls = 0; setcontext (&c); /* The call to setcontext should not return. */ abort (); } int main () { pthread_t tid; /* The thread should not see this value. */ tls = 1; if (getcontext (&c) < 0) 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; makecontext (&c, cfn, 0); if (pthread_create (&tid, NULL, tfn, NULL) != 0) abort (); if (pthread_join (tid, NULL) != 0) abort (); /* The thread should have called exit. */ abort (); }