summaryrefslogtreecommitdiff
path: root/lib/tsan/rtl/tsan_interface_inl.h
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2013-03-21 15:37:39 +0000
committerDmitry Vyukov <dvyukov@google.com>2013-03-21 15:37:39 +0000
commit0dc47b652dfbe0d61d153eded02bae9487a7b539 (patch)
tree3bf128829ebe837e34586df47fd62420f57b7ae6 /lib/tsan/rtl/tsan_interface_inl.h
parentf63dde3594da0dba4c8039f0cb3a4196a76f1aff (diff)
downloadcompiler-rt-0dc47b652dfbe0d61d153eded02bae9487a7b539.tar.gz
compiler-rt-0dc47b652dfbe0d61d153eded02bae9487a7b539.tar.bz2
compiler-rt-0dc47b652dfbe0d61d153eded02bae9487a7b539.tar.xz
tsan: better reporting for races on vptr
explicitly say "ctor/dtor vs virtual call" git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@177640 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/rtl/tsan_interface_inl.h')
-rw-r--r--lib/tsan/rtl/tsan_interface_inl.h16
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/tsan/rtl/tsan_interface_inl.h b/lib/tsan/rtl/tsan_interface_inl.h
index 29e2b21e..0187e49d 100644
--- a/lib/tsan/rtl/tsan_interface_inl.h
+++ b/lib/tsan/rtl/tsan_interface_inl.h
@@ -52,8 +52,20 @@ void __tsan_write8(void *addr) {
void __tsan_vptr_update(void **vptr_p, void *new_val) {
CHECK_EQ(sizeof(vptr_p), 8);
- if (*vptr_p != new_val)
- MemoryWrite(cur_thread(), CALLERPC, (uptr)vptr_p, kSizeLog8);
+ if (*vptr_p != new_val) {
+ ThreadState *thr = cur_thread();
+ thr->is_vptr_access = true;
+ MemoryWrite(thr, CALLERPC, (uptr)vptr_p, kSizeLog8);
+ thr->is_vptr_access = false;
+ }
+}
+
+void __tsan_vptr_read(void **vptr_p) {
+ CHECK_EQ(sizeof(vptr_p), 8);
+ ThreadState *thr = cur_thread();
+ thr->is_vptr_access = true;
+ MemoryRead(thr, CALLERPC, (uptr)vptr_p, kSizeLog8);
+ thr->is_vptr_access = false;
}
void __tsan_func_entry(void *pc) {