runtime: Add __sparc__ case for SETCONTEXT_CLOBBERS_TLS.
The glibc setcontext incorrectly modifies %g7 on SPARC. From Richard Henderson. From-SVN: r219778
This commit is contained in:
parent
20780a006f
commit
0f59f5c120
@ -126,6 +126,30 @@ fixcontext(ucontext_t* c)
|
|||||||
c->uc_mcontext._mc_tlsbase = tlsbase;
|
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
|
# else
|
||||||
|
|
||||||
# error unknown case for SETCONTEXT_CLOBBERS_TLS
|
# error unknown case for SETCONTEXT_CLOBBERS_TLS
|
||||||
|
Loading…
Reference in New Issue
Block a user