diff options
| author | Alexey Samsonov <vonosmas@gmail.com> | 2015-12-10 19:24:27 +0000 | 
|---|---|---|
| committer | Alexey Samsonov <vonosmas@gmail.com> | 2015-12-10 19:24:27 +0000 | 
| commit | c63c0d1cc091a17ae734022edd46566b8bd525b5 (patch) | |
| tree | dde4f4bc11062d9bcbbd79493dad18fd386dfae0 | |
| parent | 843c7b43090dab4879e6a39a94ccad17c835a545 (diff) | |
| download | bcm5719-llvm-c63c0d1cc091a17ae734022edd46566b8bd525b5.tar.gz bcm5719-llvm-c63c0d1cc091a17ae734022edd46566b8bd525b5.zip  | |
[TSan] Try harder to avoid compiler-generated memcpy calls.
check_memcpy test added in r254959 fails on some configurations due to
memcpy() calls inserted by Clang. Try harder to avoid them by using
internal_memcpy() where applicable.
llvm-svn: 255287
| -rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc | 17 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_interceptors.cc | 2 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_symbolize.cc | 2 | 
3 files changed, 11 insertions, 10 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc index 6d786def517..28f78f057d0 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -1691,16 +1691,19 @@ static int wrapped_gl_stat(const char *s, void *st) {    return pglob_copy->gl_stat(s, st);  } +static const __sanitizer_glob_t kGlobCopy = { +      0,                  0,                   0, +      0,                  wrapped_gl_closedir, wrapped_gl_readdir, +      wrapped_gl_opendir, wrapped_gl_lstat,    wrapped_gl_stat}; +  INTERCEPTOR(int, glob, const char *pattern, int flags,              int (*errfunc)(const char *epath, int eerrno),              __sanitizer_glob_t *pglob) {    void *ctx;    COMMON_INTERCEPTOR_ENTER(ctx, glob, pattern, flags, errfunc, pglob);    COMMON_INTERCEPTOR_READ_STRING(ctx, pattern, 0); -  __sanitizer_glob_t glob_copy = { -      0,                  0,                   0, -      0,                  wrapped_gl_closedir, wrapped_gl_readdir, -      wrapped_gl_opendir, wrapped_gl_lstat,    wrapped_gl_stat}; +  __sanitizer_glob_t glob_copy; +  internal_memcpy(&glob_copy, &kGlobCopy, sizeof(glob_copy));    if (flags & glob_altdirfunc) {      Swap(pglob->gl_closedir, glob_copy.gl_closedir);      Swap(pglob->gl_readdir, glob_copy.gl_readdir); @@ -1728,10 +1731,8 @@ INTERCEPTOR(int, glob64, const char *pattern, int flags,    void *ctx;    COMMON_INTERCEPTOR_ENTER(ctx, glob64, pattern, flags, errfunc, pglob);    COMMON_INTERCEPTOR_READ_STRING(ctx, pattern, 0); -  __sanitizer_glob_t glob_copy = { -      0,                  0,                   0, -      0,                  wrapped_gl_closedir, wrapped_gl_readdir, -      wrapped_gl_opendir, wrapped_gl_lstat,    wrapped_gl_stat}; +  __sanitizer_glob_t glob_copy; +  internal_memcpy(&glob_copy, &kGlobCopy, sizeof(glob_copy));    if (flags & glob_altdirfunc) {      Swap(pglob->gl_closedir, glob_copy.gl_closedir);      Swap(pglob->gl_readdir, glob_copy.gl_readdir); diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc index 44c5e6359d8..b157de21a78 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc @@ -444,7 +444,7 @@ static void JmpBufGarbageCollect(ThreadState *thr, uptr sp) {      JmpBuf *buf = &thr->jmp_bufs[i];      if (buf->sp <= sp) {        uptr sz = thr->jmp_bufs.Size(); -      thr->jmp_bufs[i] = thr->jmp_bufs[sz - 1]; +      internal_memcpy(buf, &thr->jmp_bufs[sz - 1], sizeof(*buf));        thr->jmp_bufs.PopBack();        i--;      } diff --git a/compiler-rt/lib/tsan/rtl/tsan_symbolize.cc b/compiler-rt/lib/tsan/rtl/tsan_symbolize.cc index 51a5d00d37e..b2423951795 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_symbolize.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_symbolize.cc @@ -71,7 +71,7 @@ ReportLocation *SymbolizeData(uptr addr) {    if (!Symbolizer::GetOrInit()->SymbolizeData(addr, &info))      return 0;    ReportLocation *ent = ReportLocation::New(ReportLocationGlobal); -  ent->global = info; +  internal_memcpy(&ent->global, &info, sizeof(info));    return ent;  }  | 

