diff options
-rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h | 9 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_defs.h | 29 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_flags.cc | 6 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_interceptors.cc | 88 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_md5.cc | 12 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc | 4 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc | 2 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_suppressions.cc | 12 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc | 43 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_vector.h | 2 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl_tests/tsan_test_util_linux.cc | 7 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/unit_tests/tsan_platform_test.cc | 2 |
12 files changed, 114 insertions, 102 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h b/compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h index 5e0fb6945a4..ea914abc799 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h @@ -26,6 +26,7 @@ using namespace __sanitizer; // NOLINT // Platform-specific defs. #if defined(_WIN32) typedef unsigned long DWORD; // NOLINT +# define ALWAYS_INLINE __declspec(forceinline) // FIXME(timurrrr): do we need this on Windows? # define ALIAS(x) # define ALIGNED(x) __declspec(align(x)) @@ -33,18 +34,24 @@ typedef unsigned long DWORD; // NOLINT # define NOINLINE __declspec(noinline) # define NORETURN __declspec(noreturn) # define THREADLOCAL __declspec(thread) +# define NOTHROW #else // _WIN32 +# define ALWAYS_INLINE __attribute__((always_inline)) # define ALIAS(x) __attribute__((alias(x))) # define ALIGNED(x) __attribute__((aligned(x))) # define FORMAT(f, a) __attribute__((format(printf, f, a))) # define NOINLINE __attribute__((noinline)) # define NORETURN __attribute__((noreturn)) # define THREADLOCAL __thread +# ifdef __cplusplus +# define NOTHROW throw() +# else +# define NOTHROW __attribute__((__nothrow__)) +#endif #endif // _WIN32 // We have no equivalent of these on Windows. #ifndef _WIN32 -# define ALWAYS_INLINE __attribute__((always_inline)) # define LIKELY(x) __builtin_expect(!!(x), 1) # define UNLIKELY(x) __builtin_expect(!!(x), 0) # define UNUSED __attribute__((unused)) diff --git a/compiler-rt/lib/tsan/rtl/tsan_defs.h b/compiler-rt/lib/tsan/rtl/tsan_defs.h index ae99ecc4835..a37c0a3ad3d 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_defs.h +++ b/compiler-rt/lib/tsan/rtl/tsan_defs.h @@ -14,7 +14,6 @@ #ifndef TSAN_DEFS_H #define TSAN_DEFS_H -#include "interception/interception.h" #include "sanitizer_common/sanitizer_internal_defs.h" #include "sanitizer_common/sanitizer_libc.h" #include "tsan_stat.h" @@ -155,9 +154,29 @@ class StackTrace; } // namespace __tsan -DECLARE_REAL(void*, memset, void *ptr, int v, uptr size); -DECLARE_REAL(void*, memcpy, void *dst, const void *src, uptr size); -DECLARE_REAL(int, strncmp, const char *s1, const char *s2, uptr n); -DECLARE_REAL(const char*, strstr, const char *s1, const char *s2); +extern "C" inline void *ALWAYS_INLINE +memset(void *ptr, int v, uptr size) NOTHROW { + for (uptr i = 0; i < size; i++) + ((char*)ptr)[i] = (char)v; + return ptr; +} + +extern "C" inline void *ALWAYS_INLINE +memcpy(void *dst, const void *src, uptr size) NOTHROW { + for (uptr i = 0; i < size; i++) + ((char*)dst)[i] = ((char*)src)[i]; + return dst; +} + +extern "C" inline int ALWAYS_INLINE +memcmp(const void *p1, const void *p2, uptr size) NOTHROW { + for (uptr i = 0; i < size; i++) { + if (((unsigned char*)p1)[i] < ((unsigned char*)p2)[i]) + return -1; + if (((unsigned char*)p1)[i] > ((unsigned char*)p2)[i]) + return 1; + } + return 0; +} #endif // TSAN_DEFS_H diff --git a/compiler-rt/lib/tsan/rtl/tsan_flags.cc b/compiler-rt/lib/tsan/rtl/tsan_flags.cc index 1722ad187ec..7224f4b6723 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_flags.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_flags.cc @@ -32,7 +32,7 @@ void WEAK OverrideFlags(Flags *f) { } void InitializeFlags(Flags *f, const char *env) { - REAL(memset)(f, 0, sizeof(*f)); + internal_memset(f, 0, sizeof(*f)); // Default values. f->enable_annotations = true; @@ -78,7 +78,7 @@ static const char *GetFlagValue(const char *env, const char *name, const char **end) { if (env == 0) return *end = 0; - const char *pos = REAL(strstr)(env, name); + const char *pos = internal_strstr(env, name); if (pos == 0) return *end = 0; pos += internal_strlen(name); @@ -139,7 +139,7 @@ static void Flag(const char *env, const char **flag, const char *name) { return; int len = end - val; char *f = (char*)internal_alloc(MBlockFlag, len + 1); - REAL(memcpy)(f, val, len); + internal_memcpy(f, val, len); f[len] = 0; *flag = f; } diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc index 9cb9da2f102..50045ade629 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc @@ -172,6 +172,17 @@ class ScopedInterceptor { return REAL(func)(__VA_ARGS__); \ /**/ +#define SCOPED_INTERCEPTOR_LIBC(func, ...) \ + ThreadState *thr = cur_thread(); \ + StatInc(thr, StatInterceptor); \ + StatInc(thr, StatInt_##func); \ + ScopedInterceptor si(thr, #func, callpc); \ + const uptr pc = (uptr)&func; \ + (void)pc; \ + if (thr->in_rtl > 1) \ + return REAL(func)(__VA_ARGS__); \ +/**/ + #define TSAN_INTERCEPTOR(ret, func, ...) INTERCEPTOR(ret, func, __VA_ARGS__) #define TSAN_INTERCEPT(func) INTERCEPT_FUNCTION(func) @@ -321,7 +332,7 @@ TSAN_INTERCEPTOR(void*, calloc, uptr size, uptr n) { { SCOPED_INTERCEPTOR_RAW(calloc, size, n); p = user_alloc(thr, pc, n * size); - REAL(memset)(p, 0, n * size); + internal_memset(p, 0, n * size); } invoke_malloc_hook(p, n * size); return p; @@ -354,26 +365,48 @@ TSAN_INTERCEPTOR(void, cfree, void *p) { user_free(thr, pc, p); } -TSAN_INTERCEPTOR(uptr, strlen, const void *s) { +TSAN_INTERCEPTOR(uptr, strlen, const char *s) { SCOPED_TSAN_INTERCEPTOR(strlen, s); - uptr len = REAL(strlen)(s); + uptr len = internal_strlen(s); MemoryAccessRange(thr, pc, (uptr)s, len + 1, false); return len; } -TSAN_INTERCEPTOR(void*, memset, void *dst, int v, uptr size) { - SCOPED_TSAN_INTERCEPTOR(memset, dst, v, size); +DECLARE_REAL(void*, memset, void *dst, int v, uptr size); +DECLARE_REAL(void*, memcpy, void *dst, const void *src, uptr size); +DECLARE_REAL(int, memcmp, const void *s1, const void *s2, uptr n); +extern "C" void *__interceptor_memset(void *dst, int v, uptr size); +extern "C" void *__interceptor_memcpy(void *dst, const void *src, uptr size); +extern "C" int __interceptor_memcmp(const void *s1, const void *s2, uptr n); + +namespace __tsan { +void *intercept_memset(uptr callpc, void *dst, int v, uptr size) { + SCOPED_INTERCEPTOR_LIBC(memset, dst, v, size); MemoryAccessRange(thr, pc, (uptr)dst, size, true); return REAL(memset)(dst, v, size); } -TSAN_INTERCEPTOR(void*, memcpy, void *dst, const void *src, uptr size) { - SCOPED_TSAN_INTERCEPTOR(memcpy, dst, src, size); +void *intercept_memcpy(uptr callpc, void *dst, const void *src, uptr size) { + SCOPED_INTERCEPTOR_LIBC(memcpy, dst, src, size); MemoryAccessRange(thr, pc, (uptr)dst, size, true); MemoryAccessRange(thr, pc, (uptr)src, size, false); return REAL(memcpy)(dst, src, size); } +int intercept_memcmp(uptr callpc, const void *s1, const void *s2, uptr n) { + SCOPED_INTERCEPTOR_LIBC(memcmp, s1, s2, n); + int res = 0; + uptr len = 0; + for (; len < n; len++) { + if ((res = ((unsigned char*)s1)[len] - ((unsigned char*)s2)[len])) + break; + } + MemoryAccessRange(thr, pc, (uptr)s1, len < n ? len + 1 : n, false); + MemoryAccessRange(thr, pc, (uptr)s2, len < n ? len + 1 : n, false); + return res; +} +} + TSAN_INTERCEPTOR(int, strcmp, const char *s1, const char *s2) { SCOPED_TSAN_INTERCEPTOR(strcmp, s1, s2); uptr len = 0; @@ -419,52 +452,39 @@ TSAN_INTERCEPTOR(void*, memmove, void *dst, void *src, uptr n) { return REAL(memmove)(dst, src, n); } -TSAN_INTERCEPTOR(int, memcmp, const void *s1, const void *s2, uptr n) { - SCOPED_TSAN_INTERCEPTOR(memcmp, s1, s2, n); - int res = 0; - uptr len = 0; - for (; len < n; len++) { - if ((res = ((unsigned char*)s1)[len] - ((unsigned char*)s2)[len])) - break; - } - MemoryAccessRange(thr, pc, (uptr)s1, len < n ? len + 1 : n, false); - MemoryAccessRange(thr, pc, (uptr)s2, len < n ? len + 1 : n, false); - return res; -} - -TSAN_INTERCEPTOR(void*, strchr, void *s, int c) { +TSAN_INTERCEPTOR(char*, strchr, char *s, int c) { SCOPED_TSAN_INTERCEPTOR(strchr, s, c); - void *res = REAL(strchr)(s, c); - uptr len = res ? (char*)res - (char*)s + 1 : REAL(strlen)(s) + 1; + char *res = REAL(strchr)(s, c); + uptr len = res ? (char*)res - (char*)s + 1 : internal_strlen(s) + 1; MemoryAccessRange(thr, pc, (uptr)s, len, false); return res; } -TSAN_INTERCEPTOR(void*, strchrnul, void *s, int c) { +TSAN_INTERCEPTOR(char*, strchrnul, char *s, int c) { SCOPED_TSAN_INTERCEPTOR(strchrnul, s, c); - void *res = REAL(strchrnul)(s, c); + char *res = REAL(strchrnul)(s, c); uptr len = (char*)res - (char*)s + 1; MemoryAccessRange(thr, pc, (uptr)s, len, false); return res; } -TSAN_INTERCEPTOR(void*, strrchr, void *s, int c) { +TSAN_INTERCEPTOR(char*, strrchr, char *s, int c) { SCOPED_TSAN_INTERCEPTOR(strrchr, s, c); - MemoryAccessRange(thr, pc, (uptr)s, REAL(strlen)(s) + 1, false); + MemoryAccessRange(thr, pc, (uptr)s, internal_strlen(s) + 1, false); return REAL(strrchr)(s, c); } -TSAN_INTERCEPTOR(void*, strcpy, void *dst, const void *src) { // NOLINT +TSAN_INTERCEPTOR(char*, strcpy, char *dst, const char *src) { // NOLINT SCOPED_TSAN_INTERCEPTOR(strcpy, dst, src); // NOLINT - uptr srclen = REAL(strlen)(src); + uptr srclen = internal_strlen(src); MemoryAccessRange(thr, pc, (uptr)dst, srclen + 1, true); MemoryAccessRange(thr, pc, (uptr)src, srclen + 1, false); return REAL(strcpy)(dst, src); // NOLINT } -TSAN_INTERCEPTOR(void*, strncpy, void *dst, void *src, uptr n) { +TSAN_INTERCEPTOR(char*, strncpy, char *dst, char *src, uptr n) { SCOPED_TSAN_INTERCEPTOR(strncpy, dst, src, n); - uptr srclen = REAL(strlen)(src); + uptr srclen = internal_strlen(src); MemoryAccessRange(thr, pc, (uptr)dst, n, true); MemoryAccessRange(thr, pc, (uptr)src, min(srclen + 1, n), false); return REAL(strncpy)(dst, src, n); @@ -473,8 +493,8 @@ TSAN_INTERCEPTOR(void*, strncpy, void *dst, void *src, uptr n) { TSAN_INTERCEPTOR(const char*, strstr, const char *s1, const char *s2) { SCOPED_TSAN_INTERCEPTOR(strstr, s1, s2); const char *res = REAL(strstr)(s1, s2); - uptr len1 = REAL(strlen)(s1); - uptr len2 = REAL(strlen)(s2); + uptr len1 = internal_strlen(s1); + uptr len2 = internal_strlen(s2); MemoryAccessRange(thr, pc, (uptr)s1, len1 + 1, false); MemoryAccessRange(thr, pc, (uptr)s2, len2 + 1, false); return res; @@ -1224,7 +1244,7 @@ TSAN_INTERCEPTOR(uptr, fwrite, const void *p, uptr size, uptr nmemb, void *f) { TSAN_INTERCEPTOR(int, puts, const char *s) { SCOPED_TSAN_INTERCEPTOR(puts, s); - MemoryAccessRange(thr, pc, (uptr)s, REAL(strlen)(s), false); + MemoryAccessRange(thr, pc, (uptr)s, internal_strlen(s), false); return REAL(puts)(s); } diff --git a/compiler-rt/lib/tsan/rtl/tsan_md5.cc b/compiler-rt/lib/tsan/rtl/tsan_md5.cc index 00e7b83363f..c9d671f5b59 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_md5.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_md5.cc @@ -166,11 +166,11 @@ void MD5_Update(MD5_CTX *ctx, void *data, ulong_t size) { free = 64 - used; if (size < free) { - REAL(memcpy)(&ctx->buffer[used], data, size); + internal_memcpy(&ctx->buffer[used], data, size); return; } - REAL(memcpy)(&ctx->buffer[used], data, free); + internal_memcpy(&ctx->buffer[used], data, free); data = (unsigned char *)data + free; size -= free; body(ctx, ctx->buffer, 64); @@ -181,7 +181,7 @@ void MD5_Update(MD5_CTX *ctx, void *data, ulong_t size) { size &= 0x3f; } - REAL(memcpy)(ctx->buffer, data, size); + internal_memcpy(ctx->buffer, data, size); } void MD5_Final(unsigned char *result, MD5_CTX *ctx) { @@ -194,13 +194,13 @@ void MD5_Final(unsigned char *result, MD5_CTX *ctx) { free = 64 - used; if (free < 8) { - REAL(memset)(&ctx->buffer[used], 0, free); + internal_memset(&ctx->buffer[used], 0, free); body(ctx, ctx->buffer, 64); used = 0; free = 64; } - REAL(memset)(&ctx->buffer[used], 0, free - 8); + internal_memset(&ctx->buffer[used], 0, free - 8); ctx->lo <<= 3; ctx->buffer[56] = ctx->lo; @@ -231,7 +231,7 @@ void MD5_Final(unsigned char *result, MD5_CTX *ctx) { result[14] = ctx->d >> 16; result[15] = ctx->d >> 24; - REAL(memset)(ctx, 0, sizeof(*ctx)); + internal_memset(ctx, 0, sizeof(*ctx)); } MD5Hash md5_hash(const void *data, uptr size) { diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc index b6065d3e5c3..c6832da510d 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc @@ -50,9 +50,9 @@ static void StackStripMain(ReportStack *stack) { const char *path_prefix = flags()->strip_path_prefix; uptr path_prefix_len = internal_strlen(path_prefix); for (ReportStack *ent = stack; ent; ent = ent->next) { - if (ent->func && 0 == REAL(strncmp)(ent->func, prefix, prefix_len)) + if (ent->func && 0 == internal_strncmp(ent->func, prefix, prefix_len)) ent->func += prefix_len; - if (ent->file && 0 == REAL(strncmp)(ent->file, path_prefix, + if (ent->file && 0 == internal_strncmp(ent->file, path_prefix, path_prefix_len)) ent->file += path_prefix_len; if (ent->file && ent->file[0] == '.' && ent->file[1] == '/') diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc index 2e3225218ab..147e383b63c 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc @@ -212,7 +212,7 @@ void ThreadFinish(ThreadState *thr) { // Save from info about the thread. tctx->dead_info = new(internal_alloc(MBlockDeadInfo, sizeof(ThreadDeadInfo))) ThreadDeadInfo(); - REAL(memcpy)(&tctx->dead_info->trace.events[0], + internal_memcpy(&tctx->dead_info->trace.events[0], &thr->trace.events[0], sizeof(thr->trace.events)); for (int i = 0; i < kTraceParts; i++) { tctx->dead_info->trace.headers[i].stack0.CopyFrom( diff --git a/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc b/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc index 50e27cfce35..7549a4f8ba8 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_suppressions.cc @@ -69,7 +69,7 @@ bool SuppressionMatch(char *templ, const char *str) { tpos = (char*)internal_strchr(templ, '*'); if (tpos != 0) tpos[0] = 0; - spos = REAL(strstr)(str, templ); + spos = internal_strstr(str, templ); str = spos + internal_strlen(templ); templ = tpos; if (tpos) @@ -94,18 +94,18 @@ Suppression *SuppressionParse(const char* supp) { while (line != end2 && (end2[-1] == ' ' || end2[-1] == '\t')) end2--; SuppressionType stype; - if (0 == REAL(strncmp)(line, "race:", sizeof("race:") - 1)) { + if (0 == internal_strncmp(line, "race:", sizeof("race:") - 1)) { stype = SuppressionRace; line += sizeof("race:") - 1; - } else if (0 == REAL(strncmp)(line, "thread:", + } else if (0 == internal_strncmp(line, "thread:", sizeof("thread:") - 1)) { stype = SuppressionThread; line += sizeof("thread:") - 1; - } else if (0 == REAL(strncmp)(line, "mutex:", + } else if (0 == internal_strncmp(line, "mutex:", sizeof("mutex:") - 1)) { stype = SuppressionMutex; line += sizeof("mutex:") - 1; - } else if (0 == REAL(strncmp)(line, "signal:", + } else if (0 == internal_strncmp(line, "signal:", sizeof("signal:") - 1)) { stype = SuppressionSignal; line += sizeof("signal:") - 1; @@ -119,7 +119,7 @@ Suppression *SuppressionParse(const char* supp) { head = s; s->type = stype; s->templ = (char*)internal_alloc(MBlockSuppression, end2 - line + 1); - REAL(memcpy)(s->templ, line, end2 - line); + internal_memcpy(s->templ, line, end2 - line); s->templ[end2 - line] = 0; } if (end[0] == 0) diff --git a/compiler-rt/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc b/compiler-rt/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc index 03dd51a6fb1..c5bed5d7d28 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc @@ -149,7 +149,7 @@ static SectionDesc *GetSectionDesc(uptr addr) { static ReportStack *NewFrame(uptr addr) { ReportStack *ent = (ReportStack*)internal_alloc(MBlockReportStack, sizeof(ReportStack)); - REAL(memset)(ent, 0, sizeof(*ent)); + internal_memset(ent, 0, sizeof(*ent)); ent->pc = addr; return ent; } @@ -181,12 +181,12 @@ ReportStack *SymbolizeCode(uptr addr) { char *pos = (char*)internal_strchr(func, '\n'); if (pos && func[0] != '?') { res->func = (char*)internal_alloc(MBlockReportStack, pos - func + 1); - REAL(memcpy)(res->func, func, pos - func); + internal_memcpy(res->func, func, pos - func); res->func[pos - func] = 0; char *pos2 = (char*)internal_strchr(pos, ':'); if (pos2) { res->file = (char*)internal_alloc(MBlockReportStack, pos2 - pos - 1 + 1); - REAL(memcpy)(res->file, pos + 1, pos2 - pos - 1); + internal_memcpy(res->file, pos + 1, pos2 - pos - 1); res->file[pos2 - pos - 1] = 0; res->line = atoi(pos2 + 1); } @@ -196,43 +196,6 @@ ReportStack *SymbolizeCode(uptr addr) { ReportStack *SymbolizeData(uptr addr) { return 0; - /* - if (base == 0) - base = GetImageBase(); - int res = 0; - InternalScopedBuf<char> cmd(1024); - internal_snprintf(cmd, cmd.Size(), - "nm -alC %s|grep \"%zx\"|awk '{printf(\"%%s\\n%%s\", $3, $4)}' > tsan.tmp2", - exe, (addr - base)); - if (system(cmd)) - return 0; - FILE* f3 = fopen("tsan.tmp2", "rb"); - if (f3) { - InternalScopedBuf<char> tmp(1024); - if (fread(tmp, 1, tmp.Size(), f3) <= 0) - return 0; - char *pos = strchr(tmp, '\n'); - if (pos && tmp[0] != '?') { - res = 1; - symb[0].module = 0; - symb[0].offset = addr; - symb[0].name = alloc->Alloc<char>(pos - tmp + 1); - REAL(memcpy)(symb[0].name, tmp, pos - tmp); - symb[0].name[pos - tmp] = 0; - symb[0].file = 0; - symb[0].line = 0; - char *pos2 = strchr(pos, ':'); - if (pos2) { - symb[0].file = alloc->Alloc<char>(pos2 - pos - 1 + 1); - REAL(memcpy)(symb[0].file, pos + 1, pos2 - pos - 1); - symb[0].file[pos2 - pos - 1] = 0; - symb[0].line = atoi(pos2 + 1); - } - } - fclose(f3); - } - return res; - */ } } // namespace __tsan diff --git a/compiler-rt/lib/tsan/rtl/tsan_vector.h b/compiler-rt/lib/tsan/rtl/tsan_vector.h index 9852d77b6bb..d41063df3de 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_vector.h +++ b/compiler-rt/lib/tsan/rtl/tsan_vector.h @@ -94,7 +94,7 @@ class Vector { cap = size; T *p = (T*)internal_alloc(typ_, cap * sizeof(T)); if (cap0) { - REAL(memcpy)(p, begin_, cap0 * sizeof(T)); + internal_memcpy(p, begin_, cap0 * sizeof(T)); internal_free(begin_); } begin_ = p; diff --git a/compiler-rt/lib/tsan/rtl_tests/tsan_test_util_linux.cc b/compiler-rt/lib/tsan/rtl_tests/tsan_test_util_linux.cc index d2c06b58cd0..35a7c481524 100644 --- a/compiler-rt/lib/tsan/rtl_tests/tsan_test_util_linux.cc +++ b/compiler-rt/lib/tsan/rtl_tests/tsan_test_util_linux.cc @@ -33,6 +33,9 @@ static __thread bool expect_report; static __thread bool expect_report_reported; static __thread ReportType expect_report_type; +extern "C" void *__interceptor_memcpy(void*, const void*, uptr); +extern "C" void *__interceptor_memset(void*, int, uptr); + static void *BeforeInitThread(void *param) { (void)param; return 0; @@ -298,10 +301,10 @@ void ScopedThread::Impl::HandleEvent(Event *ev) { static_cast<Mutex*>(ev->ptr)->ReadUnlock(); break; case Event::MEMCPY: - memcpy(ev->ptr, (void*)ev->arg, ev->arg2); + __interceptor_memcpy(ev->ptr, (void*)ev->arg, ev->arg2); break; case Event::MEMSET: - memset(ev->ptr, ev->arg, ev->arg2); + __interceptor_memset(ev->ptr, ev->arg, ev->arg2); break; default: CHECK(0); } diff --git a/compiler-rt/lib/tsan/unit_tests/tsan_platform_test.cc b/compiler-rt/lib/tsan/unit_tests/tsan_platform_test.cc index b9ff0d16017..64c4499fbea 100644 --- a/compiler-rt/lib/tsan/unit_tests/tsan_platform_test.cc +++ b/compiler-rt/lib/tsan/unit_tests/tsan_platform_test.cc @@ -79,7 +79,7 @@ TEST(Platform, FileOps) { EXPECT_EQ(len1, internal_read(fd, buf, len1)); EXPECT_EQ(0, internal_memcmp(buf, str1, len1)); EXPECT_EQ((char)0, buf[len1 + 1]); - REAL(memset)(buf, 0, len1); + internal_memset(buf, 0, len1); EXPECT_EQ(len2, internal_read(fd, buf, len2)); EXPECT_EQ(0, internal_memcmp(buf, str2, len2)); internal_close(fd); |