summaryrefslogtreecommitdiff
path: root/lib/tsan/rtl/tsan_interceptors.cc
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2013-09-20 06:54:14 +0000
committerDmitry Vyukov <dvyukov@google.com>2013-09-20 06:54:14 +0000
commiteb0be61dee155f501bb249287b17d364fedf3507 (patch)
treee21a335b7bea3f1618ff2a655f4c5818356b5003 /lib/tsan/rtl/tsan_interceptors.cc
parentff90a95c26198e9e794e186365a62511439e0ca0 (diff)
downloadcompiler-rt-eb0be61dee155f501bb249287b17d364fedf3507.tar.gz
compiler-rt-eb0be61dee155f501bb249287b17d364fedf3507.tar.bz2
compiler-rt-eb0be61dee155f501bb249287b17d364fedf3507.tar.xz
tsan: handle memory read/write in syscalls
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@191074 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/rtl/tsan_interceptors.cc')
-rw-r--r--lib/tsan/rtl/tsan_interceptors.cc16
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/tsan/rtl/tsan_interceptors.cc b/lib/tsan/rtl/tsan_interceptors.cc
index 0e8cc174..e53e5cf3 100644
--- a/lib/tsan/rtl/tsan_interceptors.cc
+++ b/lib/tsan/rtl/tsan_interceptors.cc
@@ -1846,11 +1846,21 @@ struct TsanInterceptorContext {
#define COMMON_INTERCEPTOR_BLOCK_REAL(name) BLOCK_REAL(name)
#include "sanitizer_common/sanitizer_common_interceptors.inc"
-// FIXME: Implement these with MemoryAccessRange().
+static void syscall_access_range(uptr pc, uptr p, uptr s, bool write) {
+ ThreadState *thr = cur_thread();
+ if (thr->in_rtl == 0)
+ Initialize(thr);
+ thr->in_rtl++;
+ MemoryAccessRange(thr, pc, p, s, write);
+ thr->in_rtl--;
+ if (thr->in_rtl == 0)
+ ProcessPendingSignals(thr);
+}
+
#define COMMON_SYSCALL_PRE_READ_RANGE(p, s) \
- do { } while (false)
+ syscall_access_range(GET_CALLER_PC(), (uptr)(p), (uptr)(s), false)
#define COMMON_SYSCALL_PRE_WRITE_RANGE(p, s) \
- do { } while (false)
+ syscall_access_range(GET_CALLER_PC(), (uptr)(p), (uptr)(s), true)
#define COMMON_SYSCALL_POST_READ_RANGE(p, s) \
do { } while (false)
#define COMMON_SYSCALL_POST_WRITE_RANGE(p, s) \