diff options
author | Julian Lettner <jlettner@apple.com> | 2019-07-01 17:39:39 +0000 |
---|---|---|
committer | Julian Lettner <jlettner@apple.com> | 2019-07-01 17:39:39 +0000 |
commit | 65810c2e188863286347069dbd52a89905adbe89 (patch) | |
tree | f88cc0163e5cd64295f15176f0dc62240037d454 | |
parent | 9e72c27316149670623e2b8c669ce2acde667035 (diff) | |
download | compiler-rt-65810c2e188863286347069dbd52a89905adbe89.tar.gz |
[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
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@364818 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/tsan/rtl/tsan_interceptors.cc | 11 | ||||
-rw-r--r-- | lib/tsan/rtl/tsan_rtl.h | 1 |
2 files changed, 4 insertions, 8 deletions
diff --git a/lib/tsan/rtl/tsan_interceptors.cc b/lib/tsan/rtl/tsan_interceptors.cc index 3ac10abc0..7bf9736f5 100644 --- a/lib/tsan/rtl/tsan_interceptors.cc +++ b/lib/tsan/rtl/tsan_interceptors.cc @@ -486,7 +486,7 @@ static void JmpBufGarbageCollect(ThreadState *thr, uptr sp) { } } -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, uptr sp, uptr mangled_sp) { // 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, uptr *env) { # 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, uptr *env) { // 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 diff --git a/lib/tsan/rtl/tsan_rtl.h b/lib/tsan/rtl/tsan_rtl.h index d58c1dca4..3a8231bda 100644 --- a/lib/tsan/rtl/tsan_rtl.h +++ b/lib/tsan/rtl/tsan_rtl.h @@ -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; |