[llvm-commits] [compiler-rt] r169970 - in /compiler-rt/trunk/lib/tsan: lit_tests/fd_dup_norace.cc rtl/tsan_interceptors.cc rtl/tsan_mman.h rtl/tsan_stat.cc rtl/tsan_stat.h

Dmitry Vyukov dvyukov at google.com
Wed Dec 12 04:28:09 PST 2012


done


On Wed, Dec 12, 2012 at 4:08 PM, Alexey Samsonov <samsonov at google.com>wrote:

>
>
> On Wed, Dec 12, 2012 at 3:59 PM, Dmitry Vyukov <dvyukov at google.com> wrote:
>
> Author: dvyukov
>> Date: Wed Dec 12 05:59:30 2012
>> New Revision: 169970
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=169970&view=rev
>> Log:
>> tsan: more precise handling of IO synchronization
>>
>> Added:
>>     compiler-rt/trunk/lib/tsan/lit_tests/fd_dup_norace.cc
>> Modified:
>>     compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
>>     compiler-rt/trunk/lib/tsan/rtl/tsan_mman.h
>>     compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc
>>     compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h
>>
>> Added: compiler-rt/trunk/lib/tsan/lit_tests/fd_dup_norace.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/fd_dup_norace.cc?rev=169970&view=auto
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/lit_tests/fd_dup_norace.cc (added)
>> +++ compiler-rt/trunk/lib/tsan/lit_tests/fd_dup_norace.cc Wed Dec 12
>> 05:59:30 2012
>> @@ -0,0 +1,33 @@
>> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
>> +#include <pthread.h>
>> +#include <stdio.h>
>> +#include <unistd.h>
>> +#include <sys/types.h>
>> +#include <sys/stat.h>
>> +#include <fcntl.h>
>> +
>> +int fds[2];
>> +
>> +void *Thread1(void *x) {
>> +  char buf;
>> +  read(fds[0], &buf, 1);
>> +  close(fds[0]);
>> +  return 0;
>> +}
>> +
>> +void *Thread2(void *x) {
>> +  close(fds[1]);
>> +  return 0;
>> +}
>> +
>> +int main() {
>> +  fds[0] = open("/dev/random", O_RDONLY);
>> +  fds[1] = dup2(fds[0], 100);
>> +  pthread_t t[2];
>> +  pthread_create(&t[0], NULL, Thread1, NULL);
>> +  pthread_create(&t[1], NULL, Thread2, NULL);
>> +  pthread_join(t[0], NULL);
>> +  pthread_join(t[1], NULL);
>> +}
>> +
>> +// CHECK-NOT: WARNING: ThreadSanitizer: data race
>>
>> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=169970&r1=169969&r2=169970&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)
>> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Wed Dec 12
>> 05:59:30 2012
>> @@ -22,6 +22,7 @@
>>  #include "tsan_platform.h"
>>  #include "tsan_rtl.h"
>>  #include "tsan_mman.h"
>> +#include "tsan_fd.h"
>>
>
> svn add?
>
>
>>
>>  using namespace __tsan;  // NOLINT
>>
>> @@ -54,6 +55,7 @@
>>  extern "C" void _exit(int status);
>>  extern "C" int __cxa_atexit(void (*func)(void *arg), void *arg, void
>> *dso);
>>  extern "C" int *__errno_location();
>> +extern "C" int fileno(void *stream);
>>  const int PTHREAD_MUTEX_RECURSIVE = 1;
>>  const int PTHREAD_MUTEX_RECURSIVE_NP = 1;
>>  const int kPthreadAttrSize = 56;
>> @@ -128,10 +130,8 @@
>>    SignalContext *ctx = (SignalContext*)thr->signal_ctx;
>>    if (ctx == 0 && thr->is_alive) {
>>      ScopedInRtl in_rtl;
>> -    ctx = (SignalContext*)internal_alloc(
>> -        MBlockSignal, sizeof(*ctx));
>> -    MemoryResetRange(thr, 0, (uptr)ctx, sizeof(*ctx));
>> -    internal_memset(ctx, 0, sizeof(*ctx));
>> +    ctx = (SignalContext*)MmapOrDie(sizeof(*ctx), "SignalContext");
>> +    MemoryResetRange(thr, (uptr)&SigCtx, (uptr)ctx, sizeof(*ctx));
>>      thr->signal_ctx = ctx;
>>    }
>>    return ctx;
>> @@ -310,216 +310,6 @@
>>    Die();
>>  }
>>
>> -enum FdType {
>> -  FdGlobal,  // Something we don't know about, global sync.
>> -  FdNone,  // Does not require any sync.
>> -  FdFile,
>> -  FdSock,
>> -  FdPipe,
>> -  FdEvent,  // see eventfd()
>> -  FdPoll
>> -};
>> -
>> -struct FdDesc {
>> -  FdType type;
>> -  u64 sync;
>> -};
>> -
>> -struct FdContext {
>> -  static const int kMaxFds = 10 * 1024;  // Everything else is synced
>> globally.
>> -  FdDesc desc[kMaxFds];
>> -  // Addresses used for synchronization.
>> -  u64 fdglobal;
>> -  u64 fdfile;
>> -  u64 fdsock;
>> -  u64 fdpipe;
>> -  u64 fdpoll;
>> -  u64 fdevent;
>> -};
>> -
>> -static FdContext fdctx;
>> -
>> -static void FdInit() {
>> -  fdctx.desc[0].type = FdNone;
>> -  fdctx.desc[1].type = FdNone;
>> -  fdctx.desc[2].type = FdNone;
>> -}
>> -
>> -static void *FdAddr(int fd) {
>> -  if (fd >= FdContext::kMaxFds)
>> -    return &fdctx.fdglobal;
>> -  FdDesc *desc = &fdctx.desc[fd];
>> -  if (desc->type == FdNone)
>> -    return 0;
>> -  if (desc->type == FdGlobal)
>> -    return &fdctx.fdglobal;
>> -  if (desc->type == FdFile)
>> -    return &fdctx.fdfile;
>> -  if (desc->type == FdSock)
>> -    return &fdctx.fdsock;
>> -  if (desc->type == FdPipe)
>> -    return &fdctx.fdpipe;
>> -  if (desc->type == FdEvent)
>> -    return &fdctx.fdevent;
>> -  if (desc->type == FdPoll)
>> -    return &fdctx.fdpoll;
>> -  CHECK(0);
>> -  return 0;
>> -}
>> -
>> -static void FdAcquire(ThreadState *thr, uptr pc, int fd) {
>> -  void *addr = FdAddr(fd);
>> -  DPrintf("#%d: FdAcquire(%d) -> %p\n", thr->tid, fd, addr);
>> -  if (addr)
>> -    Acquire(thr, pc, (uptr)addr);
>> -  if (fd < FdContext::kMaxFds)
>> -    MemoryRead8Byte(thr, pc, (uptr)&fdctx.desc[fd].sync);
>> -}
>> -
>> -static void FdRelease(ThreadState *thr, uptr pc, int fd) {
>> -  void *addr = FdAddr(fd);
>> -  DPrintf("#%d: FdRelease(%d) -> %p\n", thr->tid, fd, addr);
>> -  if (addr)
>> -    Release(thr, pc, (uptr)addr);
>> -  if (fd < FdContext::kMaxFds)
>> -    MemoryRead8Byte(thr, pc, (uptr)&fdctx.desc[fd].sync);
>> -}
>> -
>> -static void FdClose(ThreadState *thr, uptr pc, int fd) {
>> -  if (fd >= FdContext::kMaxFds)
>> -    return;
>> -  FdDesc *desc = &fdctx.desc[fd];
>> -  SyncVar *s = CTX()->synctab.GetAndRemove(thr, pc, (uptr)&desc->sync);
>> -  if (s)
>> -    DestroyAndFree(s);
>> -  // FIXME(dvyukov): change to FdNone once we handle all fd operations.
>> -  desc->type = FdGlobal;
>> -  // To catch races between fd usage and close.
>> -  MemoryWrite8Byte(thr, pc, (uptr)&desc->sync);
>> -  // We need to clear it, because if we do not intercept any call out
>> there
>> -  // that creates fd, we will hit false postives.
>> -  MemoryResetRange(thr, pc, (uptr)&desc->sync, sizeof(desc->sync));
>> -}
>> -
>> -static void FdFileCreate(ThreadState *thr, uptr pc, int fd) {
>> -  if (fd >= FdContext::kMaxFds)
>> -    return;
>> -  FdDesc *desc = &fdctx.desc[fd];
>> -  desc->type = FdFile;
>> -  // To catch races between fd usage and open.
>> -  MemoryRangeImitateWrite(thr, pc, (uptr)&desc->sync,
>> sizeof(desc->sync));
>> -}
>> -
>> -static void FdDup(ThreadState *thr, uptr pc, int oldfd, int newfd) {
>> -  if (oldfd >= FdContext::kMaxFds || newfd >= FdContext::kMaxFds) {
>> -    if (oldfd < FdContext::kMaxFds) {
>> -      // FIXME(dvyukov): here we lose old sync object associated with
>> the fd,
>> -      // this can lead to false positives.
>> -      FdDesc *odesc = &fdctx.desc[oldfd];
>> -      odesc->type = FdGlobal;
>> -    }
>> -    if (newfd < FdContext::kMaxFds) {
>> -      FdClose(thr, pc, newfd);
>> -      FdDesc *ndesc = &fdctx.desc[newfd];
>> -      ndesc->type = FdGlobal;
>> -    }
>> -    return;
>> -  }
>> -
>> -  FdClose(thr, pc, newfd);
>> -  FdDesc *ndesc = &fdctx.desc[newfd];
>> -  ndesc->type = FdFile;
>> -  // To catch races between fd usage and open.
>> -  MemoryRangeImitateWrite(thr, pc, (uptr)&ndesc->sync,
>> sizeof(ndesc->sync));
>> -}
>> -
>> -static void FdPipeCreate(ThreadState *thr, uptr pc, int rfd, int wfd) {
>> -  if (rfd >= FdContext::kMaxFds || wfd >= FdContext::kMaxFds) {
>> -    if (rfd < FdContext::kMaxFds) {
>> -      FdDesc *rdesc = &fdctx.desc[rfd];
>> -      rdesc->type = FdGlobal;
>> -    }
>> -    if (wfd < FdContext::kMaxFds) {
>> -      FdDesc *wdesc = &fdctx.desc[wfd];
>> -      wdesc->type = FdGlobal;
>> -    }
>> -    return;
>> -  }
>> -
>> -  FdDesc *rdesc = &fdctx.desc[rfd];
>> -  rdesc->type = FdPipe;
>> -  // To catch races between fd usage and open.
>> -  MemoryRangeImitateWrite(thr, pc, (uptr)&rdesc->sync,
>> sizeof(rdesc->sync));
>> -
>> -  FdDesc *wdesc = &fdctx.desc[wfd];
>> -  wdesc->type = FdPipe;
>> -  // To catch races between fd usage and open.
>> -  MemoryRangeImitateWrite(thr, pc, (uptr)&wdesc->sync,
>> sizeof(rdesc->sync));
>> -
>> -  DPrintf("#%d: FdCreatePipe(%d, %d)\n", thr->tid, rfd, wfd);
>> -}
>> -
>> -static void FdEventCreate(ThreadState *thr, uptr pc, int fd) {
>> -  if (fd >= FdContext::kMaxFds)
>> -    return;
>> -  FdDesc *desc = &fdctx.desc[fd];
>> -  desc->type = FdEvent;
>> -  // To catch races between fd usage and open.
>> -  MemoryRangeImitateWrite(thr, pc, (uptr)&desc->sync,
>> sizeof(desc->sync));
>> -}
>> -
>> -static void FdPollCreate(ThreadState *thr, uptr pc, int fd) {
>> -  if (fd >= FdContext::kMaxFds)
>> -    return;
>> -  FdDesc *desc = &fdctx.desc[fd];
>> -  desc->type = FdPoll;
>> -  // To catch races between fd usage and open.
>> -  MemoryRangeImitateWrite(thr, pc, (uptr)&desc->sync,
>> sizeof(desc->sync));
>> -}
>> -
>> -static void FdSocketCreate(ThreadState *thr, uptr pc, int fd) {
>> -  if (fd >= FdContext::kMaxFds)
>> -    return;
>> -  FdDesc *desc = &fdctx.desc[fd];
>> -  // It can be UDP socket, let's assume they are not used for
>> synchronization.
>> -  desc->type = FdNone;
>> -  // To catch races between fd usage and open.
>> -  MemoryRangeImitateWrite(thr, pc, (uptr)&desc->sync,
>> sizeof(desc->sync));
>> -}
>> -
>> -static void FdSocketAccept(ThreadState *thr, uptr pc, int fd, int newfd)
>> {
>> -  if (fd < FdContext::kMaxFds) {
>> -    FdDesc *desc = &fdctx.desc[fd];
>> -    desc->type = FdNone;
>> -    MemoryRead8Byte(thr, pc, (uptr)&desc->sync);
>> -  }
>> -  if (newfd < FdContext::kMaxFds) {
>> -    FdDesc *desc = &fdctx.desc[newfd];
>> -    desc->type = FdSock;
>> -    MemoryWrite8Byte(thr, pc, (uptr)&desc->sync);
>> -  }
>> -}
>> -
>> -static void FdSocketConnect(ThreadState *thr, uptr pc, int fd) {
>> -  if (fd >= FdContext::kMaxFds)
>> -    return;
>> -  FdDesc *desc = &fdctx.desc[fd];
>> -  desc->type = FdSock;
>> -  MemoryWrite8Byte(thr, pc, (uptr)&desc->sync);
>> -}
>> -
>> -static uptr file2addr(char *path) {
>> -  (void)path;
>> -  static u64 addr;
>> -  return (uptr)&addr;
>> -}
>> -
>> -static uptr dir2addr(char *path) {
>> -  (void)path;
>> -  static u64 addr;
>> -  return (uptr)&addr;
>> -}
>> -
>>  TSAN_INTERCEPTOR(void*, malloc, uptr size) {
>>    void *p = 0;
>>    {
>> @@ -850,7 +640,7 @@
>>      SignalContext *sctx = thr->signal_ctx;
>>      if (sctx) {
>>        thr->signal_ctx = 0;
>> -      internal_free(sctx);
>> +      UnmapOrDie(sctx, sizeof(*sctx));
>>      }
>>    }
>>  }
>> @@ -1124,11 +914,13 @@
>>    return res;
>>  }
>>
>> +/*
>>  TSAN_INTERCEPTOR(int, pthread_cond_init, void *c, void *a) {
>>    SCOPED_TSAN_INTERCEPTOR(pthread_cond_init, c, a);
>>    int res = REAL(pthread_cond_init)(c, a);
>>    return res;
>>  }
>> +*/
>>
>>  TSAN_INTERCEPTOR(int, pthread_cond_destroy, void *c) {
>>    SCOPED_TSAN_INTERCEPTOR(pthread_cond_destroy, c);
>> @@ -1278,6 +1070,14 @@
>>    return fd;
>>  }
>>
>> +TSAN_INTERCEPTOR(int, open64, const char *name, int flags, int mode) {
>> +  SCOPED_TSAN_INTERCEPTOR(open64, name, flags, mode);
>> +  int fd = REAL(open64)(name, flags, mode);
>> +  if (fd >= 0)
>> +    FdFileCreate(thr, pc, fd);
>> +  return fd;
>> +}
>> +
>>  TSAN_INTERCEPTOR(int, creat, const char *name, int mode) {
>>    SCOPED_TSAN_INTERCEPTOR(creat, name, mode);
>>    int fd = REAL(creat)(name, mode);
>> @@ -1286,6 +1086,14 @@
>>    return fd;
>>  }
>>
>> +TSAN_INTERCEPTOR(int, creat64, const char *name, int mode) {
>> +  SCOPED_TSAN_INTERCEPTOR(creat64, name, mode);
>> +  int fd = REAL(creat64)(name, mode);
>> +  if (fd >= 0)
>> +    FdFileCreate(thr, pc, fd);
>> +  return fd;
>> +}
>> +
>>  TSAN_INTERCEPTOR(int, dup, int oldfd) {
>>    SCOPED_TSAN_INTERCEPTOR(dup, oldfd);
>>    int newfd = REAL(dup)(oldfd);
>> @@ -1368,10 +1176,18 @@
>>
>>  TSAN_INTERCEPTOR(int, close, int fd) {
>>    SCOPED_TSAN_INTERCEPTOR(close, fd);
>> -  FdClose(thr, pc, fd);
>> +  if (fd >= 0)
>> +    FdClose(thr, pc, fd);
>>    return REAL(close)(fd);
>>  }
>>
>> +TSAN_INTERCEPTOR(int, __close, int fd) {
>> +  SCOPED_TSAN_INTERCEPTOR(__close, fd);
>> +  if (fd >= 0)
>> +    FdClose(thr, pc, fd);
>> +  return REAL(__close)(fd);
>> +}
>> +
>>  TSAN_INTERCEPTOR(int, pipe, int *pipefd) {
>>    SCOPED_TSAN_INTERCEPTOR(pipe, pipefd);
>>    int res = REAL(pipe)(pipefd);
>> @@ -1502,7 +1318,7 @@
>>
>>  TSAN_INTERCEPTOR(int, unlink, char *path) {
>>    SCOPED_TSAN_INTERCEPTOR(unlink, path);
>> -  Release(thr, pc, file2addr(path));
>> +  Release(thr, pc, File2addr(path));
>>    int res = REAL(unlink)(path);
>>    return res;
>>  }
>> @@ -1510,7 +1326,40 @@
>>  TSAN_INTERCEPTOR(void*, fopen, char *path, char *mode) {
>>    SCOPED_TSAN_INTERCEPTOR(fopen, path, mode);
>>    void *res = REAL(fopen)(path, mode);
>> -  Acquire(thr, pc, file2addr(path));
>> +  Acquire(thr, pc, File2addr(path));
>> +  if (res) {
>> +    int fd = fileno(res);
>> +    if (fd >= 0)
>> +      FdFileCreate(thr, pc, fd);
>> +  }
>> +  return res;
>> +}
>> +
>> +TSAN_INTERCEPTOR(void*, freopen, char *path, char *mode, void *stream) {
>> +  SCOPED_TSAN_INTERCEPTOR(freopen, path, mode, stream);
>> +  if (stream) {
>> +    int fd = fileno(stream);
>> +    if (fd >= 0)
>> +      FdClose(thr, pc, fd);
>> +  }
>> +  void *res = REAL(freopen)(path, mode, stream);
>> +  Acquire(thr, pc, File2addr(path));
>> +  if (res) {
>> +    int fd = fileno(res);
>> +    if (fd >= 0)
>> +      FdFileCreate(thr, pc, fd);
>> +  }
>> +  return res;
>> +}
>> +
>> +TSAN_INTERCEPTOR(int, fclose, void *stream) {
>> +  SCOPED_TSAN_INTERCEPTOR(fclose, stream);
>> +  if (stream) {
>> +    int fd = fileno(stream);
>> +    if (fd >= 0)
>> +      FdClose(thr, pc, fd);
>> +  }
>> +  int res = REAL(fclose)(stream);
>>    return res;
>>  }
>>
>> @@ -1534,7 +1383,7 @@
>>
>>  TSAN_INTERCEPTOR(int, rmdir, char *path) {
>>    SCOPED_TSAN_INTERCEPTOR(rmdir, path);
>> -  Release(thr, pc, dir2addr(path));
>> +  Release(thr, pc, Dir2addr(path));
>>    int res = REAL(rmdir)(path);
>>    return res;
>>  }
>> @@ -1542,7 +1391,8 @@
>>  TSAN_INTERCEPTOR(void*, opendir, char *path) {
>>    SCOPED_TSAN_INTERCEPTOR(opendir, path);
>>    void *res = REAL(opendir)(path);
>> -  Acquire(thr, pc, dir2addr(path));
>> +  if (res != 0)
>> +    Acquire(thr, pc, Dir2addr(path));
>>    return res;
>>  }
>>
>> @@ -1853,7 +1703,7 @@
>>    TSAN_INTERCEPT(pthread_rwlock_timedwrlock);
>>    TSAN_INTERCEPT(pthread_rwlock_unlock);
>>
>> -  TSAN_INTERCEPT(pthread_cond_init);
>> +  // TSAN_INTERCEPT(pthread_cond_init);
>>    TSAN_INTERCEPT(pthread_cond_destroy);
>>    TSAN_INTERCEPT(pthread_cond_signal);
>>    TSAN_INTERCEPT(pthread_cond_broadcast);
>> @@ -1875,7 +1725,9 @@
>>    TSAN_INTERCEPT(sem_getvalue);
>>
>>    TSAN_INTERCEPT(open);
>> +  TSAN_INTERCEPT(open64);
>>    TSAN_INTERCEPT(creat);
>> +  TSAN_INTERCEPT(creat64);
>>    TSAN_INTERCEPT(dup);
>>    TSAN_INTERCEPT(dup2);
>>    TSAN_INTERCEPT(dup3);
>> @@ -1907,6 +1759,8 @@
>>
>>    TSAN_INTERCEPT(unlink);
>>    TSAN_INTERCEPT(fopen);
>> +  TSAN_INTERCEPT(freopen);
>> +  TSAN_INTERCEPT(fclose);
>>    TSAN_INTERCEPT(fread);
>>    TSAN_INTERCEPT(fwrite);
>>    TSAN_INTERCEPT(puts);
>>
>> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_mman.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_mman.h?rev=169970&r1=169969&r2=169970&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/rtl/tsan_mman.h (original)
>> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_mman.h Wed Dec 12 05:59:30 2012
>> @@ -59,6 +59,7 @@
>>    MBlockSuppression,
>>    MBlockExpectRace,
>>    MBlockSignal,
>> +  MBlockFD,
>>
>>    // This must be the last.
>>    MBlockTypeCount
>>
>> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc?rev=169970&r1=169969&r2=169970&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc (original)
>> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc Wed Dec 12 05:59:30 2012
>> @@ -182,7 +182,9 @@
>>    name[StatInt_sem_post]                 = "  sem_post
>>      ";
>>    name[StatInt_sem_getvalue]             = "  sem_getvalue
>>      ";
>>    name[StatInt_open]                     = "  open
>>      ";
>> +  name[StatInt_open64]                   = "  open64
>>      ";
>>    name[StatInt_creat]                    = "  creat
>>       ";
>> +  name[StatInt_creat64]                  = "  creat64
>>       ";
>>    name[StatInt_dup]                      = "  dup
>>       ";
>>    name[StatInt_dup2]                     = "  dup2
>>      ";
>>    name[StatInt_dup3]                     = "  dup3
>>      ";
>> @@ -194,6 +196,7 @@
>>    name[StatInt_epoll_create]             = "  epoll_create
>>      ";
>>    name[StatInt_epoll_create1]            = "  epoll_create1
>>       ";
>>    name[StatInt_close]                    = "  close
>>       ";
>> +  name[StatInt___close]                  = "  __close
>>       ";
>>    name[StatInt_pipe]                     = "  pipe
>>      ";
>>    name[StatInt_pipe2]                    = "  pipe2
>>       ";
>>    name[StatInt_read]                     = "  read
>>      ";
>> @@ -212,6 +215,8 @@
>>    name[StatInt_recvmsg]                  = "  recvmsg
>>       ";
>>    name[StatInt_unlink]                   = "  unlink
>>      ";
>>    name[StatInt_fopen]                    = "  fopen
>>       ";
>> +  name[StatInt_freopen]                  = "  freopen
>>       ";
>> +  name[StatInt_fclose]                   = "  fclose
>>      ";
>>    name[StatInt_fread]                    = "  fread
>>       ";
>>    name[StatInt_fwrite]                   = "  fwrite
>>      ";
>>    name[StatInt_puts]                     = "  puts
>>      ";
>>
>> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h?rev=169970&r1=169969&r2=169970&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h (original)
>> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h Wed Dec 12 05:59:30 2012
>> @@ -177,7 +177,9 @@
>>    StatInt_sem_post,
>>    StatInt_sem_getvalue,
>>    StatInt_open,
>> +  StatInt_open64,
>>    StatInt_creat,
>> +  StatInt_creat64,
>>    StatInt_dup,
>>    StatInt_dup2,
>>    StatInt_dup3,
>> @@ -189,6 +191,7 @@
>>    StatInt_epoll_create,
>>    StatInt_epoll_create1,
>>    StatInt_close,
>> +  StatInt___close,
>>    StatInt_pipe,
>>    StatInt_pipe2,
>>    StatInt_read,
>> @@ -207,6 +210,8 @@
>>    StatInt_recvmsg,
>>    StatInt_unlink,
>>    StatInt_fopen,
>> +  StatInt_freopen,
>> +  StatInt_fclose,
>>    StatInt_fread,
>>    StatInt_fwrite,
>>    StatInt_puts,
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
>
> --
> Alexey Samsonov, MSK
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121212/f03f01d2/attachment.html>


More information about the llvm-commits mailing list