diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2012-06-14 21:40:35 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2012-06-14 21:40:35 +0000 |
commit | 3fb44411ae1b9c2a277c04b3f379554290832009 (patch) | |
tree | b0128dc2b84ef679f242c145b4fe89d0b5d88dd2 | |
parent | a9f18d17d034e4001db2d673c7cc3bc52dadbcb6 (diff) | |
download | compiler-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.cc | 3 | ||||
-rw-r--r-- | lib/tsan/rtl/tsan_platform.h | 10 |
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(); |