[compiler-rt] r364818 - [TSan] Improve handling of stack pointer mangling in {set, long}jmp, pt.2

Julian Lettner via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 1 10:39:39 PDT 2019


Author: yln
Date: Mon Jul  1 10:39:39 2019
New Revision: 364818

URL: http://llvm.org/viewvc/llvm-project?rev=364818&view=rev
Log:
[TSan] Improve handling of stack pointer mangling in {set,long}jmp, pt.2

Switch `LongJmp` over to lookup JmpBuf via plain old (unmangled) SP.
This makes the computation of mangled SPs in the TSan assembly files
unnecessary, which will be cleaned up in follow-up revisions.

Reviewed By: dvyukov

Differential Revision: https://reviews.llvm.org/D63942

Modified:
    compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
    compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=364818&r1=364817&r2=364818&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Mon Jul  1 10:39:39 2019
@@ -486,7 +486,7 @@ static void JmpBufGarbageCollect(ThreadS
   }
 }
 
-static void SetJmp(ThreadState *thr, uptr sp, uptr mangled_sp) {
+static void SetJmp(ThreadState *thr, uptr sp) {
   if (!thr->is_inited)  // called from libc guts during bootstrap
     return;
   // Cleanup old bufs.
@@ -494,7 +494,6 @@ static void SetJmp(ThreadState *thr, upt
   // Remember the buf.
   JmpBuf *buf = thr->jmp_bufs.PushBack();
   buf->sp = sp;
-  buf->mangled_sp = mangled_sp;
   buf->shadow_stack_pos = thr->shadow_stack_pos;
   ThreadSignalContext *sctx = SigCtx(thr);
   buf->int_signal_send = sctx ? sctx->int_signal_send : 0;
@@ -529,12 +528,10 @@ static void LongJmp(ThreadState *thr, up
 # endif
 #endif
   uptr sp = UnmangleLongJmpSp(mangled_sp);
-  // Find the saved buf by mangled_sp.
+  // Find the saved buf with matching sp.
   for (uptr i = 0; i < thr->jmp_bufs.Size(); i++) {
     JmpBuf *buf = &thr->jmp_bufs[i];
-    if (buf->mangled_sp == mangled_sp) {
-      CHECK_EQ(buf->sp, sp);
-      // TODO(yln): Lookup via sp, remove mangled_sp from struct.
+    if (buf->sp == sp) {
       CHECK_GE(thr->shadow_stack_pos, buf->shadow_stack_pos);
       // Unwind the stack.
       while (thr->shadow_stack_pos > buf->shadow_stack_pos)
@@ -558,7 +555,7 @@ static void LongJmp(ThreadState *thr, up
 // FIXME: put everything below into a common extern "C" block?
 extern "C" void __tsan_setjmp(uptr sp, uptr mangled_sp) {
   cur_thread_init();
-  SetJmp(cur_thread(), sp, mangled_sp);
+  SetJmp(cur_thread(), sp);
 }
 
 #if SANITIZER_MAC

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h?rev=364818&r1=364817&r2=364818&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h Mon Jul  1 10:39:39 2019
@@ -325,7 +325,6 @@ struct ThreadSignalContext;
 
 struct JmpBuf {
   uptr sp;
-  uptr mangled_sp;
   int int_signal_send;
   bool in_blocking_func;
   uptr in_signal_handler;




More information about the llvm-commits mailing list