tsan: remember and pass original ucontext to signal handlers (instead of a fabricated one)
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@159278 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/tsan/rtl/tsan_interceptors.cc b/lib/tsan/rtl/tsan_interceptors.cc
index 131b146..9cb9da2 100644
--- a/lib/tsan/rtl/tsan_interceptors.cc
+++ b/lib/tsan/rtl/tsan_interceptors.cc
@@ -33,7 +33,7 @@
};
struct ucontext_t {
- u64 opaque[1024];
+ uptr opaque[117];
};
extern "C" int pthread_attr_init(void *attr);
@@ -48,7 +48,6 @@
extern "C" int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
extern "C" int sigfillset(sigset_t *set);
extern "C" void *pthread_self();
-extern "C" int getcontext(ucontext_t *ucp);
extern "C" void _exit(int status);
extern "C" int __cxa_atexit(void (*func)(void *arg), void *arg, void *dso);
extern "C" int *__errno_location();
@@ -1289,6 +1288,8 @@
signal->sigaction = sigact;
if (info)
signal->siginfo = *info;
+ if (ctx)
+ signal->ctx = *(ucontext_t*)ctx;
sctx->pending_signal_count++;
}
}
@@ -1381,9 +1382,7 @@
thr->in_signal_handler = true;
sctx->pending_signal_count = 0;
// These are too big for stack.
- static THREADLOCAL ucontext_t uctx;
static THREADLOCAL sigset_t emptyset, oldset;
- getcontext(&uctx);
sigfillset(&emptyset);
pthread_sigmask(SIG_SETMASK, &emptyset, &oldset);
for (int sig = 0; sig < kSigCount; sig++) {
@@ -1396,7 +1395,7 @@
const int saved_errno = errno;
errno = 0;
if (signal->sigaction)
- sigactions[sig].sa_sigaction(sig, &signal->siginfo, &uctx);
+ sigactions[sig].sa_sigaction(sig, &signal->siginfo, &signal->ctx);
else
sigactions[sig].sa_handler(sig);
if (errno != 0) {