diff --git a/compiler-rt/lib/tsan/rtl/tsan.syms.extra b/compiler-rt/lib/tsan/rtl/tsan.syms.extra --- a/compiler-rt/lib/tsan/rtl/tsan.syms.extra +++ b/compiler-rt/lib/tsan/rtl/tsan.syms.extra @@ -9,6 +9,9 @@ __tsan_unaligned* __tsan_release __tsan_acquire +__tsan_memcpy +__tsan_memmove +__tsan_memset __tsan_mutex_create __tsan_mutex_destroy __tsan_mutex_pre_lock diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp @@ -3059,3 +3059,17 @@ FutexWait(barrier, cur); } } + +extern "C" { +__attribute__((alias(SANITIZER_STRINGIFY(WRAP(memcpy))), + visibility("default"))) void * +__tsan_memcpy(void *dst, const void *src, uptr size); + +__attribute__((alias(SANITIZER_STRINGIFY(WRAP(memset))), + visibility("default"))) void * +__tsan_memset(void *dst, int c, uptr size); + +__attribute__((alias(SANITIZER_STRINGIFY(WRAP(memmove))), + visibility("default"))) void * +__tsan_memmove(void *dst, const void *src, uptr size); +} diff --git a/compiler-rt/lib/tsan/rtl/tsan_interface.h b/compiler-rt/lib/tsan/rtl/tsan_interface.h --- a/compiler-rt/lib/tsan/rtl/tsan_interface.h +++ b/compiler-rt/lib/tsan/rtl/tsan_interface.h @@ -72,6 +72,13 @@ SANITIZER_INTERFACE_ATTRIBUTE void __tsan_vptr_update(void **vptr_p, void *new_val); +SANITIZER_INTERFACE_ATTRIBUTE +void *__tsan_memcpy(void *dest, const void *src, uptr count); +SANITIZER_INTERFACE_ATTRIBUTE +void *__tsan_memset(void *dest, int ch, uptr count); +SANITIZER_INTERFACE_ATTRIBUTE +void *__tsan_memmove(void *dest, const void *src, uptr count); + SANITIZER_INTERFACE_ATTRIBUTE void __tsan_func_entry(void *call_pc); SANITIZER_INTERFACE_ATTRIBUTE void __tsan_func_exit(); diff --git a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp --- a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp @@ -341,13 +341,13 @@ } MemmoveFn = - M.getOrInsertFunction("memmove", Attr, IRB.getInt8PtrTy(), + M.getOrInsertFunction("__tsan_memmove", Attr, IRB.getInt8PtrTy(), IRB.getInt8PtrTy(), IRB.getInt8PtrTy(), IntptrTy); MemcpyFn = - M.getOrInsertFunction("memcpy", Attr, IRB.getInt8PtrTy(), + M.getOrInsertFunction("__tsan_memcpy", Attr, IRB.getInt8PtrTy(), IRB.getInt8PtrTy(), IRB.getInt8PtrTy(), IntptrTy); MemsetFn = - M.getOrInsertFunction("memset", Attr, IRB.getInt8PtrTy(), + M.getOrInsertFunction("__tsan_memset", Attr, IRB.getInt8PtrTy(), IRB.getInt8PtrTy(), IRB.getInt32Ty(), IntptrTy); } diff --git a/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll b/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll --- a/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll +++ b/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll @@ -35,7 +35,7 @@ tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %x, i8* align 4 %y, i64 16, i1 false) ret void ; CHECK: define void @MemCpyTest -; CHECK: call i8* @memcpy +; CHECK: call i8* @__tsan_memcpy ; CHECK: ret void } @@ -44,7 +44,7 @@ tail call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 4 %x, i8* align 4 %y, i64 16, i1 false) ret void ; CHECK: define void @MemCpyInlineTest -; CHECK: call i8* @memcpy +; CHECK: call i8* @__tsan_memcpy ; CHECK: ret void } @@ -53,7 +53,7 @@ tail call void @llvm.memmove.p0i8.p0i8.i64(i8* align 4 %x, i8* align 4 %y, i64 16, i1 false) ret void ; CHECK: define void @MemMoveTest -; CHECK: call i8* @memmove +; CHECK: call i8* @__tsan_memmove ; CHECK: ret void } @@ -62,7 +62,7 @@ tail call void @llvm.memset.p0i8.i64(i8* align 4 %x, i8 77, i64 16, i1 false) ret void ; CHECK: define void @MemSetTest -; CHECK: call i8* @memset +; CHECK: call i8* @__tsan_memset ; CHECK: ret void } @@ -71,7 +71,7 @@ tail call void @llvm.memset.inline.p0i8.i64(i8* align 4 %x, i8 77, i64 16, i1 false) ret void ; CHECK: define void @MemSetInlineTest -; CHECK: call i8* @memset +; CHECK: call i8* @__tsan_memset ; CHECK: ret void }