runtime: Add __sparc__ case for SETCONTEXT_CLOBBERS_TLS.
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 16 Jan 2015 23:23:31 +0000 (23:23 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 16 Jan 2015 23:23:31 +0000 (23:23 +0000)
The glibc setcontext incorrectly modifies %g7 on SPARC.

From Richard Henderson.

From-SVN: r219778

libgo/runtime/proc.c

index c4f27fb6bbbccd7d19c5c86ed98ffe5fa65eebea..da0f2ed3a75ab3a40312eff6647e2d22b7abff77 100644 (file)
@@ -126,6 +126,30 @@ fixcontext(ucontext_t* c)
        c->uc_mcontext._mc_tlsbase = tlsbase;
 }
 
+# elif defined(__sparc__)
+
+static inline void
+initcontext(void)
+{
+}
+
+static inline void
+fixcontext(ucontext_t *c)
+{
+       /* ??? Using 
+            register unsigned long thread __asm__("%g7");
+            c->uc_mcontext.gregs[REG_G7] = thread;
+          results in
+            error: variable ‘thread’ might be clobbered by \
+               ‘longjmp’ or ‘vfork’ [-Werror=clobbered]
+          which ought to be false, as %g7 is a fixed register.  */
+
+       if (sizeof (c->uc_mcontext.gregs[REG_G7]) == 8)
+               asm ("stx %%g7, %0" : "=m"(c->uc_mcontext.gregs[REG_G7]));
+       else
+               asm ("st %%g7, %0" : "=m"(c->uc_mcontext.gregs[REG_G7]));
+}
+
 # else
 
 #  error unknown case for SETCONTEXT_CLOBBERS_TLS