summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2012-06-14 21:40:35 +0000
committerDmitry Vyukov <dvyukov@google.com>2012-06-14 21:40:35 +0000
commit3fb44411ae1b9c2a277c04b3f379554290832009 (patch)
treeb0128dc2b84ef679f242c145b4fe89d0b5d88dd2
parenta9f18d17d034e4001db2d673c7cc3bc52dadbcb6 (diff)
downloadcompiler-rt-3fb44411ae1b9c2a277c04b3f379554290832009.tar.gz
tsan: fix COMPAT mapping to not produce false reports
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@158473 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/tsan/rtl/tsan_interface_ann.cc3
-rw-r--r--lib/tsan/rtl/tsan_platform.h10
2 files changed, 13 insertions, 0 deletions
diff --git a/lib/tsan/rtl/tsan_interface_ann.cc b/lib/tsan/rtl/tsan_interface_ann.cc
index b2e199f50..a605b6c9d 100644
--- a/lib/tsan/rtl/tsan_interface_ann.cc
+++ b/lib/tsan/rtl/tsan_interface_ann.cc
@@ -18,6 +18,7 @@
#include "tsan_rtl.h"
#include "tsan_mman.h"
#include "tsan_flags.h"
+#include "tsan_platform.h"
#define CALLERPC ((uptr)__builtin_return_address(0))
@@ -123,6 +124,8 @@ static ExpectRace *FindRace(ExpectRace *list, uptr addr, uptr size) {
static bool CheckContains(ExpectRace *list, uptr addr, uptr size) {
ExpectRace *race = FindRace(list, addr, size);
+ if (race == 0 && AlternativeAddress(addr))
+ race = FindRace(list, AlternativeAddress(addr), size);
if (race == 0)
return false;
DPrintf("Hit expected/benign race: %s addr=%zx:%d %s:%d\n",
diff --git a/lib/tsan/rtl/tsan_platform.h b/lib/tsan/rtl/tsan_platform.h
index f82d846f9..7c33bc7f8 100644
--- a/lib/tsan/rtl/tsan_platform.h
+++ b/lib/tsan/rtl/tsan_platform.h
@@ -64,6 +64,16 @@ static inline uptr ShadowToMem(uptr shadow) {
#endif
}
+// For COMPAT mapping returns an alternative address
+// that mapped to the same shadow address.
+static inline uptr AlternativeAddress(uptr addr) {
+#if defined(TSAN_COMPAT_SHADOW) && TSAN_COMPAT_SHADOW
+ return addr | kLinuxAppMemMsk;
+#else
+ return 0;
+#endif
+}
+
uptr GetShadowMemoryConsumption();
void FlushShadowMemory();