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) {