[llvm-commits] [compiler-rt] r164022 - in /compiler-rt/trunk/lib/tsan: ./ lit_tests/ lit_tests/Unit/ rtl_tests/ tests/ tests/rtl/ tests/unit/ unit_tests/

Alexey Samsonov samsonov at google.com
Mon Sep 17 03:02:18 PDT 2012


Author: samsonov
Date: Mon Sep 17 05:02:17 2012
New Revision: 164022

URL: http://llvm.org/viewvc/llvm-project?rev=164022&view=rev
Log:
[TSan] move: rtl_tests->tests/rtl unit_tests->tests/unit to make a single root for gtest-based tests. Support running these tests from lit via check-tsan command.

Added:
    compiler-rt/trunk/lib/tsan/lit_tests/
    compiler-rt/trunk/lib/tsan/lit_tests/CMakeLists.txt
    compiler-rt/trunk/lib/tsan/lit_tests/Unit/
    compiler-rt/trunk/lib/tsan/lit_tests/Unit/lit.cfg
    compiler-rt/trunk/lib/tsan/lit_tests/Unit/lit.site.cfg.in
    compiler-rt/trunk/lib/tsan/tests/
    compiler-rt/trunk/lib/tsan/tests/CMakeLists.txt
    compiler-rt/trunk/lib/tsan/tests/rtl/
    compiler-rt/trunk/lib/tsan/tests/rtl/CMakeLists.txt
    compiler-rt/trunk/lib/tsan/tests/rtl/tsan_bench.cc
    compiler-rt/trunk/lib/tsan/tests/rtl/tsan_mop.cc
    compiler-rt/trunk/lib/tsan/tests/rtl/tsan_mutex.cc
    compiler-rt/trunk/lib/tsan/tests/rtl/tsan_posix.cc
    compiler-rt/trunk/lib/tsan/tests/rtl/tsan_string.cc
    compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test.cc
    compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test_util.h
    compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test_util_linux.cc
    compiler-rt/trunk/lib/tsan/tests/rtl/tsan_thread.cc
    compiler-rt/trunk/lib/tsan/tests/unit/
    compiler-rt/trunk/lib/tsan/tests/unit/CMakeLists.txt
    compiler-rt/trunk/lib/tsan/tests/unit/tsan_clock_test.cc
    compiler-rt/trunk/lib/tsan/tests/unit/tsan_flags_test.cc
    compiler-rt/trunk/lib/tsan/tests/unit/tsan_mman_test.cc
    compiler-rt/trunk/lib/tsan/tests/unit/tsan_mutex_test.cc
    compiler-rt/trunk/lib/tsan/tests/unit/tsan_platform_test.cc
    compiler-rt/trunk/lib/tsan/tests/unit/tsan_printf_test.cc
    compiler-rt/trunk/lib/tsan/tests/unit/tsan_shadow_test.cc
    compiler-rt/trunk/lib/tsan/tests/unit/tsan_stack_test.cc
    compiler-rt/trunk/lib/tsan/tests/unit/tsan_suppressions_test.cc
    compiler-rt/trunk/lib/tsan/tests/unit/tsan_sync_test.cc
    compiler-rt/trunk/lib/tsan/tests/unit/tsan_vector_test.cc
Removed:
    compiler-rt/trunk/lib/tsan/rtl_tests/CMakeLists.txt
    compiler-rt/trunk/lib/tsan/rtl_tests/tsan_bench.cc
    compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mop.cc
    compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mutex.cc
    compiler-rt/trunk/lib/tsan/rtl_tests/tsan_posix.cc
    compiler-rt/trunk/lib/tsan/rtl_tests/tsan_string.cc
    compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test.cc
    compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util.h
    compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util_linux.cc
    compiler-rt/trunk/lib/tsan/rtl_tests/tsan_thread.cc
    compiler-rt/trunk/lib/tsan/unit_tests/CMakeLists.txt
    compiler-rt/trunk/lib/tsan/unit_tests/tsan_clock_test.cc
    compiler-rt/trunk/lib/tsan/unit_tests/tsan_flags_test.cc
    compiler-rt/trunk/lib/tsan/unit_tests/tsan_mman_test.cc
    compiler-rt/trunk/lib/tsan/unit_tests/tsan_mutex_test.cc
    compiler-rt/trunk/lib/tsan/unit_tests/tsan_platform_test.cc
    compiler-rt/trunk/lib/tsan/unit_tests/tsan_printf_test.cc
    compiler-rt/trunk/lib/tsan/unit_tests/tsan_shadow_test.cc
    compiler-rt/trunk/lib/tsan/unit_tests/tsan_stack_test.cc
    compiler-rt/trunk/lib/tsan/unit_tests/tsan_suppressions_test.cc
    compiler-rt/trunk/lib/tsan/unit_tests/tsan_sync_test.cc
    compiler-rt/trunk/lib/tsan/unit_tests/tsan_vector_test.cc
Modified:
    compiler-rt/trunk/lib/tsan/CMakeLists.txt
    compiler-rt/trunk/lib/tsan/Makefile.old

Modified: compiler-rt/trunk/lib/tsan/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/CMakeLists.txt?rev=164022&r1=164021&r2=164022&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/CMakeLists.txt (original)
+++ compiler-rt/trunk/lib/tsan/CMakeLists.txt Mon Sep 17 05:02:17 2012
@@ -17,31 +17,6 @@
 add_subdirectory(rtl)
 
 if(LLVM_INCLUDE_TESTS)
-  add_custom_target(TsanUnitTests)
-  set_target_properties(TsanUnitTests PROPERTIES
-    FOLDER "TSan unittests")
-
-  function(add_tsan_unittest testname)
-    # Build unit tests only on 64-bit Linux.
-    if(UNIX AND NOT APPLE
-            AND CAN_TARGET_X86_64
-            AND CMAKE_SIZEOF_VOID_P EQUAL 8
-            AND NOT LLVM_BUILD_32_BITS)
-      add_unittest(TsanUnitTests ${testname} ${ARGN})
-      # Link with TSan runtime.
-      target_link_libraries(${testname} clang_rt.tsan-x86_64)
-      # Build tests with PIE and debug info.
-      set_property(TARGET ${testname} APPEND_STRING
-        PROPERTY COMPILE_FLAGS " -fPIE -g")
-      set_property(TARGET ${testname} APPEND_STRING
-        PROPERTY LINK_FLAGS " -pie")
-    endif()
-  endfunction()
-
-  include_directories(rtl)
-  # There are two groups of unit tests: rtl_tests and unit_tests.
-  add_subdirectory(rtl_tests)
-  add_subdirectory(unit_tests)
+  add_subdirectory(tests)
 endif()
-
-# FIXME: Support TSan runtime tests, unit tests and output tests.
+add_subdirectory(lit_tests)

Modified: compiler-rt/trunk/lib/tsan/Makefile.old
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/Makefile.old?rev=164022&r1=164021&r2=164022&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/Makefile.old (original)
+++ compiler-rt/trunk/lib/tsan/Makefile.old Mon Sep 17 05:02:17 2012
@@ -19,9 +19,9 @@
 
 SANITIZER_COMMON_TESTS_SRC=$(wildcard ../sanitizer_common/tests/*_test.cc)
 SANITIZER_COMMON_TESTS_OBJ=$(patsubst %.cc,%.o,$(SANITIZER_COMMON_TESTS_SRC))
-RTL_TEST_SRC=$(wildcard rtl_tests/*.cc)
+RTL_TEST_SRC=$(wildcard tests/rtl/*.cc)
 RTL_TEST_OBJ=$(patsubst %.cc,%.o,$(RTL_TEST_SRC))
-UNIT_TEST_SRC=$(wildcard unit_tests/*_test.cc)
+UNIT_TEST_SRC=$(wildcard tests/unit/*_test.cc)
 UNIT_TEST_OBJ=$(patsubst %.cc,%.o,$(UNIT_TEST_SRC))
 UNIT_TEST_HDR=$(wildcard rtl/*.h) $(wildcard ../sanitizer_common/*.h)
 

Added: compiler-rt/trunk/lib/tsan/lit_tests/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/CMakeLists.txt?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/lit_tests/CMakeLists.txt (added)
+++ compiler-rt/trunk/lib/tsan/lit_tests/CMakeLists.txt Mon Sep 17 05:02:17 2012
@@ -0,0 +1,12 @@
+configure_lit_site_cfg(
+  ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.site.cfg.in
+  ${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg
+  )
+
+# Run TSan unit tests.
+if(LLVM_INCLUDE_TESTS)
+  add_lit_testsuite(check-tsan "Running ThreadSanitizer tests"
+    ${CMAKE_CURRENT_BINARY_DIR}/Unit
+    DEPENDS TsanUnitTests)
+  set_target_properties(check-tsan PROPERTIES FOLDER "TSan unittests")
+endif()

Added: compiler-rt/trunk/lib/tsan/lit_tests/Unit/lit.cfg
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/Unit/lit.cfg?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/lit_tests/Unit/lit.cfg (added)
+++ compiler-rt/trunk/lib/tsan/lit_tests/Unit/lit.cfg Mon Sep 17 05:02:17 2012
@@ -0,0 +1,29 @@
+# -*- Python -*-
+
+import os
+
+def get_required_attr(config, attr_name):
+  attr_value = getattr(config, attr_name, None)
+  if not attr_value:
+    lit.fatal("No attribute %r in test configuration! You may need to run "
+              "tests from your build directory or add this attribute "
+              "to lit.site.cfg " % attr_name)
+  return attr_value
+
+# Setup attributes common for all compiler-rt projects.
+llvm_src_root = get_required_attr(config, 'llvm_src_root')
+compiler_rt_lit_unit_cfg = os.path.join(llvm_src_root, "projects",
+                                        "compiler-rt", "lib",
+                                        "lit.common.unit.cfg")
+lit.load_config(config, compiler_rt_lit_unit_cfg)
+
+# Setup config name.
+config.name = 'ThreadSanitizer-Unit'
+
+# Setup test source and exec root. For unit tests, we define
+# it as build directory with TSan unit tests.
+llvm_obj_root = get_required_attr(config, "llvm_obj_root")
+config.test_exec_root = os.path.join(llvm_obj_root, "projects",
+                                     "compiler-rt", "lib",
+                                     "tsan", "tests")
+config.test_source_root = config.test_exec_root

Added: compiler-rt/trunk/lib/tsan/lit_tests/Unit/lit.site.cfg.in
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/Unit/lit.site.cfg.in?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/lit_tests/Unit/lit.site.cfg.in (added)
+++ compiler-rt/trunk/lib/tsan/lit_tests/Unit/lit.site.cfg.in Mon Sep 17 05:02:17 2012
@@ -0,0 +1,9 @@
+## Autogenerated by LLVM/Clang configuration.
+# Do not edit!
+
+config.build_type = "@CMAKE_BUILD_TYPE@"
+config.llvm_obj_root = "@LLVM_BINARY_DIR@"
+config.llvm_src_root = "@LLVM_SOURCE_DIR@"
+
+# Let the main config do the real work.
+lit.load_config(config, "@CMAKE_CURRENT_SOURCE_DIR@/Unit/lit.cfg")

Removed: compiler-rt/trunk/lib/tsan/rtl_tests/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/CMakeLists.txt?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl_tests/CMakeLists.txt (original)
+++ compiler-rt/trunk/lib/tsan/rtl_tests/CMakeLists.txt (removed)
@@ -1,15 +0,0 @@
-set(TSAN_RTL_TESTS
-  tsan_bench.cc
-  tsan_mop.cc
-  tsan_mutex.cc
-  tsan_posix.cc
-  tsan_string.cc
-  tsan_test.cc
-  tsan_thread.cc
-  )
-
-if(UNIX AND NOT APPLE)
-  list(APPEND TSAN_RTL_TESTS tsan_test_util_linux.cc)
-endif()
-
-add_tsan_unittest(TsanRtlTest ${TSAN_RTL_TESTS})

Removed: compiler-rt/trunk/lib/tsan/rtl_tests/tsan_bench.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_bench.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl_tests/tsan_bench.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl_tests/tsan_bench.cc (removed)
@@ -1,105 +0,0 @@
-//===-- tsan_bench.cc -----------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_test_util.h"
-#include "tsan_interface.h"
-#include "tsan_defs.h"
-#include "gtest/gtest.h"
-#include <stdint.h>
-
-const int kSize = 128;
-const int kRepeat = 2*1024*1024;
-
-void noinstr(void *p) {}
-
-template<typename T, void(*__tsan_mop)(void *p)>
-static void Benchmark() {
-  volatile T data[kSize];
-  for (int i = 0; i < kRepeat; i++) {
-    for (int j = 0; j < kSize; j++) {
-      __tsan_mop((void*)&data[j]);
-      data[j]++;
-    }
-  }
-}
-
-TEST(DISABLED_BENCH, Mop1) {
-  Benchmark<uint8_t, noinstr>();
-}
-
-TEST(DISABLED_BENCH, Mop1Read) {
-  Benchmark<uint8_t, __tsan_read1>();
-}
-
-TEST(DISABLED_BENCH, Mop1Write) {
-  Benchmark<uint8_t, __tsan_write1>();
-}
-
-TEST(DISABLED_BENCH, Mop2) {
-  Benchmark<uint16_t, noinstr>();
-}
-
-TEST(DISABLED_BENCH, Mop2Read) {
-  Benchmark<uint16_t, __tsan_read2>();
-}
-
-TEST(DISABLED_BENCH, Mop2Write) {
-  Benchmark<uint16_t, __tsan_write2>();
-}
-
-TEST(DISABLED_BENCH, Mop4) {
-  Benchmark<uint32_t, noinstr>();
-}
-
-TEST(DISABLED_BENCH, Mop4Read) {
-  Benchmark<uint32_t, __tsan_read4>();
-}
-
-TEST(DISABLED_BENCH, Mop4Write) {
-  Benchmark<uint32_t, __tsan_write4>();
-}
-
-TEST(DISABLED_BENCH, Mop8) {
-  Benchmark<uint8_t, noinstr>();
-}
-
-TEST(DISABLED_BENCH, Mop8Read) {
-  Benchmark<uint64_t, __tsan_read8>();
-}
-
-TEST(DISABLED_BENCH, Mop8Write) {
-  Benchmark<uint64_t, __tsan_write8>();
-}
-
-TEST(DISABLED_BENCH, FuncCall) {
-  for (int i = 0; i < kRepeat; i++) {
-    for (int j = 0; j < kSize; j++)
-      __tsan_func_entry((void*)(uintptr_t)j);
-    for (int j = 0; j < kSize; j++)
-      __tsan_func_exit();
-  }
-}
-
-TEST(DISABLED_BENCH, MutexLocal) {
-  Mutex m;
-  ScopedThread().Create(m);
-  for (int i = 0; i < 50; i++) {
-    ScopedThread t;
-    t.Lock(m);
-    t.Unlock(m);
-  }
-  for (int i = 0; i < 16*1024*1024; i++) {
-    m.Lock();
-    m.Unlock();
-  }
-  ScopedThread().Destroy(m);
-}

Removed: compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mop.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mop.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mop.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mop.cc (removed)
@@ -1,233 +0,0 @@
-//===-- tsan_mop.cc -------------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_interface.h"
-#include "tsan_test_util.h"
-#include "gtest/gtest.h"
-#include <stddef.h>
-#include <stdint.h>
-
-TEST(ThreadSanitizer, SimpleWrite) {
-  ScopedThread t;
-  MemLoc l;
-  t.Write1(l);
-}
-
-TEST(ThreadSanitizer, SimpleWriteWrite) {
-  ScopedThread t1, t2;
-  MemLoc l1, l2;
-  t1.Write1(l1);
-  t2.Write1(l2);
-}
-
-TEST(ThreadSanitizer, WriteWriteRace) {
-  ScopedThread t1, t2;
-  MemLoc l;
-  t1.Write1(l);
-  t2.Write1(l, true);
-}
-
-TEST(ThreadSanitizer, ReadWriteRace) {
-  ScopedThread t1, t2;
-  MemLoc l;
-  t1.Read1(l);
-  t2.Write1(l, true);
-}
-
-TEST(ThreadSanitizer, WriteReadRace) {
-  ScopedThread t1, t2;
-  MemLoc l;
-  t1.Write1(l);
-  t2.Read1(l, true);
-}
-
-TEST(ThreadSanitizer, ReadReadNoRace) {
-  ScopedThread t1, t2;
-  MemLoc l;
-  t1.Read1(l);
-  t2.Read1(l);
-}
-
-TEST(ThreadSanitizer, WriteThenRead) {
-  MemLoc l;
-  ScopedThread t1, t2;
-  t1.Write1(l);
-  t1.Read1(l);
-  t2.Read1(l, true);
-}
-
-TEST(ThreadSanitizer, WriteThenLockedRead) {
-  Mutex m(Mutex::RW);
-  MainThread t0;
-  t0.Create(m);
-  MemLoc l;
-  {
-    ScopedThread t1, t2;
-
-    t1.Write8(l);
-
-    t1.Lock(m);
-    t1.Read8(l);
-    t1.Unlock(m);
-
-    t2.Read8(l, true);
-  }
-  t0.Destroy(m);
-}
-
-TEST(ThreadSanitizer, LockedWriteThenRead) {
-  Mutex m(Mutex::RW);
-  MainThread t0;
-  t0.Create(m);
-  MemLoc l;
-  {
-    ScopedThread t1, t2;
-
-    t1.Lock(m);
-    t1.Write8(l);
-    t1.Unlock(m);
-
-    t1.Read8(l);
-
-    t2.Read8(l, true);
-  }
-  t0.Destroy(m);
-}
-
-
-TEST(ThreadSanitizer, RaceWithOffset) {
-  ScopedThread t1, t2;
-  {
-    MemLoc l;
-    t1.Access(l.loc(), true, 8, false);
-    t2.Access((char*)l.loc() + 4, true, 4, true);
-  }
-  {
-    MemLoc l;
-    t1.Access(l.loc(), true, 8, false);
-    t2.Access((char*)l.loc() + 7, true, 1, true);
-  }
-  {
-    MemLoc l;
-    t1.Access((char*)l.loc() + 4, true, 4, false);
-    t2.Access((char*)l.loc() + 4, true, 2, true);
-  }
-  {
-    MemLoc l;
-    t1.Access((char*)l.loc() + 4, true, 4, false);
-    t2.Access((char*)l.loc() + 6, true, 2, true);
-  }
-  {
-    MemLoc l;
-    t1.Access((char*)l.loc() + 3, true, 2, false);
-    t2.Access((char*)l.loc() + 4, true, 1, true);
-  }
-  {
-    MemLoc l;
-    t1.Access((char*)l.loc() + 1, true, 8, false);
-    t2.Access((char*)l.loc() + 3, true, 1, true);
-  }
-}
-
-TEST(ThreadSanitizer, RaceWithOffset2) {
-  ScopedThread t1, t2;
-  {
-    MemLoc l;
-    t1.Access((char*)l.loc(), true, 4, false);
-    t2.Access((char*)l.loc() + 2, true, 1, true);
-  }
-  {
-    MemLoc l;
-    t1.Access((char*)l.loc() + 2, true, 1, false);
-    t2.Access((char*)l.loc(), true, 4, true);
-  }
-}
-
-TEST(ThreadSanitizer, NoRaceWithOffset) {
-  ScopedThread t1, t2;
-  {
-    MemLoc l;
-    t1.Access(l.loc(), true, 4, false);
-    t2.Access((char*)l.loc() + 4, true, 4, false);
-  }
-  {
-    MemLoc l;
-    t1.Access((char*)l.loc() + 3, true, 2, false);
-    t2.Access((char*)l.loc() + 1, true, 2, false);
-    t2.Access((char*)l.loc() + 5, true, 2, false);
-  }
-}
-
-TEST(ThreadSanitizer, RaceWithDeadThread) {
-  MemLoc l;
-  ScopedThread t;
-  ScopedThread().Write1(l);
-  t.Write1(l, true);
-}
-
-TEST(ThreadSanitizer, BenignRaceOnVptr) {
-  void *vptr_storage;
-  MemLoc vptr(&vptr_storage), val;
-  vptr_storage = val.loc();
-  ScopedThread t1, t2;
-  t1.VptrUpdate(vptr, val);
-  t2.Read8(vptr);
-}
-
-TEST(ThreadSanitizer, HarmfulRaceOnVptr) {
-  void *vptr_storage;
-  MemLoc vptr(&vptr_storage), val1, val2;
-  vptr_storage = val1.loc();
-  ScopedThread t1, t2;
-  t1.VptrUpdate(vptr, val2);
-  t2.Read8(vptr, true);
-}
-
-static void foo() {
-  volatile int x = 42;
-  int x2 = x;
-  (void)x2;
-}
-
-static void bar() {
-  volatile int x = 43;
-  int x2 = x;
-  (void)x2;
-}
-
-TEST(ThreadSanitizer, ReportDeadThread) {
-  MemLoc l;
-  ScopedThread t1;
-  {
-    ScopedThread t2;
-    t2.Call(&foo);
-    t2.Call(&bar);
-    t2.Write1(l);
-  }
-  t1.Write1(l, true);
-}
-
-struct ClassWithStatic {
-  static int Data[4];
-};
-
-int ClassWithStatic::Data[4];
-
-static void foobarbaz() {}
-
-TEST(ThreadSanitizer, ReportRace) {
-  ScopedThread t1;
-  MainThread().Access(&ClassWithStatic::Data, true, 4, false);
-  t1.Call(&foobarbaz);
-  t1.Access(&ClassWithStatic::Data, true, 2, true);
-  t1.Return();
-}

Removed: compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mutex.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mutex.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mutex.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mutex.cc (removed)
@@ -1,221 +0,0 @@
-//===-- tsan_mutex.cc -----------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "sanitizer_common/sanitizer_atomic.h"
-#include "tsan_interface.h"
-#include "tsan_interface_ann.h"
-#include "tsan_test_util.h"
-#include "gtest/gtest.h"
-#include <stdint.h>
-
-namespace __tsan {
-
-TEST(ThreadSanitizer, BasicMutex) {
-  ScopedThread t;
-  Mutex m;
-  t.Create(m);
-
-  t.Lock(m);
-  t.Unlock(m);
-
-  CHECK(t.TryLock(m));
-  t.Unlock(m);
-
-  t.Lock(m);
-  CHECK(!t.TryLock(m));
-  t.Unlock(m);
-
-  t.Destroy(m);
-}
-
-TEST(ThreadSanitizer, BasicSpinMutex) {
-  ScopedThread t;
-  Mutex m(Mutex::Spin);
-  t.Create(m);
-
-  t.Lock(m);
-  t.Unlock(m);
-
-  CHECK(t.TryLock(m));
-  t.Unlock(m);
-
-  t.Lock(m);
-  CHECK(!t.TryLock(m));
-  t.Unlock(m);
-
-  t.Destroy(m);
-}
-
-TEST(ThreadSanitizer, BasicRwMutex) {
-  ScopedThread t;
-  Mutex m(Mutex::RW);
-  t.Create(m);
-
-  t.Lock(m);
-  t.Unlock(m);
-
-  CHECK(t.TryLock(m));
-  t.Unlock(m);
-
-  t.Lock(m);
-  CHECK(!t.TryLock(m));
-  t.Unlock(m);
-
-  t.ReadLock(m);
-  t.ReadUnlock(m);
-
-  CHECK(t.TryReadLock(m));
-  t.ReadUnlock(m);
-
-  t.Lock(m);
-  CHECK(!t.TryReadLock(m));
-  t.Unlock(m);
-
-  t.ReadLock(m);
-  CHECK(!t.TryLock(m));
-  t.ReadUnlock(m);
-
-  t.ReadLock(m);
-  CHECK(t.TryReadLock(m));
-  t.ReadUnlock(m);
-  t.ReadUnlock(m);
-
-  t.Destroy(m);
-}
-
-TEST(ThreadSanitizer, Mutex) {
-  Mutex m;
-  MainThread t0;
-  t0.Create(m);
-
-  ScopedThread t1, t2;
-  MemLoc l;
-  t1.Lock(m);
-  t1.Write1(l);
-  t1.Unlock(m);
-  t2.Lock(m);
-  t2.Write1(l);
-  t2.Unlock(m);
-  t2.Destroy(m);
-}
-
-TEST(ThreadSanitizer, SpinMutex) {
-  Mutex m(Mutex::Spin);
-  MainThread t0;
-  t0.Create(m);
-
-  ScopedThread t1, t2;
-  MemLoc l;
-  t1.Lock(m);
-  t1.Write1(l);
-  t1.Unlock(m);
-  t2.Lock(m);
-  t2.Write1(l);
-  t2.Unlock(m);
-  t2.Destroy(m);
-}
-
-TEST(ThreadSanitizer, RwMutex) {
-  Mutex m(Mutex::RW);
-  MainThread t0;
-  t0.Create(m);
-
-  ScopedThread t1, t2, t3;
-  MemLoc l;
-  t1.Lock(m);
-  t1.Write1(l);
-  t1.Unlock(m);
-  t2.Lock(m);
-  t2.Write1(l);
-  t2.Unlock(m);
-  t1.ReadLock(m);
-  t3.ReadLock(m);
-  t1.Read1(l);
-  t3.Read1(l);
-  t1.ReadUnlock(m);
-  t3.ReadUnlock(m);
-  t2.Lock(m);
-  t2.Write1(l);
-  t2.Unlock(m);
-  t2.Destroy(m);
-}
-
-TEST(ThreadSanitizer, StaticMutex) {
-  // Emulates statically initialized mutex.
-  Mutex m;
-  m.StaticInit();
-  {
-    ScopedThread t1, t2;
-    t1.Lock(m);
-    t1.Unlock(m);
-    t2.Lock(m);
-    t2.Unlock(m);
-  }
-  MainThread().Destroy(m);
-}
-
-static void *singleton_thread(void *param) {
-  atomic_uintptr_t *singleton = (atomic_uintptr_t *)param;
-  for (int i = 0; i < 4*1024*1024; i++) {
-    int *val = (int *)atomic_load(singleton, memory_order_acquire);
-    __tsan_acquire(singleton);
-    __tsan_read4(val);
-    CHECK_EQ(*val, 42);
-  }
-  return 0;
-}
-
-TEST(DISABLED_BENCH_ThreadSanitizer, Singleton) {
-  const int kClockSize = 100;
-  const int kThreadCount = 8;
-
-  // Puff off thread's clock.
-  for (int i = 0; i < kClockSize; i++) {
-    ScopedThread t1;
-    (void)t1;
-  }
-  // Create the singleton.
-  int val = 42;
-  __tsan_write4(&val);
-  atomic_uintptr_t singleton;
-  __tsan_release(&singleton);
-  atomic_store(&singleton, (uintptr_t)&val, memory_order_release);
-  // Create reader threads.
-  pthread_t threads[kThreadCount];
-  for (int t = 0; t < kThreadCount; t++)
-    pthread_create(&threads[t], 0, singleton_thread, &singleton);
-  for (int t = 0; t < kThreadCount; t++)
-    pthread_join(threads[t], 0);
-}
-
-TEST(DISABLED_BENCH_ThreadSanitizer, StopFlag) {
-  const int kClockSize = 100;
-  const int kIters = 16*1024*1024;
-
-  // Puff off thread's clock.
-  for (int i = 0; i < kClockSize; i++) {
-    ScopedThread t1;
-    (void)t1;
-  }
-  // Create the stop flag.
-  atomic_uintptr_t flag;
-  __tsan_release(&flag);
-  atomic_store(&flag, 0, memory_order_release);
-  // Read it a lot.
-  for (int i = 0; i < kIters; i++) {
-    uptr v = atomic_load(&flag, memory_order_acquire);
-    __tsan_acquire(&flag);
-    CHECK_EQ(v, 0);
-  }
-}
-
-}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/rtl_tests/tsan_posix.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_posix.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl_tests/tsan_posix.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl_tests/tsan_posix.cc (removed)
@@ -1,146 +0,0 @@
-//===-- tsan_posix.cc -----------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_interface.h"
-#include "tsan_test_util.h"
-#include "gtest/gtest.h"
-#include <pthread.h>
-
-struct thread_key {
-  pthread_key_t key;
-  pthread_mutex_t *mtx;
-  int val;
-  int *cnt;
-  thread_key(pthread_key_t key, pthread_mutex_t *mtx, int val, int *cnt)
-    : key(key)
-    , mtx(mtx)
-    , val(val)
-    , cnt(cnt) {
-  }
-};
-
-static void thread_secific_dtor(void *v) {
-  thread_key *k = (thread_key *)v;
-  EXPECT_EQ(pthread_mutex_lock(k->mtx), 0);
-  (*k->cnt)++;
-  __tsan_write4(&k->cnt);
-  EXPECT_EQ(pthread_mutex_unlock(k->mtx), 0);
-  if (k->val == 42) {
-    delete k;
-  } else if (k->val == 43 || k->val == 44) {
-    k->val--;
-    EXPECT_EQ(pthread_setspecific(k->key, k), 0);
-  } else {
-    ASSERT_TRUE(false);
-  }
-}
-
-static void *dtors_thread(void *p) {
-  thread_key *k = (thread_key *)p;
-  EXPECT_EQ(pthread_setspecific(k->key, k), 0);
-  return 0;
-}
-
-TEST(Posix, ThreadSpecificDtors) {
-  int cnt = 0;
-  pthread_key_t key;
-  EXPECT_EQ(pthread_key_create(&key, thread_secific_dtor), 0);
-  pthread_mutex_t mtx;
-  EXPECT_EQ(pthread_mutex_init(&mtx, 0), 0);
-  pthread_t th[3];
-  thread_key *k[3];
-  k[0] = new thread_key(key, &mtx, 42, &cnt);
-  k[1] = new thread_key(key, &mtx, 43, &cnt);
-  k[2] = new thread_key(key, &mtx, 44, &cnt);
-  EXPECT_EQ(pthread_create(&th[0], 0, dtors_thread, k[0]), 0);
-  EXPECT_EQ(pthread_create(&th[1], 0, dtors_thread, k[1]), 0);
-  EXPECT_EQ(pthread_join(th[0], 0), 0);
-  EXPECT_EQ(pthread_create(&th[2], 0, dtors_thread, k[2]), 0);
-  EXPECT_EQ(pthread_join(th[1], 0), 0);
-  EXPECT_EQ(pthread_join(th[2], 0), 0);
-  EXPECT_EQ(pthread_key_delete(key), 0);
-  EXPECT_EQ(6, cnt);
-}
-
-static __thread int local_var;
-
-static void *local_thread(void *p) {
-  __tsan_write1(&local_var);
-  __tsan_write1(&p);
-  if (p == 0)
-    return 0;
-  const int kThreads = 4;
-  pthread_t th[kThreads];
-  for (int i = 0; i < kThreads; i++)
-    EXPECT_EQ(pthread_create(&th[i], 0, local_thread,
-              (void*)((long)p - 1)), 0);  // NOLINT
-  for (int i = 0; i < kThreads; i++)
-    EXPECT_EQ(pthread_join(th[i], 0), 0);
-  return 0;
-}
-
-TEST(Posix, ThreadLocalAccesses) {
-  local_thread((void*)2);
-}
-
-struct CondContext {
-  pthread_mutex_t m;
-  pthread_cond_t c;
-  int data;
-};
-
-static void *cond_thread(void *p) {
-  CondContext &ctx = *static_cast<CondContext*>(p);
-
-  EXPECT_EQ(pthread_mutex_lock(&ctx.m), 0);
-  EXPECT_EQ(ctx.data, 0);
-  ctx.data = 1;
-  EXPECT_EQ(pthread_cond_signal(&ctx.c), 0);
-  EXPECT_EQ(pthread_mutex_unlock(&ctx.m), 0);
-
-  EXPECT_EQ(pthread_mutex_lock(&ctx.m), 0);
-  while (ctx.data != 2)
-    EXPECT_EQ(pthread_cond_wait(&ctx.c, &ctx.m), 0);
-  EXPECT_EQ(pthread_mutex_unlock(&ctx.m), 0);
-
-  EXPECT_EQ(pthread_mutex_lock(&ctx.m), 0);
-  ctx.data = 3;
-  EXPECT_EQ(pthread_cond_broadcast(&ctx.c), 0);
-  EXPECT_EQ(pthread_mutex_unlock(&ctx.m), 0);
-
-  return 0;
-}
-
-TEST(Posix, CondBasic) {
-  CondContext ctx;
-  EXPECT_EQ(pthread_mutex_init(&ctx.m, 0), 0);
-  EXPECT_EQ(pthread_cond_init(&ctx.c, 0), 0);
-  ctx.data = 0;
-  pthread_t th;
-  EXPECT_EQ(pthread_create(&th, 0, cond_thread, &ctx), 0);
-
-  EXPECT_EQ(pthread_mutex_lock(&ctx.m), 0);
-  while (ctx.data != 1)
-    EXPECT_EQ(pthread_cond_wait(&ctx.c, &ctx.m), 0);
-  ctx.data = 2;
-  EXPECT_EQ(pthread_mutex_unlock(&ctx.m), 0);
-  EXPECT_EQ(pthread_cond_broadcast(&ctx.c), 0);
-
-  EXPECT_EQ(pthread_mutex_lock(&ctx.m), 0);
-  while (ctx.data != 3)
-    EXPECT_EQ(pthread_cond_wait(&ctx.c, &ctx.m), 0);
-  EXPECT_EQ(pthread_mutex_unlock(&ctx.m), 0);
-
-  EXPECT_EQ(pthread_join(th, 0), 0);
-  EXPECT_EQ(pthread_cond_destroy(&ctx.c), 0);
-  EXPECT_EQ(pthread_mutex_destroy(&ctx.m), 0);
-}

Removed: compiler-rt/trunk/lib/tsan/rtl_tests/tsan_string.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_string.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl_tests/tsan_string.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl_tests/tsan_string.cc (removed)
@@ -1,82 +0,0 @@
-//===-- tsan_string.cc ----------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_test_util.h"
-#include "gtest/gtest.h"
-#include <string.h>
-
-namespace __tsan {
-
-TEST(ThreadSanitizer, Memcpy) {
-  char data0[7] = {1, 2, 3, 4, 5, 6, 7};
-  char data[7] = {42, 42, 42, 42, 42, 42, 42};
-  MainThread().Memcpy(data+1, data0+1, 5);
-  EXPECT_EQ(data[0], 42);
-  EXPECT_EQ(data[1], 2);
-  EXPECT_EQ(data[2], 3);
-  EXPECT_EQ(data[3], 4);
-  EXPECT_EQ(data[4], 5);
-  EXPECT_EQ(data[5], 6);
-  EXPECT_EQ(data[6], 42);
-  MainThread().Memset(data+1, 13, 5);
-  EXPECT_EQ(data[0], 42);
-  EXPECT_EQ(data[1], 13);
-  EXPECT_EQ(data[2], 13);
-  EXPECT_EQ(data[3], 13);
-  EXPECT_EQ(data[4], 13);
-  EXPECT_EQ(data[5], 13);
-  EXPECT_EQ(data[6], 42);
-}
-
-TEST(ThreadSanitizer, MemcpyRace1) {
-  char *data = new char[10];
-  char *data1 = new char[10];
-  char *data2 = new char[10];
-  ScopedThread t1, t2;
-  t1.Memcpy(data, data1, 10);
-  t2.Memcpy(data, data2, 10, true);
-}
-
-TEST(ThreadSanitizer, MemcpyRace2) {
-  char *data = new char[10];
-  char *data1 = new char[10];
-  char *data2 = new char[10];
-  ScopedThread t1, t2;
-  t1.Memcpy(data+5, data1, 1);
-  t2.Memcpy(data+3, data2, 4, true);
-}
-
-TEST(ThreadSanitizer, MemcpyRace3) {
-  char *data = new char[10];
-  char *data1 = new char[10];
-  char *data2 = new char[10];
-  ScopedThread t1, t2;
-  t1.Memcpy(data, data1, 10);
-  t2.Memcpy(data1, data2, 10, true);
-}
-
-TEST(ThreadSanitizer, MemcpyStack) {
-  char *data = new char[10];
-  char *data1 = new char[10];
-  ScopedThread t1, t2;
-  t1.Memcpy(data, data1, 10);
-  t2.Memcpy(data, data1, 10, true);
-}
-
-TEST(ThreadSanitizer, MemsetRace1) {
-  char *data = new char[10];
-  ScopedThread t1, t2;
-  t1.Memset(data, 1, 10);
-  t2.Memset(data, 2, 10, true);
-}
-
-}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test.cc (removed)
@@ -1,44 +0,0 @@
-//===-- tsan_test.cc ------------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_interface.h"
-#include "tsan_test_util.h"
-#include "gtest/gtest.h"
-
-static void foo() {}
-static void bar() {}
-
-TEST(ThreadSanitizer, FuncCall) {
-  ScopedThread t1, t2;
-  MemLoc l;
-  t1.Write1(l);
-  t2.Call(foo);
-  t2.Call(bar);
-  t2.Write1(l, true);
-  t2.Return();
-  t2.Return();
-}
-
-int main(int argc, char **argv) {
-  TestMutexBeforeInit();  // Mutexes must be usable before __tsan_init();
-  __tsan_init();
-  __tsan_func_entry(__builtin_return_address(0));
-  __tsan_func_entry((char*)&main + 1);
-
-  testing::GTEST_FLAG(death_test_style) = "threadsafe";
-  testing::InitGoogleTest(&argc, argv);
-  int res = RUN_ALL_TESTS();
-
-  __tsan_func_exit();
-  __tsan_func_exit();
-  return res;
-}

Removed: compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util.h?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util.h (original)
+++ compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util.h (removed)
@@ -1,122 +0,0 @@
-//===-- tsan_test_util.h ----------------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-// Test utils.
-//===----------------------------------------------------------------------===//
-#ifndef TSAN_TEST_UTIL_H
-#define TSAN_TEST_UTIL_H
-
-void TestMutexBeforeInit();
-
-// A location of memory on which a race may be detected.
-class MemLoc {
- public:
-  explicit MemLoc(int offset_from_aligned = 0);
-  explicit MemLoc(void *const real_addr) : loc_(real_addr) { }
-  ~MemLoc();
-  void *loc() const { return loc_; }
- private:
-  void *const loc_;
-  MemLoc(const MemLoc&);
-  void operator = (const MemLoc&);
-};
-
-class Mutex {
- public:
-  enum Type { Normal, Spin, RW };
-
-  explicit Mutex(Type type = Normal);
-  ~Mutex();
-
-  void Init();
-  void StaticInit();  // Emulates static initalization (tsan invisible).
-  void Destroy();
-  void Lock();
-  bool TryLock();
-  void Unlock();
-  void ReadLock();
-  bool TryReadLock();
-  void ReadUnlock();
-
- private:
-  // Placeholder for pthread_mutex_t, CRITICAL_SECTION or whatever.
-  void *mtx_[128];
-  bool alive_;
-  const Type type_;
-
-  Mutex(const Mutex&);
-  void operator = (const Mutex&);
-};
-
-// A thread is started in CTOR and joined in DTOR.
-class ScopedThread {
- public:
-  explicit ScopedThread(bool detached = false, bool main = false);
-  ~ScopedThread();
-  void Detach();
-
-  void Access(void *addr, bool is_write, int size, bool expect_race);
-  void Read(const MemLoc &ml, int size, bool expect_race = false) {
-    Access(ml.loc(), false, size, expect_race);
-  }
-  void Write(const MemLoc &ml, int size, bool expect_race = false) {
-    Access(ml.loc(), true, size, expect_race);
-  }
-  void Read1(const MemLoc &ml, bool expect_race = false) {
-    Read(ml, 1, expect_race); }
-  void Read2(const MemLoc &ml, bool expect_race = false) {
-    Read(ml, 2, expect_race); }
-  void Read4(const MemLoc &ml, bool expect_race = false) {
-    Read(ml, 4, expect_race); }
-  void Read8(const MemLoc &ml, bool expect_race = false) {
-    Read(ml, 8, expect_race); }
-  void Write1(const MemLoc &ml, bool expect_race = false) {
-    Write(ml, 1, expect_race); }
-  void Write2(const MemLoc &ml, bool expect_race = false) {
-    Write(ml, 2, expect_race); }
-  void Write4(const MemLoc &ml, bool expect_race = false) {
-    Write(ml, 4, expect_race); }
-  void Write8(const MemLoc &ml, bool expect_race = false) {
-    Write(ml, 8, expect_race); }
-
-  void VptrUpdate(const MemLoc &vptr, const MemLoc &new_val,
-                  bool expect_race = false);
-
-  void Call(void(*pc)());
-  void Return();
-
-  void Create(const Mutex &m);
-  void Destroy(const Mutex &m);
-  void Lock(const Mutex &m);
-  bool TryLock(const Mutex &m);
-  void Unlock(const Mutex &m);
-  void ReadLock(const Mutex &m);
-  bool TryReadLock(const Mutex &m);
-  void ReadUnlock(const Mutex &m);
-
-  void Memcpy(void *dst, const void *src, int size, bool expect_race = false);
-  void Memset(void *dst, int val, int size, bool expect_race = false);
-
- private:
-  struct Impl;
-  Impl *impl_;
-  ScopedThread(const ScopedThread&);  // Not implemented.
-  void operator = (const ScopedThread&);  // Not implemented.
-};
-
-class MainThread : public ScopedThread {
- public:
-  MainThread()
-    : ScopedThread(false, true) {
-  }
-};
-
-#endif  // #ifndef TSAN_TEST_UTIL_H

Removed: compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util_linux.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util_linux.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util_linux.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util_linux.cc (removed)
@@ -1,465 +0,0 @@
-
-//===-- tsan_test_util_linux.cc -------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-// Test utils, linux implementation.
-//===----------------------------------------------------------------------===//
-
-#include "sanitizer_common/sanitizer_atomic.h"
-#include "tsan_interface.h"
-#include "tsan_test_util.h"
-#include "tsan_report.h"
-
-#include "gtest/gtest.h"
-
-#include <assert.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-
-using namespace __tsan;  // NOLINT
-
-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;
-}
-
-static void AtExit() {
-}
-
-void TestMutexBeforeInit() {
-  // Mutexes must be usable before __tsan_init();
-  pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
-  pthread_mutex_lock(&mtx);
-  pthread_mutex_unlock(&mtx);
-  pthread_mutex_destroy(&mtx);
-  pthread_t thr;
-  pthread_create(&thr, 0, BeforeInitThread, 0);
-  pthread_join(thr, 0);
-  atexit(AtExit);
-}
-
-namespace __tsan {
-bool OnReport(const ReportDesc *rep, bool suppressed) {
-  if (expect_report) {
-    if (rep->typ != expect_report_type) {
-      printf("Expected report of type %d, got type %d\n",
-             (int)expect_report_type, (int)rep->typ);
-      EXPECT_FALSE("Wrong report type");
-      return false;
-    }
-  } else {
-    EXPECT_FALSE("Unexpected report");
-    return false;
-  }
-  expect_report_reported = true;
-  return true;
-}
-}
-
-static void* allocate_addr(int size, int offset_from_aligned = 0) {
-  static uintptr_t foo;
-  static atomic_uintptr_t uniq = {(uintptr_t)&foo};  // Some real address.
-  const int kAlign = 16;
-  CHECK(offset_from_aligned < kAlign);
-  size = (size + 2 * kAlign) & ~(kAlign - 1);
-  uintptr_t addr = atomic_fetch_add(&uniq, size, memory_order_relaxed);
-  return (void*)(addr + offset_from_aligned);
-}
-
-MemLoc::MemLoc(int offset_from_aligned)
-  : loc_(allocate_addr(16, offset_from_aligned)) {
-}
-
-MemLoc::~MemLoc() {
-}
-
-Mutex::Mutex(Type type)
-  : alive_()
-  , type_(type) {
-}
-
-Mutex::~Mutex() {
-  CHECK(!alive_);
-}
-
-void Mutex::Init() {
-  CHECK(!alive_);
-  alive_ = true;
-  if (type_ == Normal)
-    CHECK_EQ(pthread_mutex_init((pthread_mutex_t*)mtx_, 0), 0);
-  else if (type_ == Spin)
-    CHECK_EQ(pthread_spin_init((pthread_spinlock_t*)mtx_, 0), 0);
-  else if (type_ == RW)
-    CHECK_EQ(pthread_rwlock_init((pthread_rwlock_t*)mtx_, 0), 0);
-  else
-    CHECK(0);
-}
-
-void Mutex::StaticInit() {
-  CHECK(!alive_);
-  CHECK(type_ == Normal);
-  alive_ = true;
-  pthread_mutex_t tmp = PTHREAD_MUTEX_INITIALIZER;
-  memcpy(mtx_, &tmp, sizeof(tmp));
-}
-
-void Mutex::Destroy() {
-  CHECK(alive_);
-  alive_ = false;
-  if (type_ == Normal)
-    CHECK_EQ(pthread_mutex_destroy((pthread_mutex_t*)mtx_), 0);
-  else if (type_ == Spin)
-    CHECK_EQ(pthread_spin_destroy((pthread_spinlock_t*)mtx_), 0);
-  else if (type_ == RW)
-    CHECK_EQ(pthread_rwlock_destroy((pthread_rwlock_t*)mtx_), 0);
-}
-
-void Mutex::Lock() {
-  CHECK(alive_);
-  if (type_ == Normal)
-    CHECK_EQ(pthread_mutex_lock((pthread_mutex_t*)mtx_), 0);
-  else if (type_ == Spin)
-    CHECK_EQ(pthread_spin_lock((pthread_spinlock_t*)mtx_), 0);
-  else if (type_ == RW)
-    CHECK_EQ(pthread_rwlock_wrlock((pthread_rwlock_t*)mtx_), 0);
-}
-
-bool Mutex::TryLock() {
-  CHECK(alive_);
-  if (type_ == Normal)
-    return pthread_mutex_trylock((pthread_mutex_t*)mtx_) == 0;
-  else if (type_ == Spin)
-    return pthread_spin_trylock((pthread_spinlock_t*)mtx_) == 0;
-  else if (type_ == RW)
-    return pthread_rwlock_trywrlock((pthread_rwlock_t*)mtx_) == 0;
-  return false;
-}
-
-void Mutex::Unlock() {
-  CHECK(alive_);
-  if (type_ == Normal)
-    CHECK_EQ(pthread_mutex_unlock((pthread_mutex_t*)mtx_), 0);
-  else if (type_ == Spin)
-    CHECK_EQ(pthread_spin_unlock((pthread_spinlock_t*)mtx_), 0);
-  else if (type_ == RW)
-    CHECK_EQ(pthread_rwlock_unlock((pthread_rwlock_t*)mtx_), 0);
-}
-
-void Mutex::ReadLock() {
-  CHECK(alive_);
-  CHECK(type_ == RW);
-  CHECK_EQ(pthread_rwlock_rdlock((pthread_rwlock_t*)mtx_), 0);
-}
-
-bool Mutex::TryReadLock() {
-  CHECK(alive_);
-  CHECK(type_ == RW);
-  return pthread_rwlock_tryrdlock((pthread_rwlock_t*)mtx_) ==  0;
-}
-
-void Mutex::ReadUnlock() {
-  CHECK(alive_);
-  CHECK(type_ == RW);
-  CHECK_EQ(pthread_rwlock_unlock((pthread_rwlock_t*)mtx_), 0);
-}
-
-struct Event {
-  enum Type {
-    SHUTDOWN,
-    READ,
-    WRITE,
-    VPTR_UPDATE,
-    CALL,
-    RETURN,
-    MUTEX_CREATE,
-    MUTEX_DESTROY,
-    MUTEX_LOCK,
-    MUTEX_TRYLOCK,
-    MUTEX_UNLOCK,
-    MUTEX_READLOCK,
-    MUTEX_TRYREADLOCK,
-    MUTEX_READUNLOCK,
-    MEMCPY,
-    MEMSET
-  };
-  Type type;
-  void *ptr;
-  uptr arg;
-  uptr arg2;
-  bool res;
-  bool expect_report;
-  ReportType report_type;
-
-  Event(Type type, const void *ptr = 0, uptr arg = 0, uptr arg2 = 0)
-    : type(type)
-    , ptr(const_cast<void*>(ptr))
-    , arg(arg)
-    , arg2(arg2)
-    , res()
-    , expect_report()
-    , report_type() {
-  }
-
-  void ExpectReport(ReportType type) {
-    expect_report = true;
-    report_type = type;
-  }
-};
-
-struct ScopedThread::Impl {
-  pthread_t thread;
-  bool main;
-  bool detached;
-  atomic_uintptr_t event;  // Event*
-
-  static void *ScopedThreadCallback(void *arg);
-  void send(Event *ev);
-  void HandleEvent(Event *ev);
-};
-
-void ScopedThread::Impl::HandleEvent(Event *ev) {
-  CHECK_EQ(expect_report, false);
-  expect_report = ev->expect_report;
-  expect_report_reported = false;
-  expect_report_type = ev->report_type;
-  switch (ev->type) {
-  case Event::READ:
-  case Event::WRITE: {
-    void (*tsan_mop)(void *addr) = 0;
-    if (ev->type == Event::READ) {
-      switch (ev->arg /*size*/) {
-        case 1: tsan_mop = __tsan_read1; break;
-        case 2: tsan_mop = __tsan_read2; break;
-        case 4: tsan_mop = __tsan_read4; break;
-        case 8: tsan_mop = __tsan_read8; break;
-        case 16: tsan_mop = __tsan_read16; break;
-      }
-    } else {
-      switch (ev->arg /*size*/) {
-        case 1: tsan_mop = __tsan_write1; break;
-        case 2: tsan_mop = __tsan_write2; break;
-        case 4: tsan_mop = __tsan_write4; break;
-        case 8: tsan_mop = __tsan_write8; break;
-        case 16: tsan_mop = __tsan_write16; break;
-      }
-    }
-    CHECK_NE(tsan_mop, 0);
-    errno = ECHRNG;
-    tsan_mop(ev->ptr);
-    CHECK_EQ(errno, ECHRNG);  // In no case must errno be changed.
-    break;
-  }
-  case Event::VPTR_UPDATE:
-    __tsan_vptr_update((void**)ev->ptr, (void*)ev->arg);
-    break;
-  case Event::CALL:
-    __tsan_func_entry((void*)((uptr)ev->ptr));
-    break;
-  case Event::RETURN:
-    __tsan_func_exit();
-    break;
-  case Event::MUTEX_CREATE:
-    static_cast<Mutex*>(ev->ptr)->Init();
-    break;
-  case Event::MUTEX_DESTROY:
-    static_cast<Mutex*>(ev->ptr)->Destroy();
-    break;
-  case Event::MUTEX_LOCK:
-    static_cast<Mutex*>(ev->ptr)->Lock();
-    break;
-  case Event::MUTEX_TRYLOCK:
-    ev->res = static_cast<Mutex*>(ev->ptr)->TryLock();
-    break;
-  case Event::MUTEX_UNLOCK:
-    static_cast<Mutex*>(ev->ptr)->Unlock();
-    break;
-  case Event::MUTEX_READLOCK:
-    static_cast<Mutex*>(ev->ptr)->ReadLock();
-    break;
-  case Event::MUTEX_TRYREADLOCK:
-    ev->res = static_cast<Mutex*>(ev->ptr)->TryReadLock();
-    break;
-  case Event::MUTEX_READUNLOCK:
-    static_cast<Mutex*>(ev->ptr)->ReadUnlock();
-    break;
-  case Event::MEMCPY:
-    __interceptor_memcpy(ev->ptr, (void*)ev->arg, ev->arg2);
-    break;
-  case Event::MEMSET:
-    __interceptor_memset(ev->ptr, ev->arg, ev->arg2);
-    break;
-  default: CHECK(0);
-  }
-  if (expect_report && !expect_report_reported) {
-    printf("Missed expected report of type %d\n", (int)ev->report_type);
-    EXPECT_FALSE("Missed expected race");
-  }
-  expect_report = false;
-}
-
-void *ScopedThread::Impl::ScopedThreadCallback(void *arg) {
-  __tsan_func_entry(__builtin_return_address(0));
-  Impl *impl = (Impl*)arg;
-  for (;;) {
-    Event* ev = (Event*)atomic_load(&impl->event, memory_order_acquire);
-    if (ev == 0) {
-      pthread_yield();
-      continue;
-    }
-    if (ev->type == Event::SHUTDOWN) {
-      atomic_store(&impl->event, 0, memory_order_release);
-      break;
-    }
-    impl->HandleEvent(ev);
-    atomic_store(&impl->event, 0, memory_order_release);
-  }
-  __tsan_func_exit();
-  return 0;
-}
-
-void ScopedThread::Impl::send(Event *e) {
-  if (main) {
-    HandleEvent(e);
-  } else {
-    CHECK_EQ(atomic_load(&event, memory_order_relaxed), 0);
-    atomic_store(&event, (uintptr_t)e, memory_order_release);
-    while (atomic_load(&event, memory_order_acquire) != 0)
-      pthread_yield();
-  }
-}
-
-ScopedThread::ScopedThread(bool detached, bool main) {
-  impl_ = new Impl;
-  impl_->main = main;
-  impl_->detached = detached;
-  atomic_store(&impl_->event, 0, memory_order_relaxed);
-  if (!main) {
-    pthread_attr_t attr;
-    pthread_attr_init(&attr);
-    pthread_attr_setdetachstate(&attr, detached);
-    pthread_attr_setstacksize(&attr, 64*1024);
-    pthread_create(&impl_->thread, &attr,
-        ScopedThread::Impl::ScopedThreadCallback, impl_);
-  }
-}
-
-ScopedThread::~ScopedThread() {
-  if (!impl_->main) {
-    Event event(Event::SHUTDOWN);
-    impl_->send(&event);
-    if (!impl_->detached)
-      pthread_join(impl_->thread, 0);
-  }
-  delete impl_;
-}
-
-void ScopedThread::Detach() {
-  CHECK(!impl_->main);
-  CHECK(!impl_->detached);
-  impl_->detached = true;
-  pthread_detach(impl_->thread);
-}
-
-void ScopedThread::Access(void *addr, bool is_write,
-                          int size, bool expect_race) {
-  Event event(is_write ? Event::WRITE : Event::READ, addr, size);
-  if (expect_race)
-    event.ExpectReport(ReportTypeRace);
-  impl_->send(&event);
-}
-
-void ScopedThread::VptrUpdate(const MemLoc &vptr,
-                              const MemLoc &new_val,
-                              bool expect_race) {
-  Event event(Event::VPTR_UPDATE, vptr.loc(), (uptr)new_val.loc());
-  if (expect_race)
-    event.ExpectReport(ReportTypeRace);
-  impl_->send(&event);
-}
-
-void ScopedThread::Call(void(*pc)()) {
-  Event event(Event::CALL, (void*)pc);
-  impl_->send(&event);
-}
-
-void ScopedThread::Return() {
-  Event event(Event::RETURN);
-  impl_->send(&event);
-}
-
-void ScopedThread::Create(const Mutex &m) {
-  Event event(Event::MUTEX_CREATE, &m);
-  impl_->send(&event);
-}
-
-void ScopedThread::Destroy(const Mutex &m) {
-  Event event(Event::MUTEX_DESTROY, &m);
-  impl_->send(&event);
-}
-
-void ScopedThread::Lock(const Mutex &m) {
-  Event event(Event::MUTEX_LOCK, &m);
-  impl_->send(&event);
-}
-
-bool ScopedThread::TryLock(const Mutex &m) {
-  Event event(Event::MUTEX_TRYLOCK, &m);
-  impl_->send(&event);
-  return event.res;
-}
-
-void ScopedThread::Unlock(const Mutex &m) {
-  Event event(Event::MUTEX_UNLOCK, &m);
-  impl_->send(&event);
-}
-
-void ScopedThread::ReadLock(const Mutex &m) {
-  Event event(Event::MUTEX_READLOCK, &m);
-  impl_->send(&event);
-}
-
-bool ScopedThread::TryReadLock(const Mutex &m) {
-  Event event(Event::MUTEX_TRYREADLOCK, &m);
-  impl_->send(&event);
-  return event.res;
-}
-
-void ScopedThread::ReadUnlock(const Mutex &m) {
-  Event event(Event::MUTEX_READUNLOCK, &m);
-  impl_->send(&event);
-}
-
-void ScopedThread::Memcpy(void *dst, const void *src, int size,
-                          bool expect_race) {
-  Event event(Event::MEMCPY, dst, (uptr)src, size);
-  if (expect_race)
-    event.ExpectReport(ReportTypeRace);
-  impl_->send(&event);
-}
-
-void ScopedThread::Memset(void *dst, int val, int size,
-                          bool expect_race) {
-  Event event(Event::MEMSET, dst, val, size);
-  if (expect_race)
-    event.ExpectReport(ReportTypeRace);
-  impl_->send(&event);
-}

Removed: compiler-rt/trunk/lib/tsan/rtl_tests/tsan_thread.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_thread.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl_tests/tsan_thread.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl_tests/tsan_thread.cc (removed)
@@ -1,59 +0,0 @@
-//===-- tsan_thread.cc ----------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_test_util.h"
-#include "gtest/gtest.h"
-
-TEST(ThreadSanitizer, ThreadSync) {
-  MainThread t0;
-  MemLoc l;
-  t0.Write1(l);
-  {
-    ScopedThread t1;
-    t1.Write1(l);
-  }
-  t0.Write1(l);
-}
-
-TEST(ThreadSanitizer, ThreadDetach1) {
-  ScopedThread t1(true);
-  MemLoc l;
-  t1.Write1(l);
-}
-
-TEST(ThreadSanitizer, ThreadDetach2) {
-  ScopedThread t1;
-  MemLoc l;
-  t1.Write1(l);
-  t1.Detach();
-}
-
-static void *thread_alot_func(void *arg) {
-  (void)arg;
-  int usleep(unsigned);
-  usleep(50);
-  return 0;
-}
-
-TEST(DISABLED_SLOW_ThreadSanitizer, ThreadALot) {
-  const int kThreads = 70000;
-  const int kAlive = 1000;
-  pthread_t threads[kAlive] = {};
-  for (int i = 0; i < kThreads; i++) {
-    if (threads[i % kAlive])
-      pthread_join(threads[i % kAlive], 0);
-    pthread_create(&threads[i % kAlive], 0, thread_alot_func, 0);
-  }
-  for (int i = 0; i < kAlive; i++) {
-    pthread_join(threads[i], 0);
-  }
-}

Added: compiler-rt/trunk/lib/tsan/tests/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/CMakeLists.txt?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/CMakeLists.txt (added)
+++ compiler-rt/trunk/lib/tsan/tests/CMakeLists.txt Mon Sep 17 05:02:17 2012
@@ -0,0 +1,24 @@
+include_directories(../rtl)
+
+add_custom_target(TsanUnitTests)
+set_target_properties(TsanUnitTests PROPERTIES
+  FOLDER "TSan unittests")
+function(add_tsan_unittest testname)
+  # Build unit tests only on 64-bit Linux.
+  if(UNIX AND NOT APPLE
+      AND CAN_TARGET_X86_64
+      AND CMAKE_SIZEOF_VOID_P EQUAL 8
+      AND NOT LLVM_BUILD_32_BITS)
+    add_unittest(TsanUnitTests ${testname} ${ARGN})
+    # Link with TSan runtime.
+    target_link_libraries(${testname} clang_rt.tsan-x86_64)
+    # Build tests with PIE and debug info.
+    set_property(TARGET ${testname} APPEND_STRING
+      PROPERTY COMPILE_FLAGS " -fPIE -g")
+    set_property(TARGET ${testname} APPEND_STRING
+      PROPERTY LINK_FLAGS " -pie")
+  endif()
+endfunction()
+
+add_subdirectory(rtl)
+add_subdirectory(unit)

Added: compiler-rt/trunk/lib/tsan/tests/rtl/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/rtl/CMakeLists.txt?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/rtl/CMakeLists.txt (added)
+++ compiler-rt/trunk/lib/tsan/tests/rtl/CMakeLists.txt Mon Sep 17 05:02:17 2012
@@ -0,0 +1,15 @@
+set(TSAN_RTL_TESTS
+  tsan_bench.cc
+  tsan_mop.cc
+  tsan_mutex.cc
+  tsan_posix.cc
+  tsan_string.cc
+  tsan_test.cc
+  tsan_thread.cc
+  )
+
+if(UNIX AND NOT APPLE)
+  list(APPEND TSAN_RTL_TESTS tsan_test_util_linux.cc)
+endif()
+
+add_tsan_unittest(TsanRtlTest ${TSAN_RTL_TESTS})

Added: compiler-rt/trunk/lib/tsan/tests/rtl/tsan_bench.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/rtl/tsan_bench.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/rtl/tsan_bench.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/rtl/tsan_bench.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,105 @@
+//===-- tsan_bench.cc -----------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_test_util.h"
+#include "tsan_interface.h"
+#include "tsan_defs.h"
+#include "gtest/gtest.h"
+#include <stdint.h>
+
+const int kSize = 128;
+const int kRepeat = 2*1024*1024;
+
+void noinstr(void *p) {}
+
+template<typename T, void(*__tsan_mop)(void *p)>
+static void Benchmark() {
+  volatile T data[kSize];
+  for (int i = 0; i < kRepeat; i++) {
+    for (int j = 0; j < kSize; j++) {
+      __tsan_mop((void*)&data[j]);
+      data[j]++;
+    }
+  }
+}
+
+TEST(DISABLED_BENCH, Mop1) {
+  Benchmark<uint8_t, noinstr>();
+}
+
+TEST(DISABLED_BENCH, Mop1Read) {
+  Benchmark<uint8_t, __tsan_read1>();
+}
+
+TEST(DISABLED_BENCH, Mop1Write) {
+  Benchmark<uint8_t, __tsan_write1>();
+}
+
+TEST(DISABLED_BENCH, Mop2) {
+  Benchmark<uint16_t, noinstr>();
+}
+
+TEST(DISABLED_BENCH, Mop2Read) {
+  Benchmark<uint16_t, __tsan_read2>();
+}
+
+TEST(DISABLED_BENCH, Mop2Write) {
+  Benchmark<uint16_t, __tsan_write2>();
+}
+
+TEST(DISABLED_BENCH, Mop4) {
+  Benchmark<uint32_t, noinstr>();
+}
+
+TEST(DISABLED_BENCH, Mop4Read) {
+  Benchmark<uint32_t, __tsan_read4>();
+}
+
+TEST(DISABLED_BENCH, Mop4Write) {
+  Benchmark<uint32_t, __tsan_write4>();
+}
+
+TEST(DISABLED_BENCH, Mop8) {
+  Benchmark<uint8_t, noinstr>();
+}
+
+TEST(DISABLED_BENCH, Mop8Read) {
+  Benchmark<uint64_t, __tsan_read8>();
+}
+
+TEST(DISABLED_BENCH, Mop8Write) {
+  Benchmark<uint64_t, __tsan_write8>();
+}
+
+TEST(DISABLED_BENCH, FuncCall) {
+  for (int i = 0; i < kRepeat; i++) {
+    for (int j = 0; j < kSize; j++)
+      __tsan_func_entry((void*)(uintptr_t)j);
+    for (int j = 0; j < kSize; j++)
+      __tsan_func_exit();
+  }
+}
+
+TEST(DISABLED_BENCH, MutexLocal) {
+  Mutex m;
+  ScopedThread().Create(m);
+  for (int i = 0; i < 50; i++) {
+    ScopedThread t;
+    t.Lock(m);
+    t.Unlock(m);
+  }
+  for (int i = 0; i < 16*1024*1024; i++) {
+    m.Lock();
+    m.Unlock();
+  }
+  ScopedThread().Destroy(m);
+}

Added: compiler-rt/trunk/lib/tsan/tests/rtl/tsan_mop.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/rtl/tsan_mop.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/rtl/tsan_mop.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/rtl/tsan_mop.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,233 @@
+//===-- tsan_mop.cc -------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_interface.h"
+#include "tsan_test_util.h"
+#include "gtest/gtest.h"
+#include <stddef.h>
+#include <stdint.h>
+
+TEST(ThreadSanitizer, SimpleWrite) {
+  ScopedThread t;
+  MemLoc l;
+  t.Write1(l);
+}
+
+TEST(ThreadSanitizer, SimpleWriteWrite) {
+  ScopedThread t1, t2;
+  MemLoc l1, l2;
+  t1.Write1(l1);
+  t2.Write1(l2);
+}
+
+TEST(ThreadSanitizer, WriteWriteRace) {
+  ScopedThread t1, t2;
+  MemLoc l;
+  t1.Write1(l);
+  t2.Write1(l, true);
+}
+
+TEST(ThreadSanitizer, ReadWriteRace) {
+  ScopedThread t1, t2;
+  MemLoc l;
+  t1.Read1(l);
+  t2.Write1(l, true);
+}
+
+TEST(ThreadSanitizer, WriteReadRace) {
+  ScopedThread t1, t2;
+  MemLoc l;
+  t1.Write1(l);
+  t2.Read1(l, true);
+}
+
+TEST(ThreadSanitizer, ReadReadNoRace) {
+  ScopedThread t1, t2;
+  MemLoc l;
+  t1.Read1(l);
+  t2.Read1(l);
+}
+
+TEST(ThreadSanitizer, WriteThenRead) {
+  MemLoc l;
+  ScopedThread t1, t2;
+  t1.Write1(l);
+  t1.Read1(l);
+  t2.Read1(l, true);
+}
+
+TEST(ThreadSanitizer, WriteThenLockedRead) {
+  Mutex m(Mutex::RW);
+  MainThread t0;
+  t0.Create(m);
+  MemLoc l;
+  {
+    ScopedThread t1, t2;
+
+    t1.Write8(l);
+
+    t1.Lock(m);
+    t1.Read8(l);
+    t1.Unlock(m);
+
+    t2.Read8(l, true);
+  }
+  t0.Destroy(m);
+}
+
+TEST(ThreadSanitizer, LockedWriteThenRead) {
+  Mutex m(Mutex::RW);
+  MainThread t0;
+  t0.Create(m);
+  MemLoc l;
+  {
+    ScopedThread t1, t2;
+
+    t1.Lock(m);
+    t1.Write8(l);
+    t1.Unlock(m);
+
+    t1.Read8(l);
+
+    t2.Read8(l, true);
+  }
+  t0.Destroy(m);
+}
+
+
+TEST(ThreadSanitizer, RaceWithOffset) {
+  ScopedThread t1, t2;
+  {
+    MemLoc l;
+    t1.Access(l.loc(), true, 8, false);
+    t2.Access((char*)l.loc() + 4, true, 4, true);
+  }
+  {
+    MemLoc l;
+    t1.Access(l.loc(), true, 8, false);
+    t2.Access((char*)l.loc() + 7, true, 1, true);
+  }
+  {
+    MemLoc l;
+    t1.Access((char*)l.loc() + 4, true, 4, false);
+    t2.Access((char*)l.loc() + 4, true, 2, true);
+  }
+  {
+    MemLoc l;
+    t1.Access((char*)l.loc() + 4, true, 4, false);
+    t2.Access((char*)l.loc() + 6, true, 2, true);
+  }
+  {
+    MemLoc l;
+    t1.Access((char*)l.loc() + 3, true, 2, false);
+    t2.Access((char*)l.loc() + 4, true, 1, true);
+  }
+  {
+    MemLoc l;
+    t1.Access((char*)l.loc() + 1, true, 8, false);
+    t2.Access((char*)l.loc() + 3, true, 1, true);
+  }
+}
+
+TEST(ThreadSanitizer, RaceWithOffset2) {
+  ScopedThread t1, t2;
+  {
+    MemLoc l;
+    t1.Access((char*)l.loc(), true, 4, false);
+    t2.Access((char*)l.loc() + 2, true, 1, true);
+  }
+  {
+    MemLoc l;
+    t1.Access((char*)l.loc() + 2, true, 1, false);
+    t2.Access((char*)l.loc(), true, 4, true);
+  }
+}
+
+TEST(ThreadSanitizer, NoRaceWithOffset) {
+  ScopedThread t1, t2;
+  {
+    MemLoc l;
+    t1.Access(l.loc(), true, 4, false);
+    t2.Access((char*)l.loc() + 4, true, 4, false);
+  }
+  {
+    MemLoc l;
+    t1.Access((char*)l.loc() + 3, true, 2, false);
+    t2.Access((char*)l.loc() + 1, true, 2, false);
+    t2.Access((char*)l.loc() + 5, true, 2, false);
+  }
+}
+
+TEST(ThreadSanitizer, RaceWithDeadThread) {
+  MemLoc l;
+  ScopedThread t;
+  ScopedThread().Write1(l);
+  t.Write1(l, true);
+}
+
+TEST(ThreadSanitizer, BenignRaceOnVptr) {
+  void *vptr_storage;
+  MemLoc vptr(&vptr_storage), val;
+  vptr_storage = val.loc();
+  ScopedThread t1, t2;
+  t1.VptrUpdate(vptr, val);
+  t2.Read8(vptr);
+}
+
+TEST(ThreadSanitizer, HarmfulRaceOnVptr) {
+  void *vptr_storage;
+  MemLoc vptr(&vptr_storage), val1, val2;
+  vptr_storage = val1.loc();
+  ScopedThread t1, t2;
+  t1.VptrUpdate(vptr, val2);
+  t2.Read8(vptr, true);
+}
+
+static void foo() {
+  volatile int x = 42;
+  int x2 = x;
+  (void)x2;
+}
+
+static void bar() {
+  volatile int x = 43;
+  int x2 = x;
+  (void)x2;
+}
+
+TEST(ThreadSanitizer, ReportDeadThread) {
+  MemLoc l;
+  ScopedThread t1;
+  {
+    ScopedThread t2;
+    t2.Call(&foo);
+    t2.Call(&bar);
+    t2.Write1(l);
+  }
+  t1.Write1(l, true);
+}
+
+struct ClassWithStatic {
+  static int Data[4];
+};
+
+int ClassWithStatic::Data[4];
+
+static void foobarbaz() {}
+
+TEST(ThreadSanitizer, ReportRace) {
+  ScopedThread t1;
+  MainThread().Access(&ClassWithStatic::Data, true, 4, false);
+  t1.Call(&foobarbaz);
+  t1.Access(&ClassWithStatic::Data, true, 2, true);
+  t1.Return();
+}

Added: compiler-rt/trunk/lib/tsan/tests/rtl/tsan_mutex.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/rtl/tsan_mutex.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/rtl/tsan_mutex.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/rtl/tsan_mutex.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,221 @@
+//===-- tsan_mutex.cc -----------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "sanitizer_common/sanitizer_atomic.h"
+#include "tsan_interface.h"
+#include "tsan_interface_ann.h"
+#include "tsan_test_util.h"
+#include "gtest/gtest.h"
+#include <stdint.h>
+
+namespace __tsan {
+
+TEST(ThreadSanitizer, BasicMutex) {
+  ScopedThread t;
+  Mutex m;
+  t.Create(m);
+
+  t.Lock(m);
+  t.Unlock(m);
+
+  CHECK(t.TryLock(m));
+  t.Unlock(m);
+
+  t.Lock(m);
+  CHECK(!t.TryLock(m));
+  t.Unlock(m);
+
+  t.Destroy(m);
+}
+
+TEST(ThreadSanitizer, BasicSpinMutex) {
+  ScopedThread t;
+  Mutex m(Mutex::Spin);
+  t.Create(m);
+
+  t.Lock(m);
+  t.Unlock(m);
+
+  CHECK(t.TryLock(m));
+  t.Unlock(m);
+
+  t.Lock(m);
+  CHECK(!t.TryLock(m));
+  t.Unlock(m);
+
+  t.Destroy(m);
+}
+
+TEST(ThreadSanitizer, BasicRwMutex) {
+  ScopedThread t;
+  Mutex m(Mutex::RW);
+  t.Create(m);
+
+  t.Lock(m);
+  t.Unlock(m);
+
+  CHECK(t.TryLock(m));
+  t.Unlock(m);
+
+  t.Lock(m);
+  CHECK(!t.TryLock(m));
+  t.Unlock(m);
+
+  t.ReadLock(m);
+  t.ReadUnlock(m);
+
+  CHECK(t.TryReadLock(m));
+  t.ReadUnlock(m);
+
+  t.Lock(m);
+  CHECK(!t.TryReadLock(m));
+  t.Unlock(m);
+
+  t.ReadLock(m);
+  CHECK(!t.TryLock(m));
+  t.ReadUnlock(m);
+
+  t.ReadLock(m);
+  CHECK(t.TryReadLock(m));
+  t.ReadUnlock(m);
+  t.ReadUnlock(m);
+
+  t.Destroy(m);
+}
+
+TEST(ThreadSanitizer, Mutex) {
+  Mutex m;
+  MainThread t0;
+  t0.Create(m);
+
+  ScopedThread t1, t2;
+  MemLoc l;
+  t1.Lock(m);
+  t1.Write1(l);
+  t1.Unlock(m);
+  t2.Lock(m);
+  t2.Write1(l);
+  t2.Unlock(m);
+  t2.Destroy(m);
+}
+
+TEST(ThreadSanitizer, SpinMutex) {
+  Mutex m(Mutex::Spin);
+  MainThread t0;
+  t0.Create(m);
+
+  ScopedThread t1, t2;
+  MemLoc l;
+  t1.Lock(m);
+  t1.Write1(l);
+  t1.Unlock(m);
+  t2.Lock(m);
+  t2.Write1(l);
+  t2.Unlock(m);
+  t2.Destroy(m);
+}
+
+TEST(ThreadSanitizer, RwMutex) {
+  Mutex m(Mutex::RW);
+  MainThread t0;
+  t0.Create(m);
+
+  ScopedThread t1, t2, t3;
+  MemLoc l;
+  t1.Lock(m);
+  t1.Write1(l);
+  t1.Unlock(m);
+  t2.Lock(m);
+  t2.Write1(l);
+  t2.Unlock(m);
+  t1.ReadLock(m);
+  t3.ReadLock(m);
+  t1.Read1(l);
+  t3.Read1(l);
+  t1.ReadUnlock(m);
+  t3.ReadUnlock(m);
+  t2.Lock(m);
+  t2.Write1(l);
+  t2.Unlock(m);
+  t2.Destroy(m);
+}
+
+TEST(ThreadSanitizer, StaticMutex) {
+  // Emulates statically initialized mutex.
+  Mutex m;
+  m.StaticInit();
+  {
+    ScopedThread t1, t2;
+    t1.Lock(m);
+    t1.Unlock(m);
+    t2.Lock(m);
+    t2.Unlock(m);
+  }
+  MainThread().Destroy(m);
+}
+
+static void *singleton_thread(void *param) {
+  atomic_uintptr_t *singleton = (atomic_uintptr_t *)param;
+  for (int i = 0; i < 4*1024*1024; i++) {
+    int *val = (int *)atomic_load(singleton, memory_order_acquire);
+    __tsan_acquire(singleton);
+    __tsan_read4(val);
+    CHECK_EQ(*val, 42);
+  }
+  return 0;
+}
+
+TEST(DISABLED_BENCH_ThreadSanitizer, Singleton) {
+  const int kClockSize = 100;
+  const int kThreadCount = 8;
+
+  // Puff off thread's clock.
+  for (int i = 0; i < kClockSize; i++) {
+    ScopedThread t1;
+    (void)t1;
+  }
+  // Create the singleton.
+  int val = 42;
+  __tsan_write4(&val);
+  atomic_uintptr_t singleton;
+  __tsan_release(&singleton);
+  atomic_store(&singleton, (uintptr_t)&val, memory_order_release);
+  // Create reader threads.
+  pthread_t threads[kThreadCount];
+  for (int t = 0; t < kThreadCount; t++)
+    pthread_create(&threads[t], 0, singleton_thread, &singleton);
+  for (int t = 0; t < kThreadCount; t++)
+    pthread_join(threads[t], 0);
+}
+
+TEST(DISABLED_BENCH_ThreadSanitizer, StopFlag) {
+  const int kClockSize = 100;
+  const int kIters = 16*1024*1024;
+
+  // Puff off thread's clock.
+  for (int i = 0; i < kClockSize; i++) {
+    ScopedThread t1;
+    (void)t1;
+  }
+  // Create the stop flag.
+  atomic_uintptr_t flag;
+  __tsan_release(&flag);
+  atomic_store(&flag, 0, memory_order_release);
+  // Read it a lot.
+  for (int i = 0; i < kIters; i++) {
+    uptr v = atomic_load(&flag, memory_order_acquire);
+    __tsan_acquire(&flag);
+    CHECK_EQ(v, 0);
+  }
+}
+
+}  // namespace __tsan

Added: compiler-rt/trunk/lib/tsan/tests/rtl/tsan_posix.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/rtl/tsan_posix.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/rtl/tsan_posix.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/rtl/tsan_posix.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,146 @@
+//===-- tsan_posix.cc -----------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_interface.h"
+#include "tsan_test_util.h"
+#include "gtest/gtest.h"
+#include <pthread.h>
+
+struct thread_key {
+  pthread_key_t key;
+  pthread_mutex_t *mtx;
+  int val;
+  int *cnt;
+  thread_key(pthread_key_t key, pthread_mutex_t *mtx, int val, int *cnt)
+    : key(key)
+    , mtx(mtx)
+    , val(val)
+    , cnt(cnt) {
+  }
+};
+
+static void thread_secific_dtor(void *v) {
+  thread_key *k = (thread_key *)v;
+  EXPECT_EQ(pthread_mutex_lock(k->mtx), 0);
+  (*k->cnt)++;
+  __tsan_write4(&k->cnt);
+  EXPECT_EQ(pthread_mutex_unlock(k->mtx), 0);
+  if (k->val == 42) {
+    delete k;
+  } else if (k->val == 43 || k->val == 44) {
+    k->val--;
+    EXPECT_EQ(pthread_setspecific(k->key, k), 0);
+  } else {
+    ASSERT_TRUE(false);
+  }
+}
+
+static void *dtors_thread(void *p) {
+  thread_key *k = (thread_key *)p;
+  EXPECT_EQ(pthread_setspecific(k->key, k), 0);
+  return 0;
+}
+
+TEST(Posix, ThreadSpecificDtors) {
+  int cnt = 0;
+  pthread_key_t key;
+  EXPECT_EQ(pthread_key_create(&key, thread_secific_dtor), 0);
+  pthread_mutex_t mtx;
+  EXPECT_EQ(pthread_mutex_init(&mtx, 0), 0);
+  pthread_t th[3];
+  thread_key *k[3];
+  k[0] = new thread_key(key, &mtx, 42, &cnt);
+  k[1] = new thread_key(key, &mtx, 43, &cnt);
+  k[2] = new thread_key(key, &mtx, 44, &cnt);
+  EXPECT_EQ(pthread_create(&th[0], 0, dtors_thread, k[0]), 0);
+  EXPECT_EQ(pthread_create(&th[1], 0, dtors_thread, k[1]), 0);
+  EXPECT_EQ(pthread_join(th[0], 0), 0);
+  EXPECT_EQ(pthread_create(&th[2], 0, dtors_thread, k[2]), 0);
+  EXPECT_EQ(pthread_join(th[1], 0), 0);
+  EXPECT_EQ(pthread_join(th[2], 0), 0);
+  EXPECT_EQ(pthread_key_delete(key), 0);
+  EXPECT_EQ(6, cnt);
+}
+
+static __thread int local_var;
+
+static void *local_thread(void *p) {
+  __tsan_write1(&local_var);
+  __tsan_write1(&p);
+  if (p == 0)
+    return 0;
+  const int kThreads = 4;
+  pthread_t th[kThreads];
+  for (int i = 0; i < kThreads; i++)
+    EXPECT_EQ(pthread_create(&th[i], 0, local_thread,
+              (void*)((long)p - 1)), 0);  // NOLINT
+  for (int i = 0; i < kThreads; i++)
+    EXPECT_EQ(pthread_join(th[i], 0), 0);
+  return 0;
+}
+
+TEST(Posix, ThreadLocalAccesses) {
+  local_thread((void*)2);
+}
+
+struct CondContext {
+  pthread_mutex_t m;
+  pthread_cond_t c;
+  int data;
+};
+
+static void *cond_thread(void *p) {
+  CondContext &ctx = *static_cast<CondContext*>(p);
+
+  EXPECT_EQ(pthread_mutex_lock(&ctx.m), 0);
+  EXPECT_EQ(ctx.data, 0);
+  ctx.data = 1;
+  EXPECT_EQ(pthread_cond_signal(&ctx.c), 0);
+  EXPECT_EQ(pthread_mutex_unlock(&ctx.m), 0);
+
+  EXPECT_EQ(pthread_mutex_lock(&ctx.m), 0);
+  while (ctx.data != 2)
+    EXPECT_EQ(pthread_cond_wait(&ctx.c, &ctx.m), 0);
+  EXPECT_EQ(pthread_mutex_unlock(&ctx.m), 0);
+
+  EXPECT_EQ(pthread_mutex_lock(&ctx.m), 0);
+  ctx.data = 3;
+  EXPECT_EQ(pthread_cond_broadcast(&ctx.c), 0);
+  EXPECT_EQ(pthread_mutex_unlock(&ctx.m), 0);
+
+  return 0;
+}
+
+TEST(Posix, CondBasic) {
+  CondContext ctx;
+  EXPECT_EQ(pthread_mutex_init(&ctx.m, 0), 0);
+  EXPECT_EQ(pthread_cond_init(&ctx.c, 0), 0);
+  ctx.data = 0;
+  pthread_t th;
+  EXPECT_EQ(pthread_create(&th, 0, cond_thread, &ctx), 0);
+
+  EXPECT_EQ(pthread_mutex_lock(&ctx.m), 0);
+  while (ctx.data != 1)
+    EXPECT_EQ(pthread_cond_wait(&ctx.c, &ctx.m), 0);
+  ctx.data = 2;
+  EXPECT_EQ(pthread_mutex_unlock(&ctx.m), 0);
+  EXPECT_EQ(pthread_cond_broadcast(&ctx.c), 0);
+
+  EXPECT_EQ(pthread_mutex_lock(&ctx.m), 0);
+  while (ctx.data != 3)
+    EXPECT_EQ(pthread_cond_wait(&ctx.c, &ctx.m), 0);
+  EXPECT_EQ(pthread_mutex_unlock(&ctx.m), 0);
+
+  EXPECT_EQ(pthread_join(th, 0), 0);
+  EXPECT_EQ(pthread_cond_destroy(&ctx.c), 0);
+  EXPECT_EQ(pthread_mutex_destroy(&ctx.m), 0);
+}

Added: compiler-rt/trunk/lib/tsan/tests/rtl/tsan_string.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/rtl/tsan_string.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/rtl/tsan_string.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/rtl/tsan_string.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,82 @@
+//===-- tsan_string.cc ----------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_test_util.h"
+#include "gtest/gtest.h"
+#include <string.h>
+
+namespace __tsan {
+
+TEST(ThreadSanitizer, Memcpy) {
+  char data0[7] = {1, 2, 3, 4, 5, 6, 7};
+  char data[7] = {42, 42, 42, 42, 42, 42, 42};
+  MainThread().Memcpy(data+1, data0+1, 5);
+  EXPECT_EQ(data[0], 42);
+  EXPECT_EQ(data[1], 2);
+  EXPECT_EQ(data[2], 3);
+  EXPECT_EQ(data[3], 4);
+  EXPECT_EQ(data[4], 5);
+  EXPECT_EQ(data[5], 6);
+  EXPECT_EQ(data[6], 42);
+  MainThread().Memset(data+1, 13, 5);
+  EXPECT_EQ(data[0], 42);
+  EXPECT_EQ(data[1], 13);
+  EXPECT_EQ(data[2], 13);
+  EXPECT_EQ(data[3], 13);
+  EXPECT_EQ(data[4], 13);
+  EXPECT_EQ(data[5], 13);
+  EXPECT_EQ(data[6], 42);
+}
+
+TEST(ThreadSanitizer, MemcpyRace1) {
+  char *data = new char[10];
+  char *data1 = new char[10];
+  char *data2 = new char[10];
+  ScopedThread t1, t2;
+  t1.Memcpy(data, data1, 10);
+  t2.Memcpy(data, data2, 10, true);
+}
+
+TEST(ThreadSanitizer, MemcpyRace2) {
+  char *data = new char[10];
+  char *data1 = new char[10];
+  char *data2 = new char[10];
+  ScopedThread t1, t2;
+  t1.Memcpy(data+5, data1, 1);
+  t2.Memcpy(data+3, data2, 4, true);
+}
+
+TEST(ThreadSanitizer, MemcpyRace3) {
+  char *data = new char[10];
+  char *data1 = new char[10];
+  char *data2 = new char[10];
+  ScopedThread t1, t2;
+  t1.Memcpy(data, data1, 10);
+  t2.Memcpy(data1, data2, 10, true);
+}
+
+TEST(ThreadSanitizer, MemcpyStack) {
+  char *data = new char[10];
+  char *data1 = new char[10];
+  ScopedThread t1, t2;
+  t1.Memcpy(data, data1, 10);
+  t2.Memcpy(data, data1, 10, true);
+}
+
+TEST(ThreadSanitizer, MemsetRace1) {
+  char *data = new char[10];
+  ScopedThread t1, t2;
+  t1.Memset(data, 1, 10);
+  t2.Memset(data, 2, 10, true);
+}
+
+}  // namespace __tsan

Added: compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,44 @@
+//===-- tsan_test.cc ------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_interface.h"
+#include "tsan_test_util.h"
+#include "gtest/gtest.h"
+
+static void foo() {}
+static void bar() {}
+
+TEST(ThreadSanitizer, FuncCall) {
+  ScopedThread t1, t2;
+  MemLoc l;
+  t1.Write1(l);
+  t2.Call(foo);
+  t2.Call(bar);
+  t2.Write1(l, true);
+  t2.Return();
+  t2.Return();
+}
+
+int main(int argc, char **argv) {
+  TestMutexBeforeInit();  // Mutexes must be usable before __tsan_init();
+  __tsan_init();
+  __tsan_func_entry(__builtin_return_address(0));
+  __tsan_func_entry((char*)&main + 1);
+
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  testing::InitGoogleTest(&argc, argv);
+  int res = RUN_ALL_TESTS();
+
+  __tsan_func_exit();
+  __tsan_func_exit();
+  return res;
+}

Added: compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test_util.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test_util.h?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test_util.h (added)
+++ compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test_util.h Mon Sep 17 05:02:17 2012
@@ -0,0 +1,122 @@
+//===-- tsan_test_util.h ----------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+// Test utils.
+//===----------------------------------------------------------------------===//
+#ifndef TSAN_TEST_UTIL_H
+#define TSAN_TEST_UTIL_H
+
+void TestMutexBeforeInit();
+
+// A location of memory on which a race may be detected.
+class MemLoc {
+ public:
+  explicit MemLoc(int offset_from_aligned = 0);
+  explicit MemLoc(void *const real_addr) : loc_(real_addr) { }
+  ~MemLoc();
+  void *loc() const { return loc_; }
+ private:
+  void *const loc_;
+  MemLoc(const MemLoc&);
+  void operator = (const MemLoc&);
+};
+
+class Mutex {
+ public:
+  enum Type { Normal, Spin, RW };
+
+  explicit Mutex(Type type = Normal);
+  ~Mutex();
+
+  void Init();
+  void StaticInit();  // Emulates static initalization (tsan invisible).
+  void Destroy();
+  void Lock();
+  bool TryLock();
+  void Unlock();
+  void ReadLock();
+  bool TryReadLock();
+  void ReadUnlock();
+
+ private:
+  // Placeholder for pthread_mutex_t, CRITICAL_SECTION or whatever.
+  void *mtx_[128];
+  bool alive_;
+  const Type type_;
+
+  Mutex(const Mutex&);
+  void operator = (const Mutex&);
+};
+
+// A thread is started in CTOR and joined in DTOR.
+class ScopedThread {
+ public:
+  explicit ScopedThread(bool detached = false, bool main = false);
+  ~ScopedThread();
+  void Detach();
+
+  void Access(void *addr, bool is_write, int size, bool expect_race);
+  void Read(const MemLoc &ml, int size, bool expect_race = false) {
+    Access(ml.loc(), false, size, expect_race);
+  }
+  void Write(const MemLoc &ml, int size, bool expect_race = false) {
+    Access(ml.loc(), true, size, expect_race);
+  }
+  void Read1(const MemLoc &ml, bool expect_race = false) {
+    Read(ml, 1, expect_race); }
+  void Read2(const MemLoc &ml, bool expect_race = false) {
+    Read(ml, 2, expect_race); }
+  void Read4(const MemLoc &ml, bool expect_race = false) {
+    Read(ml, 4, expect_race); }
+  void Read8(const MemLoc &ml, bool expect_race = false) {
+    Read(ml, 8, expect_race); }
+  void Write1(const MemLoc &ml, bool expect_race = false) {
+    Write(ml, 1, expect_race); }
+  void Write2(const MemLoc &ml, bool expect_race = false) {
+    Write(ml, 2, expect_race); }
+  void Write4(const MemLoc &ml, bool expect_race = false) {
+    Write(ml, 4, expect_race); }
+  void Write8(const MemLoc &ml, bool expect_race = false) {
+    Write(ml, 8, expect_race); }
+
+  void VptrUpdate(const MemLoc &vptr, const MemLoc &new_val,
+                  bool expect_race = false);
+
+  void Call(void(*pc)());
+  void Return();
+
+  void Create(const Mutex &m);
+  void Destroy(const Mutex &m);
+  void Lock(const Mutex &m);
+  bool TryLock(const Mutex &m);
+  void Unlock(const Mutex &m);
+  void ReadLock(const Mutex &m);
+  bool TryReadLock(const Mutex &m);
+  void ReadUnlock(const Mutex &m);
+
+  void Memcpy(void *dst, const void *src, int size, bool expect_race = false);
+  void Memset(void *dst, int val, int size, bool expect_race = false);
+
+ private:
+  struct Impl;
+  Impl *impl_;
+  ScopedThread(const ScopedThread&);  // Not implemented.
+  void operator = (const ScopedThread&);  // Not implemented.
+};
+
+class MainThread : public ScopedThread {
+ public:
+  MainThread()
+    : ScopedThread(false, true) {
+  }
+};
+
+#endif  // #ifndef TSAN_TEST_UTIL_H

Added: compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test_util_linux.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test_util_linux.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test_util_linux.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/rtl/tsan_test_util_linux.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,465 @@
+
+//===-- tsan_test_util_linux.cc -------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+// Test utils, linux implementation.
+//===----------------------------------------------------------------------===//
+
+#include "sanitizer_common/sanitizer_atomic.h"
+#include "tsan_interface.h"
+#include "tsan_test_util.h"
+#include "tsan_report.h"
+
+#include "gtest/gtest.h"
+
+#include <assert.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+using namespace __tsan;  // NOLINT
+
+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;
+}
+
+static void AtExit() {
+}
+
+void TestMutexBeforeInit() {
+  // Mutexes must be usable before __tsan_init();
+  pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
+  pthread_mutex_lock(&mtx);
+  pthread_mutex_unlock(&mtx);
+  pthread_mutex_destroy(&mtx);
+  pthread_t thr;
+  pthread_create(&thr, 0, BeforeInitThread, 0);
+  pthread_join(thr, 0);
+  atexit(AtExit);
+}
+
+namespace __tsan {
+bool OnReport(const ReportDesc *rep, bool suppressed) {
+  if (expect_report) {
+    if (rep->typ != expect_report_type) {
+      printf("Expected report of type %d, got type %d\n",
+             (int)expect_report_type, (int)rep->typ);
+      EXPECT_FALSE("Wrong report type");
+      return false;
+    }
+  } else {
+    EXPECT_FALSE("Unexpected report");
+    return false;
+  }
+  expect_report_reported = true;
+  return true;
+}
+}
+
+static void* allocate_addr(int size, int offset_from_aligned = 0) {
+  static uintptr_t foo;
+  static atomic_uintptr_t uniq = {(uintptr_t)&foo};  // Some real address.
+  const int kAlign = 16;
+  CHECK(offset_from_aligned < kAlign);
+  size = (size + 2 * kAlign) & ~(kAlign - 1);
+  uintptr_t addr = atomic_fetch_add(&uniq, size, memory_order_relaxed);
+  return (void*)(addr + offset_from_aligned);
+}
+
+MemLoc::MemLoc(int offset_from_aligned)
+  : loc_(allocate_addr(16, offset_from_aligned)) {
+}
+
+MemLoc::~MemLoc() {
+}
+
+Mutex::Mutex(Type type)
+  : alive_()
+  , type_(type) {
+}
+
+Mutex::~Mutex() {
+  CHECK(!alive_);
+}
+
+void Mutex::Init() {
+  CHECK(!alive_);
+  alive_ = true;
+  if (type_ == Normal)
+    CHECK_EQ(pthread_mutex_init((pthread_mutex_t*)mtx_, 0), 0);
+  else if (type_ == Spin)
+    CHECK_EQ(pthread_spin_init((pthread_spinlock_t*)mtx_, 0), 0);
+  else if (type_ == RW)
+    CHECK_EQ(pthread_rwlock_init((pthread_rwlock_t*)mtx_, 0), 0);
+  else
+    CHECK(0);
+}
+
+void Mutex::StaticInit() {
+  CHECK(!alive_);
+  CHECK(type_ == Normal);
+  alive_ = true;
+  pthread_mutex_t tmp = PTHREAD_MUTEX_INITIALIZER;
+  memcpy(mtx_, &tmp, sizeof(tmp));
+}
+
+void Mutex::Destroy() {
+  CHECK(alive_);
+  alive_ = false;
+  if (type_ == Normal)
+    CHECK_EQ(pthread_mutex_destroy((pthread_mutex_t*)mtx_), 0);
+  else if (type_ == Spin)
+    CHECK_EQ(pthread_spin_destroy((pthread_spinlock_t*)mtx_), 0);
+  else if (type_ == RW)
+    CHECK_EQ(pthread_rwlock_destroy((pthread_rwlock_t*)mtx_), 0);
+}
+
+void Mutex::Lock() {
+  CHECK(alive_);
+  if (type_ == Normal)
+    CHECK_EQ(pthread_mutex_lock((pthread_mutex_t*)mtx_), 0);
+  else if (type_ == Spin)
+    CHECK_EQ(pthread_spin_lock((pthread_spinlock_t*)mtx_), 0);
+  else if (type_ == RW)
+    CHECK_EQ(pthread_rwlock_wrlock((pthread_rwlock_t*)mtx_), 0);
+}
+
+bool Mutex::TryLock() {
+  CHECK(alive_);
+  if (type_ == Normal)
+    return pthread_mutex_trylock((pthread_mutex_t*)mtx_) == 0;
+  else if (type_ == Spin)
+    return pthread_spin_trylock((pthread_spinlock_t*)mtx_) == 0;
+  else if (type_ == RW)
+    return pthread_rwlock_trywrlock((pthread_rwlock_t*)mtx_) == 0;
+  return false;
+}
+
+void Mutex::Unlock() {
+  CHECK(alive_);
+  if (type_ == Normal)
+    CHECK_EQ(pthread_mutex_unlock((pthread_mutex_t*)mtx_), 0);
+  else if (type_ == Spin)
+    CHECK_EQ(pthread_spin_unlock((pthread_spinlock_t*)mtx_), 0);
+  else if (type_ == RW)
+    CHECK_EQ(pthread_rwlock_unlock((pthread_rwlock_t*)mtx_), 0);
+}
+
+void Mutex::ReadLock() {
+  CHECK(alive_);
+  CHECK(type_ == RW);
+  CHECK_EQ(pthread_rwlock_rdlock((pthread_rwlock_t*)mtx_), 0);
+}
+
+bool Mutex::TryReadLock() {
+  CHECK(alive_);
+  CHECK(type_ == RW);
+  return pthread_rwlock_tryrdlock((pthread_rwlock_t*)mtx_) ==  0;
+}
+
+void Mutex::ReadUnlock() {
+  CHECK(alive_);
+  CHECK(type_ == RW);
+  CHECK_EQ(pthread_rwlock_unlock((pthread_rwlock_t*)mtx_), 0);
+}
+
+struct Event {
+  enum Type {
+    SHUTDOWN,
+    READ,
+    WRITE,
+    VPTR_UPDATE,
+    CALL,
+    RETURN,
+    MUTEX_CREATE,
+    MUTEX_DESTROY,
+    MUTEX_LOCK,
+    MUTEX_TRYLOCK,
+    MUTEX_UNLOCK,
+    MUTEX_READLOCK,
+    MUTEX_TRYREADLOCK,
+    MUTEX_READUNLOCK,
+    MEMCPY,
+    MEMSET
+  };
+  Type type;
+  void *ptr;
+  uptr arg;
+  uptr arg2;
+  bool res;
+  bool expect_report;
+  ReportType report_type;
+
+  Event(Type type, const void *ptr = 0, uptr arg = 0, uptr arg2 = 0)
+    : type(type)
+    , ptr(const_cast<void*>(ptr))
+    , arg(arg)
+    , arg2(arg2)
+    , res()
+    , expect_report()
+    , report_type() {
+  }
+
+  void ExpectReport(ReportType type) {
+    expect_report = true;
+    report_type = type;
+  }
+};
+
+struct ScopedThread::Impl {
+  pthread_t thread;
+  bool main;
+  bool detached;
+  atomic_uintptr_t event;  // Event*
+
+  static void *ScopedThreadCallback(void *arg);
+  void send(Event *ev);
+  void HandleEvent(Event *ev);
+};
+
+void ScopedThread::Impl::HandleEvent(Event *ev) {
+  CHECK_EQ(expect_report, false);
+  expect_report = ev->expect_report;
+  expect_report_reported = false;
+  expect_report_type = ev->report_type;
+  switch (ev->type) {
+  case Event::READ:
+  case Event::WRITE: {
+    void (*tsan_mop)(void *addr) = 0;
+    if (ev->type == Event::READ) {
+      switch (ev->arg /*size*/) {
+        case 1: tsan_mop = __tsan_read1; break;
+        case 2: tsan_mop = __tsan_read2; break;
+        case 4: tsan_mop = __tsan_read4; break;
+        case 8: tsan_mop = __tsan_read8; break;
+        case 16: tsan_mop = __tsan_read16; break;
+      }
+    } else {
+      switch (ev->arg /*size*/) {
+        case 1: tsan_mop = __tsan_write1; break;
+        case 2: tsan_mop = __tsan_write2; break;
+        case 4: tsan_mop = __tsan_write4; break;
+        case 8: tsan_mop = __tsan_write8; break;
+        case 16: tsan_mop = __tsan_write16; break;
+      }
+    }
+    CHECK_NE(tsan_mop, 0);
+    errno = ECHRNG;
+    tsan_mop(ev->ptr);
+    CHECK_EQ(errno, ECHRNG);  // In no case must errno be changed.
+    break;
+  }
+  case Event::VPTR_UPDATE:
+    __tsan_vptr_update((void**)ev->ptr, (void*)ev->arg);
+    break;
+  case Event::CALL:
+    __tsan_func_entry((void*)((uptr)ev->ptr));
+    break;
+  case Event::RETURN:
+    __tsan_func_exit();
+    break;
+  case Event::MUTEX_CREATE:
+    static_cast<Mutex*>(ev->ptr)->Init();
+    break;
+  case Event::MUTEX_DESTROY:
+    static_cast<Mutex*>(ev->ptr)->Destroy();
+    break;
+  case Event::MUTEX_LOCK:
+    static_cast<Mutex*>(ev->ptr)->Lock();
+    break;
+  case Event::MUTEX_TRYLOCK:
+    ev->res = static_cast<Mutex*>(ev->ptr)->TryLock();
+    break;
+  case Event::MUTEX_UNLOCK:
+    static_cast<Mutex*>(ev->ptr)->Unlock();
+    break;
+  case Event::MUTEX_READLOCK:
+    static_cast<Mutex*>(ev->ptr)->ReadLock();
+    break;
+  case Event::MUTEX_TRYREADLOCK:
+    ev->res = static_cast<Mutex*>(ev->ptr)->TryReadLock();
+    break;
+  case Event::MUTEX_READUNLOCK:
+    static_cast<Mutex*>(ev->ptr)->ReadUnlock();
+    break;
+  case Event::MEMCPY:
+    __interceptor_memcpy(ev->ptr, (void*)ev->arg, ev->arg2);
+    break;
+  case Event::MEMSET:
+    __interceptor_memset(ev->ptr, ev->arg, ev->arg2);
+    break;
+  default: CHECK(0);
+  }
+  if (expect_report && !expect_report_reported) {
+    printf("Missed expected report of type %d\n", (int)ev->report_type);
+    EXPECT_FALSE("Missed expected race");
+  }
+  expect_report = false;
+}
+
+void *ScopedThread::Impl::ScopedThreadCallback(void *arg) {
+  __tsan_func_entry(__builtin_return_address(0));
+  Impl *impl = (Impl*)arg;
+  for (;;) {
+    Event* ev = (Event*)atomic_load(&impl->event, memory_order_acquire);
+    if (ev == 0) {
+      pthread_yield();
+      continue;
+    }
+    if (ev->type == Event::SHUTDOWN) {
+      atomic_store(&impl->event, 0, memory_order_release);
+      break;
+    }
+    impl->HandleEvent(ev);
+    atomic_store(&impl->event, 0, memory_order_release);
+  }
+  __tsan_func_exit();
+  return 0;
+}
+
+void ScopedThread::Impl::send(Event *e) {
+  if (main) {
+    HandleEvent(e);
+  } else {
+    CHECK_EQ(atomic_load(&event, memory_order_relaxed), 0);
+    atomic_store(&event, (uintptr_t)e, memory_order_release);
+    while (atomic_load(&event, memory_order_acquire) != 0)
+      pthread_yield();
+  }
+}
+
+ScopedThread::ScopedThread(bool detached, bool main) {
+  impl_ = new Impl;
+  impl_->main = main;
+  impl_->detached = detached;
+  atomic_store(&impl_->event, 0, memory_order_relaxed);
+  if (!main) {
+    pthread_attr_t attr;
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr, detached);
+    pthread_attr_setstacksize(&attr, 64*1024);
+    pthread_create(&impl_->thread, &attr,
+        ScopedThread::Impl::ScopedThreadCallback, impl_);
+  }
+}
+
+ScopedThread::~ScopedThread() {
+  if (!impl_->main) {
+    Event event(Event::SHUTDOWN);
+    impl_->send(&event);
+    if (!impl_->detached)
+      pthread_join(impl_->thread, 0);
+  }
+  delete impl_;
+}
+
+void ScopedThread::Detach() {
+  CHECK(!impl_->main);
+  CHECK(!impl_->detached);
+  impl_->detached = true;
+  pthread_detach(impl_->thread);
+}
+
+void ScopedThread::Access(void *addr, bool is_write,
+                          int size, bool expect_race) {
+  Event event(is_write ? Event::WRITE : Event::READ, addr, size);
+  if (expect_race)
+    event.ExpectReport(ReportTypeRace);
+  impl_->send(&event);
+}
+
+void ScopedThread::VptrUpdate(const MemLoc &vptr,
+                              const MemLoc &new_val,
+                              bool expect_race) {
+  Event event(Event::VPTR_UPDATE, vptr.loc(), (uptr)new_val.loc());
+  if (expect_race)
+    event.ExpectReport(ReportTypeRace);
+  impl_->send(&event);
+}
+
+void ScopedThread::Call(void(*pc)()) {
+  Event event(Event::CALL, (void*)pc);
+  impl_->send(&event);
+}
+
+void ScopedThread::Return() {
+  Event event(Event::RETURN);
+  impl_->send(&event);
+}
+
+void ScopedThread::Create(const Mutex &m) {
+  Event event(Event::MUTEX_CREATE, &m);
+  impl_->send(&event);
+}
+
+void ScopedThread::Destroy(const Mutex &m) {
+  Event event(Event::MUTEX_DESTROY, &m);
+  impl_->send(&event);
+}
+
+void ScopedThread::Lock(const Mutex &m) {
+  Event event(Event::MUTEX_LOCK, &m);
+  impl_->send(&event);
+}
+
+bool ScopedThread::TryLock(const Mutex &m) {
+  Event event(Event::MUTEX_TRYLOCK, &m);
+  impl_->send(&event);
+  return event.res;
+}
+
+void ScopedThread::Unlock(const Mutex &m) {
+  Event event(Event::MUTEX_UNLOCK, &m);
+  impl_->send(&event);
+}
+
+void ScopedThread::ReadLock(const Mutex &m) {
+  Event event(Event::MUTEX_READLOCK, &m);
+  impl_->send(&event);
+}
+
+bool ScopedThread::TryReadLock(const Mutex &m) {
+  Event event(Event::MUTEX_TRYREADLOCK, &m);
+  impl_->send(&event);
+  return event.res;
+}
+
+void ScopedThread::ReadUnlock(const Mutex &m) {
+  Event event(Event::MUTEX_READUNLOCK, &m);
+  impl_->send(&event);
+}
+
+void ScopedThread::Memcpy(void *dst, const void *src, int size,
+                          bool expect_race) {
+  Event event(Event::MEMCPY, dst, (uptr)src, size);
+  if (expect_race)
+    event.ExpectReport(ReportTypeRace);
+  impl_->send(&event);
+}
+
+void ScopedThread::Memset(void *dst, int val, int size,
+                          bool expect_race) {
+  Event event(Event::MEMSET, dst, val, size);
+  if (expect_race)
+    event.ExpectReport(ReportTypeRace);
+  impl_->send(&event);
+}

Added: compiler-rt/trunk/lib/tsan/tests/rtl/tsan_thread.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/rtl/tsan_thread.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/rtl/tsan_thread.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/rtl/tsan_thread.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,59 @@
+//===-- tsan_thread.cc ----------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_test_util.h"
+#include "gtest/gtest.h"
+
+TEST(ThreadSanitizer, ThreadSync) {
+  MainThread t0;
+  MemLoc l;
+  t0.Write1(l);
+  {
+    ScopedThread t1;
+    t1.Write1(l);
+  }
+  t0.Write1(l);
+}
+
+TEST(ThreadSanitizer, ThreadDetach1) {
+  ScopedThread t1(true);
+  MemLoc l;
+  t1.Write1(l);
+}
+
+TEST(ThreadSanitizer, ThreadDetach2) {
+  ScopedThread t1;
+  MemLoc l;
+  t1.Write1(l);
+  t1.Detach();
+}
+
+static void *thread_alot_func(void *arg) {
+  (void)arg;
+  int usleep(unsigned);
+  usleep(50);
+  return 0;
+}
+
+TEST(DISABLED_SLOW_ThreadSanitizer, ThreadALot) {
+  const int kThreads = 70000;
+  const int kAlive = 1000;
+  pthread_t threads[kAlive] = {};
+  for (int i = 0; i < kThreads; i++) {
+    if (threads[i % kAlive])
+      pthread_join(threads[i % kAlive], 0);
+    pthread_create(&threads[i % kAlive], 0, thread_alot_func, 0);
+  }
+  for (int i = 0; i < kAlive; i++) {
+    pthread_join(threads[i], 0);
+  }
+}

Added: compiler-rt/trunk/lib/tsan/tests/unit/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/CMakeLists.txt?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/CMakeLists.txt (added)
+++ compiler-rt/trunk/lib/tsan/tests/unit/CMakeLists.txt Mon Sep 17 05:02:17 2012
@@ -0,0 +1,15 @@
+set(TSAN_UNIT_TESTS
+  tsan_clock_test.cc
+  tsan_flags_test.cc
+  tsan_mman_test.cc
+  tsan_mutex_test.cc
+  tsan_platform_test.cc
+  tsan_printf_test.cc
+  tsan_shadow_test.cc
+  tsan_stack_test.cc
+  tsan_suppressions_test.cc
+  tsan_sync_test.cc
+  tsan_vector_test.cc
+  )
+
+add_tsan_unittest(TsanUnitTest ${TSAN_UNIT_TESTS})

Added: compiler-rt/trunk/lib/tsan/tests/unit/tsan_clock_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_clock_test.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_clock_test.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_clock_test.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,123 @@
+//===-- tsan_clock_test.cc ------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_clock.h"
+#include "tsan_rtl.h"
+#include "gtest/gtest.h"
+
+namespace __tsan {
+
+TEST(Clock, VectorBasic) {
+  ScopedInRtl in_rtl;
+  ThreadClock clk;
+  CHECK_EQ(clk.size(), 0);
+  clk.tick(0);
+  CHECK_EQ(clk.size(), 1);
+  CHECK_EQ(clk.get(0), 1);
+  clk.tick(3);
+  CHECK_EQ(clk.size(), 4);
+  CHECK_EQ(clk.get(0), 1);
+  CHECK_EQ(clk.get(1), 0);
+  CHECK_EQ(clk.get(2), 0);
+  CHECK_EQ(clk.get(3), 1);
+  clk.tick(3);
+  CHECK_EQ(clk.get(3), 2);
+}
+
+TEST(Clock, ChunkedBasic) {
+  ScopedInRtl in_rtl;
+  ThreadClock vector;
+  SyncClock chunked;
+  CHECK_EQ(vector.size(), 0);
+  CHECK_EQ(chunked.size(), 0);
+  vector.acquire(&chunked);
+  CHECK_EQ(vector.size(), 0);
+  CHECK_EQ(chunked.size(), 0);
+  vector.release(&chunked);
+  CHECK_EQ(vector.size(), 0);
+  CHECK_EQ(chunked.size(), 0);
+  vector.acq_rel(&chunked);
+  CHECK_EQ(vector.size(), 0);
+  CHECK_EQ(chunked.size(), 0);
+}
+
+TEST(Clock, AcquireRelease) {
+  ScopedInRtl in_rtl;
+  ThreadClock vector1;
+  vector1.tick(100);
+  SyncClock chunked;
+  vector1.release(&chunked);
+  CHECK_EQ(chunked.size(), 101);
+  ThreadClock vector2;
+  vector2.acquire(&chunked);
+  CHECK_EQ(vector2.size(), 101);
+  CHECK_EQ(vector2.get(0), 0);
+  CHECK_EQ(vector2.get(1), 0);
+  CHECK_EQ(vector2.get(99), 0);
+  CHECK_EQ(vector2.get(100), 1);
+}
+
+TEST(Clock, ManyThreads) {
+  ScopedInRtl in_rtl;
+  SyncClock chunked;
+  for (int i = 0; i < 100; i++) {
+    ThreadClock vector;
+    vector.tick(i);
+    vector.release(&chunked);
+    CHECK_EQ(chunked.size(), i + 1);
+    vector.acquire(&chunked);
+    CHECK_EQ(vector.size(), i + 1);
+  }
+  ThreadClock vector;
+  vector.acquire(&chunked);
+  CHECK_EQ(vector.size(), 100);
+  for (int i = 0; i < 100; i++)
+    CHECK_EQ(vector.get(i), 1);
+}
+
+TEST(Clock, DifferentSizes) {
+  ScopedInRtl in_rtl;
+  {
+    ThreadClock vector1;
+    vector1.tick(10);
+    ThreadClock vector2;
+    vector2.tick(20);
+    {
+      SyncClock chunked;
+      vector1.release(&chunked);
+      CHECK_EQ(chunked.size(), 11);
+      vector2.release(&chunked);
+      CHECK_EQ(chunked.size(), 21);
+    }
+    {
+      SyncClock chunked;
+      vector2.release(&chunked);
+      CHECK_EQ(chunked.size(), 21);
+      vector1.release(&chunked);
+      CHECK_EQ(chunked.size(), 21);
+    }
+    {
+      SyncClock chunked;
+      vector1.release(&chunked);
+      vector2.acquire(&chunked);
+      CHECK_EQ(vector2.size(), 21);
+    }
+    {
+      SyncClock chunked;
+      vector2.release(&chunked);
+      vector1.acquire(&chunked);
+      CHECK_EQ(vector1.size(), 21);
+    }
+  }
+}
+
+}  // namespace __tsan

Added: compiler-rt/trunk/lib/tsan/tests/unit/tsan_flags_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_flags_test.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_flags_test.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_flags_test.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,38 @@
+//===-- tsan_flags_test.cc ------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_flags.h"
+#include "tsan_rtl.h"
+#include "gtest/gtest.h"
+
+namespace __tsan {
+
+TEST(Flags, Basic) {
+  ScopedInRtl in_rtl;
+  // At least should not crash.
+  Flags f = {};
+  InitializeFlags(&f, 0);
+  InitializeFlags(&f, "");
+}
+
+TEST(Flags, DefaultValues) {
+  ScopedInRtl in_rtl;
+  Flags f = {};
+
+  f.enable_annotations = false;
+  f.exitcode = -11;
+  InitializeFlags(&f, "");
+  EXPECT_EQ(66, f.exitcode);
+  EXPECT_EQ(true, f.enable_annotations);
+}
+
+}  // namespace __tsan

Added: compiler-rt/trunk/lib/tsan/tests/unit/tsan_mman_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_mman_test.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_mman_test.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_mman_test.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,109 @@
+//===-- tsan_mman_test.cc -------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_mman.h"
+#include "tsan_rtl.h"
+#include "gtest/gtest.h"
+
+namespace __tsan {
+
+TEST(Mman, Internal) {
+  ScopedInRtl in_rtl;
+  char *p = (char*)internal_alloc(MBlockScopedBuf, 10);
+  EXPECT_NE(p, (char*)0);
+  char *p2 = (char*)internal_alloc(MBlockScopedBuf, 20);
+  EXPECT_NE(p2, (char*)0);
+  EXPECT_NE(p2, p);
+  for (int i = 0; i < 10; i++) {
+    p[i] = 42;
+  }
+  for (int i = 0; i < 20; i++) {
+    ((char*)p2)[i] = 42;
+  }
+  internal_free(p);
+  internal_free(p2);
+}
+
+TEST(Mman, User) {
+  ScopedInRtl in_rtl;
+  ThreadState *thr = cur_thread();
+  uptr pc = 0;
+  char *p = (char*)user_alloc(thr, pc, 10);
+  EXPECT_NE(p, (char*)0);
+  char *p2 = (char*)user_alloc(thr, pc, 20);
+  EXPECT_NE(p2, (char*)0);
+  EXPECT_NE(p2, p);
+  MBlock *b = user_mblock(thr, p);
+  EXPECT_NE(b, (MBlock*)0);
+  EXPECT_EQ(b->size, (uptr)10);
+  MBlock *b2 = user_mblock(thr, p2);
+  EXPECT_NE(b2, (MBlock*)0);
+  EXPECT_EQ(b2->size, (uptr)20);
+  for (int i = 0; i < 10; i++) {
+    p[i] = 42;
+    EXPECT_EQ(b, user_mblock(thr, p + i));
+  }
+  for (int i = 0; i < 20; i++) {
+    ((char*)p2)[i] = 42;
+    EXPECT_EQ(b2, user_mblock(thr, p2 + i));
+  }
+  user_free(thr, pc, p);
+  user_free(thr, pc, p2);
+}
+
+TEST(Mman, UserRealloc) {
+  ScopedInRtl in_rtl;
+  ThreadState *thr = cur_thread();
+  uptr pc = 0;
+  {
+    void *p = user_realloc(thr, pc, 0, 0);
+    // Strictly saying this is incorrect, realloc(NULL, N) is equivalent to
+    // malloc(N), thus must return non-NULL pointer.
+    EXPECT_EQ(p, (void*)0);
+  }
+  {
+    void *p = user_realloc(thr, pc, 0, 100);
+    EXPECT_NE(p, (void*)0);
+    memset(p, 0xde, 100);
+    user_free(thr, pc, p);
+  }
+  {
+    void *p = user_alloc(thr, pc, 100);
+    EXPECT_NE(p, (void*)0);
+    memset(p, 0xde, 100);
+    void *p2 = user_realloc(thr, pc, p, 0);
+    EXPECT_EQ(p2, (void*)0);
+  }
+  {
+    void *p = user_realloc(thr, pc, 0, 100);
+    EXPECT_NE(p, (void*)0);
+    memset(p, 0xde, 100);
+    void *p2 = user_realloc(thr, pc, p, 10000);
+    EXPECT_NE(p2, (void*)0);
+    for (int i = 0; i < 100; i++)
+      EXPECT_EQ(((char*)p2)[i], (char)0xde);
+    memset(p2, 0xde, 10000);
+    user_free(thr, pc, p2);
+  }
+  {
+    void *p = user_realloc(thr, pc, 0, 10000);
+    EXPECT_NE(p, (void*)0);
+    memset(p, 0xde, 10000);
+    void *p2 = user_realloc(thr, pc, p, 10);
+    EXPECT_NE(p2, (void*)0);
+    for (int i = 0; i < 10; i++)
+      EXPECT_EQ(((char*)p2)[i], (char)0xde);
+    user_free(thr, pc, p2);
+  }
+}
+
+}  // namespace __tsan

Added: compiler-rt/trunk/lib/tsan/tests/unit/tsan_mutex_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_mutex_test.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_mutex_test.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_mutex_test.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,126 @@
+//===-- tsan_mutex_test.cc ------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "sanitizer_common/sanitizer_internal_defs.h"
+#include "sanitizer_common/sanitizer_atomic.h"
+#include "sanitizer_common/sanitizer_common.h"
+#include "sanitizer_common/sanitizer_mutex.h"
+#include "tsan_mutex.h"
+#include "gtest/gtest.h"
+
+namespace __tsan {
+
+template<typename MutexType>
+class TestData {
+ public:
+  explicit TestData(MutexType *mtx)
+    : mtx_(mtx) {
+    for (int i = 0; i < kSize; i++)
+      data_[i] = 0;
+  }
+
+  void Write() {
+    Lock l(mtx_);
+    T v0 = data_[0];
+    for (int i = 0; i < kSize; i++) {
+      CHECK_EQ(data_[i], v0);
+      data_[i]++;
+    }
+  }
+
+  void Read() {
+    ReadLock l(mtx_);
+    T v0 = data_[0];
+    for (int i = 0; i < kSize; i++) {
+      CHECK_EQ(data_[i], v0);
+    }
+  }
+
+  void Backoff() {
+    volatile T data[kSize] = {};
+    for (int i = 0; i < kSize; i++) {
+      data[i]++;
+      CHECK_EQ(data[i], 1);
+    }
+  }
+
+ private:
+  typedef GenericScopedLock<MutexType> Lock;
+  static const int kSize = 64;
+  typedef u64 T;
+  MutexType *mtx_;
+  char pad_[kCacheLineSize];
+  T data_[kSize];
+};
+
+const int kThreads = 8;
+const int kWriteRate = 1024;
+#if TSAN_DEBUG
+const int kIters = 16*1024;
+#else
+const int kIters = 64*1024;
+#endif
+
+template<typename MutexType>
+static void *write_mutex_thread(void *param) {
+  TestData<MutexType> *data = (TestData<MutexType>*)param;
+  for (int i = 0; i < kIters; i++) {
+    data->Write();
+    data->Backoff();
+  }
+  return 0;
+}
+
+template<typename MutexType>
+static void *read_mutex_thread(void *param) {
+  TestData<MutexType> *data = (TestData<MutexType>*)param;
+  for (int i = 0; i < kIters; i++) {
+    if ((i % kWriteRate) == 0)
+      data->Write();
+    else
+      data->Read();
+    data->Backoff();
+  }
+  return 0;
+}
+
+TEST(Mutex, Write) {
+  Mutex mtx(MutexTypeAnnotations, StatMtxAnnotations);
+  TestData<Mutex> data(&mtx);
+  pthread_t threads[kThreads];
+  for (int i = 0; i < kThreads; i++)
+    pthread_create(&threads[i], 0, write_mutex_thread<Mutex>, &data);
+  for (int i = 0; i < kThreads; i++)
+    pthread_join(threads[i], 0);
+}
+
+TEST(Mutex, ReadWrite) {
+  Mutex mtx(MutexTypeAnnotations, StatMtxAnnotations);
+  TestData<Mutex> data(&mtx);
+  pthread_t threads[kThreads];
+  for (int i = 0; i < kThreads; i++)
+    pthread_create(&threads[i], 0, read_mutex_thread<Mutex>, &data);
+  for (int i = 0; i < kThreads; i++)
+    pthread_join(threads[i], 0);
+}
+
+TEST(Mutex, SpinWrite) {
+  SpinMutex mtx;
+  TestData<SpinMutex> data(&mtx);
+  pthread_t threads[kThreads];
+  for (int i = 0; i < kThreads; i++)
+    pthread_create(&threads[i], 0, write_mutex_thread<SpinMutex>, &data);
+  for (int i = 0; i < kThreads; i++)
+    pthread_join(threads[i], 0);
+}
+
+}  // namespace __tsan

Added: compiler-rt/trunk/lib/tsan/tests/unit/tsan_platform_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_platform_test.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_platform_test.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_platform_test.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,88 @@
+//===-- tsan_platform_test.cc ---------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "sanitizer_common/sanitizer_libc.h"
+#include "tsan_platform.h"
+#include "gtest/gtest.h"
+
+namespace __tsan {
+
+static void TestThreadInfo(bool main) {
+  ScopedInRtl in_rtl;
+  uptr stk_addr = 0;
+  uptr stk_size = 0;
+  uptr tls_addr = 0;
+  uptr tls_size = 0;
+  GetThreadStackAndTls(main, &stk_addr, &stk_size, &tls_addr, &tls_size);
+  // Printf("stk=%zx-%zx(%zu)\n", stk_addr, stk_addr + stk_size, stk_size);
+  // Printf("tls=%zx-%zx(%zu)\n", tls_addr, tls_addr + tls_size, tls_size);
+
+  int stack_var;
+  EXPECT_NE(stk_addr, (uptr)0);
+  EXPECT_NE(stk_size, (uptr)0);
+  EXPECT_GT((uptr)&stack_var, stk_addr);
+  EXPECT_LT((uptr)&stack_var, stk_addr + stk_size);
+
+  static __thread int thread_var;
+  EXPECT_NE(tls_addr, (uptr)0);
+  EXPECT_NE(tls_size, (uptr)0);
+  EXPECT_GT((uptr)&thread_var, tls_addr);
+  EXPECT_LT((uptr)&thread_var, tls_addr + tls_size);
+
+  // Ensure that tls and stack do not intersect.
+  uptr tls_end = tls_addr + tls_size;
+  EXPECT_TRUE(tls_addr < stk_addr || tls_addr >= stk_addr + stk_size);
+  EXPECT_TRUE(tls_end  < stk_addr || tls_end  >=  stk_addr + stk_size);
+  EXPECT_TRUE((tls_addr < stk_addr) == (tls_end  < stk_addr));
+}
+
+static void *WorkerThread(void *arg) {
+  TestThreadInfo(false);
+  return 0;
+}
+
+TEST(Platform, ThreadInfoMain) {
+  TestThreadInfo(true);
+}
+
+TEST(Platform, ThreadInfoWorker) {
+  pthread_t t;
+  pthread_create(&t, 0, WorkerThread, 0);
+  pthread_join(t, 0);
+}
+
+TEST(Platform, FileOps) {
+  const char *str1 = "qwerty";
+  uptr len1 = internal_strlen(str1);
+  const char *str2 = "zxcv";
+  uptr len2 = internal_strlen(str2);
+
+  fd_t fd = internal_open("./tsan_test.tmp", true);
+  EXPECT_NE(fd, kInvalidFd);
+  EXPECT_EQ(len1, internal_write(fd, str1, len1));
+  EXPECT_EQ(len2, internal_write(fd, str2, len2));
+  internal_close(fd);
+
+  fd = internal_open("./tsan_test.tmp", false);
+  EXPECT_NE(fd, kInvalidFd);
+  EXPECT_EQ(len1 + len2, internal_filesize(fd));
+  char buf[64] = {};
+  EXPECT_EQ(len1, internal_read(fd, buf, len1));
+  EXPECT_EQ(0, internal_memcmp(buf, str1, len1));
+  EXPECT_EQ((char)0, buf[len1 + 1]);
+  internal_memset(buf, 0, len1);
+  EXPECT_EQ(len2, internal_read(fd, buf, len2));
+  EXPECT_EQ(0, internal_memcmp(buf, str2, len2));
+  internal_close(fd);
+}
+
+}  // namespace __tsan

Added: compiler-rt/trunk/lib/tsan/tests/unit/tsan_printf_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_printf_test.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_printf_test.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_printf_test.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,106 @@
+//===-- tsan_printf_test.cc -----------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_rtl.h"
+#include "gtest/gtest.h"
+
+#include <string.h>
+#include <limits.h>
+
+namespace __tsan {
+
+TEST(Printf, Basic) {
+  char buf[1024];
+  uptr len = internal_snprintf(buf, sizeof(buf),
+      "a%db%zdc%ue%zuf%xh%zxq%pe%sr",
+      (int)-1, (long)-2, // NOLINT
+      (unsigned)-4, (unsigned long)5, // NOLINT
+      (unsigned)10, (unsigned long)11, // NOLINT
+      (void*)0x123, "_string_");
+  EXPECT_EQ(len, strlen(buf));
+  EXPECT_EQ(0, strcmp(buf, "a-1b-2c4294967292e5fahbq"
+                           "0x000000000123e_string_r"));
+}
+
+TEST(Printf, OverflowStr) {
+  char buf[] = "123456789";
+  uptr len = internal_snprintf(buf, 4, "%s", "abcdef");  // NOLINT
+  EXPECT_EQ(len, (uptr)6);
+  EXPECT_EQ(0, strcmp(buf, "abc"));
+  EXPECT_EQ(buf[3], 0);
+  EXPECT_EQ(buf[4], '5');
+  EXPECT_EQ(buf[5], '6');
+  EXPECT_EQ(buf[6], '7');
+  EXPECT_EQ(buf[7], '8');
+  EXPECT_EQ(buf[8], '9');
+  EXPECT_EQ(buf[9], 0);
+}
+
+TEST(Printf, OverflowInt) {
+  char buf[] = "123456789";
+  internal_snprintf(buf, 4, "%d", -123456789);  // NOLINT
+  EXPECT_EQ(0, strcmp(buf, "-12"));
+  EXPECT_EQ(buf[3], 0);
+  EXPECT_EQ(buf[4], '5');
+  EXPECT_EQ(buf[5], '6');
+  EXPECT_EQ(buf[6], '7');
+  EXPECT_EQ(buf[7], '8');
+  EXPECT_EQ(buf[8], '9');
+  EXPECT_EQ(buf[9], 0);
+}
+
+TEST(Printf, OverflowUint) {
+  char buf[] = "123456789";
+  internal_snprintf(buf, 4, "a%zx", (unsigned long)0x123456789);  // NOLINT
+  EXPECT_EQ(0, strcmp(buf, "a12"));
+  EXPECT_EQ(buf[3], 0);
+  EXPECT_EQ(buf[4], '5');
+  EXPECT_EQ(buf[5], '6');
+  EXPECT_EQ(buf[6], '7');
+  EXPECT_EQ(buf[7], '8');
+  EXPECT_EQ(buf[8], '9');
+  EXPECT_EQ(buf[9], 0);
+}
+
+TEST(Printf, OverflowPtr) {
+  char buf[] = "123456789";
+  internal_snprintf(buf, 4, "%p", (void*)0x123456789);  // NOLINT
+  EXPECT_EQ(0, strcmp(buf, "0x0"));
+  EXPECT_EQ(buf[3], 0);
+  EXPECT_EQ(buf[4], '5');
+  EXPECT_EQ(buf[5], '6');
+  EXPECT_EQ(buf[6], '7');
+  EXPECT_EQ(buf[7], '8');
+  EXPECT_EQ(buf[8], '9');
+  EXPECT_EQ(buf[9], 0);
+}
+
+template<typename T>
+static void TestMinMax(const char *fmt, T min, T max) {
+  char buf[1024];
+  uptr len = internal_snprintf(buf, sizeof(buf), fmt, min, max);
+  char buf2[1024];
+  snprintf(buf2, sizeof(buf2), fmt, min, max);
+  EXPECT_EQ(len, strlen(buf));
+  EXPECT_EQ(0, strcmp(buf, buf2));
+}
+
+TEST(Printf, MinMax) {
+  TestMinMax<int>("%d-%d", INT_MIN, INT_MAX);  // NOLINT
+  TestMinMax<long>("%zd-%zd", LONG_MIN, LONG_MAX);  // NOLINT
+  TestMinMax<unsigned>("%u-%u", 0, UINT_MAX);  // NOLINT
+  TestMinMax<unsigned long>("%zu-%zu", 0, ULONG_MAX);  // NOLINT
+  TestMinMax<unsigned>("%x-%x", 0, UINT_MAX);  // NOLINT
+  TestMinMax<unsigned long>("%zx-%zx", 0, ULONG_MAX);  // NOLINT
+}
+
+}  // namespace __tsan

Added: compiler-rt/trunk/lib/tsan/tests/unit/tsan_shadow_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_shadow_test.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_shadow_test.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_shadow_test.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,47 @@
+//===-- tsan_shadow_test.cc -----------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_platform.h"
+#include "gtest/gtest.h"
+
+namespace __tsan {
+
+TEST(Shadow, Mapping) {
+  static int global;
+  int stack;
+  void *heap = malloc(0);
+  free(heap);
+
+  CHECK(IsAppMem((uptr)&global));
+  CHECK(IsAppMem((uptr)&stack));
+  CHECK(IsAppMem((uptr)heap));
+
+  CHECK(IsShadowMem(MemToShadow((uptr)&global)));
+  CHECK(IsShadowMem(MemToShadow((uptr)&stack)));
+  CHECK(IsShadowMem(MemToShadow((uptr)heap)));
+}
+
+TEST(Shadow, Celling) {
+  u64 aligned_data[4];
+  char *data = (char*)aligned_data;
+  CHECK_EQ((uptr)data % kShadowSize, 0);
+  uptr s0 = MemToShadow((uptr)&data[0]);
+  CHECK_EQ(s0 % kShadowSize, 0);
+  for (unsigned i = 1; i < kShadowCell; i++)
+    CHECK_EQ(s0, MemToShadow((uptr)&data[i]));
+  for (unsigned i = kShadowCell; i < 2*kShadowCell; i++)
+    CHECK_EQ(s0 + kShadowSize*kShadowCnt, MemToShadow((uptr)&data[i]));
+  for (unsigned i = 2*kShadowCell; i < 3*kShadowCell; i++)
+    CHECK_EQ(s0 + 2*kShadowSize*kShadowCnt, MemToShadow((uptr)&data[i]));
+}
+
+}  // namespace __tsan

Added: compiler-rt/trunk/lib/tsan/tests/unit/tsan_stack_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_stack_test.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_stack_test.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_stack_test.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,80 @@
+//===-- tsan_stack_test.cc ------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_sync.h"
+#include "tsan_rtl.h"
+#include "gtest/gtest.h"
+#include <string.h>
+
+namespace __tsan {
+
+static void TestStackTrace(StackTrace *trace) {
+  ThreadState thr(0, 0, 0, 0, 0, 0, 0, 0);
+
+  trace->ObtainCurrent(&thr, 0);
+  EXPECT_EQ(trace->Size(), (uptr)0);
+
+  trace->ObtainCurrent(&thr, 42);
+  EXPECT_EQ(trace->Size(), (uptr)1);
+  EXPECT_EQ(trace->Get(0), (uptr)42);
+
+  *thr.shadow_stack_pos++ = 100;
+  *thr.shadow_stack_pos++ = 101;
+  trace->ObtainCurrent(&thr, 0);
+  EXPECT_EQ(trace->Size(), (uptr)2);
+  EXPECT_EQ(trace->Get(0), (uptr)100);
+  EXPECT_EQ(trace->Get(1), (uptr)101);
+
+  trace->ObtainCurrent(&thr, 42);
+  EXPECT_EQ(trace->Size(), (uptr)3);
+  EXPECT_EQ(trace->Get(0), (uptr)100);
+  EXPECT_EQ(trace->Get(1), (uptr)101);
+  EXPECT_EQ(trace->Get(2), (uptr)42);
+}
+
+TEST(StackTrace, Basic) {
+  ScopedInRtl in_rtl;
+  StackTrace trace;
+  TestStackTrace(&trace);
+}
+
+TEST(StackTrace, StaticBasic) {
+  ScopedInRtl in_rtl;
+  uptr buf[10];
+  StackTrace trace1(buf, 10);
+  TestStackTrace(&trace1);
+  StackTrace trace2(buf, 3);
+  TestStackTrace(&trace2);
+}
+
+TEST(StackTrace, StaticTrim) {
+  ScopedInRtl in_rtl;
+  uptr buf[2];
+  StackTrace trace(buf, 2);
+  ThreadState thr(0, 0, 0, 0, 0, 0, 0, 0);
+
+  *thr.shadow_stack_pos++ = 100;
+  *thr.shadow_stack_pos++ = 101;
+  *thr.shadow_stack_pos++ = 102;
+  trace.ObtainCurrent(&thr, 0);
+  EXPECT_EQ(trace.Size(), (uptr)2);
+  EXPECT_EQ(trace.Get(0), (uptr)101);
+  EXPECT_EQ(trace.Get(1), (uptr)102);
+
+  trace.ObtainCurrent(&thr, 42);
+  EXPECT_EQ(trace.Size(), (uptr)2);
+  EXPECT_EQ(trace.Get(0), (uptr)102);
+  EXPECT_EQ(trace.Get(1), (uptr)42);
+}
+
+
+}  // namespace __tsan

Added: compiler-rt/trunk/lib/tsan/tests/unit/tsan_suppressions_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_suppressions_test.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_suppressions_test.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_suppressions_test.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,128 @@
+//===-- tsan_suppressions_test.cc -----------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_suppressions.h"
+#include "tsan_rtl.h"
+#include "gtest/gtest.h"
+
+#include <string.h>
+
+namespace __tsan {
+
+TEST(Suppressions, Parse) {
+  ScopedInRtl in_rtl;
+  Suppression *supp0 = SuppressionParse(
+    "race:foo\n"
+    " 	race:bar\n"  // NOLINT
+    "race:baz	 \n"  // NOLINT
+    "# a comment\n"
+    "race:quz\n"
+  );  // NOLINT
+  Suppression *supp = supp0;
+  EXPECT_EQ(supp->type, SuppressionRace);
+  EXPECT_EQ(0, strcmp(supp->templ, "quz"));
+  supp = supp->next;
+  EXPECT_EQ(supp->type, SuppressionRace);
+  EXPECT_EQ(0, strcmp(supp->templ, "baz"));
+  supp = supp->next;
+  EXPECT_EQ(supp->type, SuppressionRace);
+  EXPECT_EQ(0, strcmp(supp->templ, "bar"));
+  supp = supp->next;
+  EXPECT_EQ(supp->type, SuppressionRace);
+  EXPECT_EQ(0, strcmp(supp->templ, "foo"));
+  supp = supp->next;
+  EXPECT_EQ((Suppression*)0, supp);
+}
+
+TEST(Suppressions, Parse2) {
+  ScopedInRtl in_rtl;
+  Suppression *supp0 = SuppressionParse(
+    "  	# first line comment\n"  // NOLINT
+    " 	race:bar 	\n"  // NOLINT
+    "race:baz* *baz\n"
+    "# a comment\n"
+    "# last line comment\n"
+  );  // NOLINT
+  Suppression *supp = supp0;
+  EXPECT_EQ(supp->type, SuppressionRace);
+  EXPECT_EQ(0, strcmp(supp->templ, "baz* *baz"));
+  supp = supp->next;
+  EXPECT_EQ(supp->type, SuppressionRace);
+  EXPECT_EQ(0, strcmp(supp->templ, "bar"));
+  supp = supp->next;
+  EXPECT_EQ((Suppression*)0, supp);
+}
+
+TEST(Suppressions, Parse3) {
+  ScopedInRtl in_rtl;
+  Suppression *supp0 = SuppressionParse(
+    "# last suppression w/o line-feed\n"
+    "race:foo\n"
+    "race:bar"
+  );  // NOLINT
+  Suppression *supp = supp0;
+  EXPECT_EQ(supp->type, SuppressionRace);
+  EXPECT_EQ(0, strcmp(supp->templ, "bar"));
+  supp = supp->next;
+  EXPECT_EQ(supp->type, SuppressionRace);
+  EXPECT_EQ(0, strcmp(supp->templ, "foo"));
+  supp = supp->next;
+  EXPECT_EQ((Suppression*)0, supp);
+}
+
+TEST(Suppressions, ParseType) {
+  ScopedInRtl in_rtl;
+  Suppression *supp0 = SuppressionParse(
+    "race:foo\n"
+    "thread:bar\n"
+    "mutex:baz\n"
+    "signal:quz\n"
+  );  // NOLINT
+  Suppression *supp = supp0;
+  EXPECT_EQ(supp->type, SuppressionSignal);
+  EXPECT_EQ(0, strcmp(supp->templ, "quz"));
+  supp = supp->next;
+  EXPECT_EQ(supp->type, SuppressionMutex);
+  EXPECT_EQ(0, strcmp(supp->templ, "baz"));
+  supp = supp->next;
+  EXPECT_EQ(supp->type, SuppressionThread);
+  EXPECT_EQ(0, strcmp(supp->templ, "bar"));
+  supp = supp->next;
+  EXPECT_EQ(supp->type, SuppressionRace);
+  EXPECT_EQ(0, strcmp(supp->templ, "foo"));
+  supp = supp->next;
+  EXPECT_EQ((Suppression*)0, supp);
+}
+
+static bool MyMatch(const char *templ, const char *func) {
+  char tmp[1024];
+  strcpy(tmp, templ);  // NOLINT
+  return SuppressionMatch(tmp, func);
+}
+
+TEST(Suppressions, Match) {
+  EXPECT_TRUE(MyMatch("foobar", "foobar"));
+  EXPECT_TRUE(MyMatch("foobar", "prefix_foobar_postfix"));
+  EXPECT_TRUE(MyMatch("*foobar*", "prefix_foobar_postfix"));
+  EXPECT_TRUE(MyMatch("foo*bar", "foo_middle_bar"));
+  EXPECT_TRUE(MyMatch("foo*bar", "foobar"));
+  EXPECT_TRUE(MyMatch("foo*bar*baz", "foo_middle_bar_another_baz"));
+  EXPECT_TRUE(MyMatch("foo*bar*baz", "foo_middle_barbaz"));
+
+  EXPECT_FALSE(MyMatch("foo", "baz"));
+  EXPECT_FALSE(MyMatch("foobarbaz", "foobar"));
+  EXPECT_FALSE(MyMatch("foobarbaz", "barbaz"));
+  EXPECT_FALSE(MyMatch("foo*bar", "foobaz"));
+  EXPECT_FALSE(MyMatch("foo*bar", "foo_baz"));
+}
+
+}  // namespace __tsan

Added: compiler-rt/trunk/lib/tsan/tests/unit/tsan_sync_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_sync_test.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_sync_test.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_sync_test.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,65 @@
+//===-- tsan_sync_test.cc -------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_sync.h"
+#include "tsan_rtl.h"
+#include "tsan_mman.h"
+#include "gtest/gtest.h"
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <map>
+
+namespace __tsan {
+
+TEST(Sync, Table) {
+  const uintptr_t kIters = 512*1024;
+  const uintptr_t kRange = 10000;
+
+  ScopedInRtl in_rtl;
+  ThreadState *thr = cur_thread();
+  uptr pc = 0;
+
+  SyncTab tab;
+  SyncVar *golden[kRange] = {};
+  unsigned seed = 0;
+  for (uintptr_t i = 0; i < kIters; i++) {
+    uintptr_t addr = rand_r(&seed) % (kRange - 1) + 1;
+    if (rand_r(&seed) % 2) {
+      // Get or add.
+      SyncVar *v = tab.GetAndLock(thr, pc, addr, true);
+      EXPECT_TRUE(golden[addr] == 0 || golden[addr] == v);
+      EXPECT_EQ(v->addr, addr);
+      golden[addr] = v;
+      v->mtx.Unlock();
+    } else {
+      // Remove.
+      SyncVar *v = tab.GetAndRemove(thr, pc, addr);
+      EXPECT_EQ(golden[addr], v);
+      if (v) {
+        EXPECT_EQ(v->addr, addr);
+        golden[addr] = 0;
+        DestroyAndFree(v);
+      }
+    }
+  }
+  for (uintptr_t addr = 0; addr < kRange; addr++) {
+    if (golden[addr] == 0)
+      continue;
+    SyncVar *v = tab.GetAndRemove(thr, pc, addr);
+    EXPECT_EQ(v, golden[addr]);
+    EXPECT_EQ(v->addr, addr);
+    DestroyAndFree(v);
+  }
+}
+
+}  // namespace __tsan

Added: compiler-rt/trunk/lib/tsan/tests/unit/tsan_vector_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/tests/unit/tsan_vector_test.cc?rev=164022&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/tests/unit/tsan_vector_test.cc (added)
+++ compiler-rt/trunk/lib/tsan/tests/unit/tsan_vector_test.cc Mon Sep 17 05:02:17 2012
@@ -0,0 +1,45 @@
+//===-- tsan_vector_test.cc -----------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of ThreadSanitizer (TSan), a race detector.
+//
+//===----------------------------------------------------------------------===//
+#include "tsan_vector.h"
+#include "tsan_rtl.h"
+#include "gtest/gtest.h"
+
+namespace __tsan {
+
+TEST(Vector, Basic) {
+  ScopedInRtl in_rtl;
+  Vector<int> v(MBlockScopedBuf);
+  EXPECT_EQ(v.Size(), (uptr)0);
+  v.PushBack(42);
+  EXPECT_EQ(v.Size(), (uptr)1);
+  EXPECT_EQ(v[0], 42);
+  v.PushBack(43);
+  EXPECT_EQ(v.Size(), (uptr)2);
+  EXPECT_EQ(v[0], 42);
+  EXPECT_EQ(v[1], 43);
+}
+
+TEST(Vector, Stride) {
+  ScopedInRtl in_rtl;
+  Vector<int> v(MBlockScopedBuf);
+  for (int i = 0; i < 1000; i++) {
+    v.PushBack(i);
+    EXPECT_EQ(v.Size(), (uptr)(i + 1));
+    EXPECT_EQ(v[i], i);
+  }
+  for (int i = 0; i < 1000; i++) {
+    EXPECT_EQ(v[i], i);
+  }
+}
+
+}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/unit_tests/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/CMakeLists.txt?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/unit_tests/CMakeLists.txt (original)
+++ compiler-rt/trunk/lib/tsan/unit_tests/CMakeLists.txt (removed)
@@ -1,15 +0,0 @@
-set(TSAN_UNIT_TESTS
-  tsan_clock_test.cc
-  tsan_flags_test.cc
-  tsan_mman_test.cc
-  tsan_mutex_test.cc
-  tsan_platform_test.cc
-  tsan_printf_test.cc
-  tsan_shadow_test.cc
-  tsan_stack_test.cc
-  tsan_suppressions_test.cc
-  tsan_sync_test.cc
-  tsan_vector_test.cc
-  )
-
-add_tsan_unittest(TsanUnitTest ${TSAN_UNIT_TESTS})

Removed: compiler-rt/trunk/lib/tsan/unit_tests/tsan_clock_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_clock_test.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/unit_tests/tsan_clock_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/unit_tests/tsan_clock_test.cc (removed)
@@ -1,123 +0,0 @@
-//===-- tsan_clock_test.cc ------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_clock.h"
-#include "tsan_rtl.h"
-#include "gtest/gtest.h"
-
-namespace __tsan {
-
-TEST(Clock, VectorBasic) {
-  ScopedInRtl in_rtl;
-  ThreadClock clk;
-  CHECK_EQ(clk.size(), 0);
-  clk.tick(0);
-  CHECK_EQ(clk.size(), 1);
-  CHECK_EQ(clk.get(0), 1);
-  clk.tick(3);
-  CHECK_EQ(clk.size(), 4);
-  CHECK_EQ(clk.get(0), 1);
-  CHECK_EQ(clk.get(1), 0);
-  CHECK_EQ(clk.get(2), 0);
-  CHECK_EQ(clk.get(3), 1);
-  clk.tick(3);
-  CHECK_EQ(clk.get(3), 2);
-}
-
-TEST(Clock, ChunkedBasic) {
-  ScopedInRtl in_rtl;
-  ThreadClock vector;
-  SyncClock chunked;
-  CHECK_EQ(vector.size(), 0);
-  CHECK_EQ(chunked.size(), 0);
-  vector.acquire(&chunked);
-  CHECK_EQ(vector.size(), 0);
-  CHECK_EQ(chunked.size(), 0);
-  vector.release(&chunked);
-  CHECK_EQ(vector.size(), 0);
-  CHECK_EQ(chunked.size(), 0);
-  vector.acq_rel(&chunked);
-  CHECK_EQ(vector.size(), 0);
-  CHECK_EQ(chunked.size(), 0);
-}
-
-TEST(Clock, AcquireRelease) {
-  ScopedInRtl in_rtl;
-  ThreadClock vector1;
-  vector1.tick(100);
-  SyncClock chunked;
-  vector1.release(&chunked);
-  CHECK_EQ(chunked.size(), 101);
-  ThreadClock vector2;
-  vector2.acquire(&chunked);
-  CHECK_EQ(vector2.size(), 101);
-  CHECK_EQ(vector2.get(0), 0);
-  CHECK_EQ(vector2.get(1), 0);
-  CHECK_EQ(vector2.get(99), 0);
-  CHECK_EQ(vector2.get(100), 1);
-}
-
-TEST(Clock, ManyThreads) {
-  ScopedInRtl in_rtl;
-  SyncClock chunked;
-  for (int i = 0; i < 100; i++) {
-    ThreadClock vector;
-    vector.tick(i);
-    vector.release(&chunked);
-    CHECK_EQ(chunked.size(), i + 1);
-    vector.acquire(&chunked);
-    CHECK_EQ(vector.size(), i + 1);
-  }
-  ThreadClock vector;
-  vector.acquire(&chunked);
-  CHECK_EQ(vector.size(), 100);
-  for (int i = 0; i < 100; i++)
-    CHECK_EQ(vector.get(i), 1);
-}
-
-TEST(Clock, DifferentSizes) {
-  ScopedInRtl in_rtl;
-  {
-    ThreadClock vector1;
-    vector1.tick(10);
-    ThreadClock vector2;
-    vector2.tick(20);
-    {
-      SyncClock chunked;
-      vector1.release(&chunked);
-      CHECK_EQ(chunked.size(), 11);
-      vector2.release(&chunked);
-      CHECK_EQ(chunked.size(), 21);
-    }
-    {
-      SyncClock chunked;
-      vector2.release(&chunked);
-      CHECK_EQ(chunked.size(), 21);
-      vector1.release(&chunked);
-      CHECK_EQ(chunked.size(), 21);
-    }
-    {
-      SyncClock chunked;
-      vector1.release(&chunked);
-      vector2.acquire(&chunked);
-      CHECK_EQ(vector2.size(), 21);
-    }
-    {
-      SyncClock chunked;
-      vector2.release(&chunked);
-      vector1.acquire(&chunked);
-      CHECK_EQ(vector1.size(), 21);
-    }
-  }
-}
-
-}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/unit_tests/tsan_flags_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_flags_test.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/unit_tests/tsan_flags_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/unit_tests/tsan_flags_test.cc (removed)
@@ -1,38 +0,0 @@
-//===-- tsan_flags_test.cc ------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_flags.h"
-#include "tsan_rtl.h"
-#include "gtest/gtest.h"
-
-namespace __tsan {
-
-TEST(Flags, Basic) {
-  ScopedInRtl in_rtl;
-  // At least should not crash.
-  Flags f = {};
-  InitializeFlags(&f, 0);
-  InitializeFlags(&f, "");
-}
-
-TEST(Flags, DefaultValues) {
-  ScopedInRtl in_rtl;
-  Flags f = {};
-
-  f.enable_annotations = false;
-  f.exitcode = -11;
-  InitializeFlags(&f, "");
-  EXPECT_EQ(66, f.exitcode);
-  EXPECT_EQ(true, f.enable_annotations);
-}
-
-}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/unit_tests/tsan_mman_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_mman_test.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/unit_tests/tsan_mman_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/unit_tests/tsan_mman_test.cc (removed)
@@ -1,109 +0,0 @@
-//===-- tsan_mman_test.cc -------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_mman.h"
-#include "tsan_rtl.h"
-#include "gtest/gtest.h"
-
-namespace __tsan {
-
-TEST(Mman, Internal) {
-  ScopedInRtl in_rtl;
-  char *p = (char*)internal_alloc(MBlockScopedBuf, 10);
-  EXPECT_NE(p, (char*)0);
-  char *p2 = (char*)internal_alloc(MBlockScopedBuf, 20);
-  EXPECT_NE(p2, (char*)0);
-  EXPECT_NE(p2, p);
-  for (int i = 0; i < 10; i++) {
-    p[i] = 42;
-  }
-  for (int i = 0; i < 20; i++) {
-    ((char*)p2)[i] = 42;
-  }
-  internal_free(p);
-  internal_free(p2);
-}
-
-TEST(Mman, User) {
-  ScopedInRtl in_rtl;
-  ThreadState *thr = cur_thread();
-  uptr pc = 0;
-  char *p = (char*)user_alloc(thr, pc, 10);
-  EXPECT_NE(p, (char*)0);
-  char *p2 = (char*)user_alloc(thr, pc, 20);
-  EXPECT_NE(p2, (char*)0);
-  EXPECT_NE(p2, p);
-  MBlock *b = user_mblock(thr, p);
-  EXPECT_NE(b, (MBlock*)0);
-  EXPECT_EQ(b->size, (uptr)10);
-  MBlock *b2 = user_mblock(thr, p2);
-  EXPECT_NE(b2, (MBlock*)0);
-  EXPECT_EQ(b2->size, (uptr)20);
-  for (int i = 0; i < 10; i++) {
-    p[i] = 42;
-    EXPECT_EQ(b, user_mblock(thr, p + i));
-  }
-  for (int i = 0; i < 20; i++) {
-    ((char*)p2)[i] = 42;
-    EXPECT_EQ(b2, user_mblock(thr, p2 + i));
-  }
-  user_free(thr, pc, p);
-  user_free(thr, pc, p2);
-}
-
-TEST(Mman, UserRealloc) {
-  ScopedInRtl in_rtl;
-  ThreadState *thr = cur_thread();
-  uptr pc = 0;
-  {
-    void *p = user_realloc(thr, pc, 0, 0);
-    // Strictly saying this is incorrect, realloc(NULL, N) is equivalent to
-    // malloc(N), thus must return non-NULL pointer.
-    EXPECT_EQ(p, (void*)0);
-  }
-  {
-    void *p = user_realloc(thr, pc, 0, 100);
-    EXPECT_NE(p, (void*)0);
-    memset(p, 0xde, 100);
-    user_free(thr, pc, p);
-  }
-  {
-    void *p = user_alloc(thr, pc, 100);
-    EXPECT_NE(p, (void*)0);
-    memset(p, 0xde, 100);
-    void *p2 = user_realloc(thr, pc, p, 0);
-    EXPECT_EQ(p2, (void*)0);
-  }
-  {
-    void *p = user_realloc(thr, pc, 0, 100);
-    EXPECT_NE(p, (void*)0);
-    memset(p, 0xde, 100);
-    void *p2 = user_realloc(thr, pc, p, 10000);
-    EXPECT_NE(p2, (void*)0);
-    for (int i = 0; i < 100; i++)
-      EXPECT_EQ(((char*)p2)[i], (char)0xde);
-    memset(p2, 0xde, 10000);
-    user_free(thr, pc, p2);
-  }
-  {
-    void *p = user_realloc(thr, pc, 0, 10000);
-    EXPECT_NE(p, (void*)0);
-    memset(p, 0xde, 10000);
-    void *p2 = user_realloc(thr, pc, p, 10);
-    EXPECT_NE(p2, (void*)0);
-    for (int i = 0; i < 10; i++)
-      EXPECT_EQ(((char*)p2)[i], (char)0xde);
-    user_free(thr, pc, p2);
-  }
-}
-
-}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/unit_tests/tsan_mutex_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_mutex_test.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/unit_tests/tsan_mutex_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/unit_tests/tsan_mutex_test.cc (removed)
@@ -1,126 +0,0 @@
-//===-- tsan_mutex_test.cc ------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "sanitizer_common/sanitizer_internal_defs.h"
-#include "sanitizer_common/sanitizer_atomic.h"
-#include "sanitizer_common/sanitizer_common.h"
-#include "sanitizer_common/sanitizer_mutex.h"
-#include "tsan_mutex.h"
-#include "gtest/gtest.h"
-
-namespace __tsan {
-
-template<typename MutexType>
-class TestData {
- public:
-  explicit TestData(MutexType *mtx)
-    : mtx_(mtx) {
-    for (int i = 0; i < kSize; i++)
-      data_[i] = 0;
-  }
-
-  void Write() {
-    Lock l(mtx_);
-    T v0 = data_[0];
-    for (int i = 0; i < kSize; i++) {
-      CHECK_EQ(data_[i], v0);
-      data_[i]++;
-    }
-  }
-
-  void Read() {
-    ReadLock l(mtx_);
-    T v0 = data_[0];
-    for (int i = 0; i < kSize; i++) {
-      CHECK_EQ(data_[i], v0);
-    }
-  }
-
-  void Backoff() {
-    volatile T data[kSize] = {};
-    for (int i = 0; i < kSize; i++) {
-      data[i]++;
-      CHECK_EQ(data[i], 1);
-    }
-  }
-
- private:
-  typedef GenericScopedLock<MutexType> Lock;
-  static const int kSize = 64;
-  typedef u64 T;
-  MutexType *mtx_;
-  char pad_[kCacheLineSize];
-  T data_[kSize];
-};
-
-const int kThreads = 8;
-const int kWriteRate = 1024;
-#if TSAN_DEBUG
-const int kIters = 16*1024;
-#else
-const int kIters = 64*1024;
-#endif
-
-template<typename MutexType>
-static void *write_mutex_thread(void *param) {
-  TestData<MutexType> *data = (TestData<MutexType>*)param;
-  for (int i = 0; i < kIters; i++) {
-    data->Write();
-    data->Backoff();
-  }
-  return 0;
-}
-
-template<typename MutexType>
-static void *read_mutex_thread(void *param) {
-  TestData<MutexType> *data = (TestData<MutexType>*)param;
-  for (int i = 0; i < kIters; i++) {
-    if ((i % kWriteRate) == 0)
-      data->Write();
-    else
-      data->Read();
-    data->Backoff();
-  }
-  return 0;
-}
-
-TEST(Mutex, Write) {
-  Mutex mtx(MutexTypeAnnotations, StatMtxAnnotations);
-  TestData<Mutex> data(&mtx);
-  pthread_t threads[kThreads];
-  for (int i = 0; i < kThreads; i++)
-    pthread_create(&threads[i], 0, write_mutex_thread<Mutex>, &data);
-  for (int i = 0; i < kThreads; i++)
-    pthread_join(threads[i], 0);
-}
-
-TEST(Mutex, ReadWrite) {
-  Mutex mtx(MutexTypeAnnotations, StatMtxAnnotations);
-  TestData<Mutex> data(&mtx);
-  pthread_t threads[kThreads];
-  for (int i = 0; i < kThreads; i++)
-    pthread_create(&threads[i], 0, read_mutex_thread<Mutex>, &data);
-  for (int i = 0; i < kThreads; i++)
-    pthread_join(threads[i], 0);
-}
-
-TEST(Mutex, SpinWrite) {
-  SpinMutex mtx;
-  TestData<SpinMutex> data(&mtx);
-  pthread_t threads[kThreads];
-  for (int i = 0; i < kThreads; i++)
-    pthread_create(&threads[i], 0, write_mutex_thread<SpinMutex>, &data);
-  for (int i = 0; i < kThreads; i++)
-    pthread_join(threads[i], 0);
-}
-
-}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/unit_tests/tsan_platform_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_platform_test.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/unit_tests/tsan_platform_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/unit_tests/tsan_platform_test.cc (removed)
@@ -1,88 +0,0 @@
-//===-- tsan_platform_test.cc ---------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "sanitizer_common/sanitizer_libc.h"
-#include "tsan_platform.h"
-#include "gtest/gtest.h"
-
-namespace __tsan {
-
-static void TestThreadInfo(bool main) {
-  ScopedInRtl in_rtl;
-  uptr stk_addr = 0;
-  uptr stk_size = 0;
-  uptr tls_addr = 0;
-  uptr tls_size = 0;
-  GetThreadStackAndTls(main, &stk_addr, &stk_size, &tls_addr, &tls_size);
-  // Printf("stk=%zx-%zx(%zu)\n", stk_addr, stk_addr + stk_size, stk_size);
-  // Printf("tls=%zx-%zx(%zu)\n", tls_addr, tls_addr + tls_size, tls_size);
-
-  int stack_var;
-  EXPECT_NE(stk_addr, (uptr)0);
-  EXPECT_NE(stk_size, (uptr)0);
-  EXPECT_GT((uptr)&stack_var, stk_addr);
-  EXPECT_LT((uptr)&stack_var, stk_addr + stk_size);
-
-  static __thread int thread_var;
-  EXPECT_NE(tls_addr, (uptr)0);
-  EXPECT_NE(tls_size, (uptr)0);
-  EXPECT_GT((uptr)&thread_var, tls_addr);
-  EXPECT_LT((uptr)&thread_var, tls_addr + tls_size);
-
-  // Ensure that tls and stack do not intersect.
-  uptr tls_end = tls_addr + tls_size;
-  EXPECT_TRUE(tls_addr < stk_addr || tls_addr >= stk_addr + stk_size);
-  EXPECT_TRUE(tls_end  < stk_addr || tls_end  >=  stk_addr + stk_size);
-  EXPECT_TRUE((tls_addr < stk_addr) == (tls_end  < stk_addr));
-}
-
-static void *WorkerThread(void *arg) {
-  TestThreadInfo(false);
-  return 0;
-}
-
-TEST(Platform, ThreadInfoMain) {
-  TestThreadInfo(true);
-}
-
-TEST(Platform, ThreadInfoWorker) {
-  pthread_t t;
-  pthread_create(&t, 0, WorkerThread, 0);
-  pthread_join(t, 0);
-}
-
-TEST(Platform, FileOps) {
-  const char *str1 = "qwerty";
-  uptr len1 = internal_strlen(str1);
-  const char *str2 = "zxcv";
-  uptr len2 = internal_strlen(str2);
-
-  fd_t fd = internal_open("./tsan_test.tmp", true);
-  EXPECT_NE(fd, kInvalidFd);
-  EXPECT_EQ(len1, internal_write(fd, str1, len1));
-  EXPECT_EQ(len2, internal_write(fd, str2, len2));
-  internal_close(fd);
-
-  fd = internal_open("./tsan_test.tmp", false);
-  EXPECT_NE(fd, kInvalidFd);
-  EXPECT_EQ(len1 + len2, internal_filesize(fd));
-  char buf[64] = {};
-  EXPECT_EQ(len1, internal_read(fd, buf, len1));
-  EXPECT_EQ(0, internal_memcmp(buf, str1, len1));
-  EXPECT_EQ((char)0, buf[len1 + 1]);
-  internal_memset(buf, 0, len1);
-  EXPECT_EQ(len2, internal_read(fd, buf, len2));
-  EXPECT_EQ(0, internal_memcmp(buf, str2, len2));
-  internal_close(fd);
-}
-
-}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/unit_tests/tsan_printf_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_printf_test.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/unit_tests/tsan_printf_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/unit_tests/tsan_printf_test.cc (removed)
@@ -1,106 +0,0 @@
-//===-- tsan_printf_test.cc -----------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_rtl.h"
-#include "gtest/gtest.h"
-
-#include <string.h>
-#include <limits.h>
-
-namespace __tsan {
-
-TEST(Printf, Basic) {
-  char buf[1024];
-  uptr len = internal_snprintf(buf, sizeof(buf),
-      "a%db%zdc%ue%zuf%xh%zxq%pe%sr",
-      (int)-1, (long)-2, // NOLINT
-      (unsigned)-4, (unsigned long)5, // NOLINT
-      (unsigned)10, (unsigned long)11, // NOLINT
-      (void*)0x123, "_string_");
-  EXPECT_EQ(len, strlen(buf));
-  EXPECT_EQ(0, strcmp(buf, "a-1b-2c4294967292e5fahbq"
-                           "0x000000000123e_string_r"));
-}
-
-TEST(Printf, OverflowStr) {
-  char buf[] = "123456789";
-  uptr len = internal_snprintf(buf, 4, "%s", "abcdef");  // NOLINT
-  EXPECT_EQ(len, (uptr)6);
-  EXPECT_EQ(0, strcmp(buf, "abc"));
-  EXPECT_EQ(buf[3], 0);
-  EXPECT_EQ(buf[4], '5');
-  EXPECT_EQ(buf[5], '6');
-  EXPECT_EQ(buf[6], '7');
-  EXPECT_EQ(buf[7], '8');
-  EXPECT_EQ(buf[8], '9');
-  EXPECT_EQ(buf[9], 0);
-}
-
-TEST(Printf, OverflowInt) {
-  char buf[] = "123456789";
-  internal_snprintf(buf, 4, "%d", -123456789);  // NOLINT
-  EXPECT_EQ(0, strcmp(buf, "-12"));
-  EXPECT_EQ(buf[3], 0);
-  EXPECT_EQ(buf[4], '5');
-  EXPECT_EQ(buf[5], '6');
-  EXPECT_EQ(buf[6], '7');
-  EXPECT_EQ(buf[7], '8');
-  EXPECT_EQ(buf[8], '9');
-  EXPECT_EQ(buf[9], 0);
-}
-
-TEST(Printf, OverflowUint) {
-  char buf[] = "123456789";
-  internal_snprintf(buf, 4, "a%zx", (unsigned long)0x123456789);  // NOLINT
-  EXPECT_EQ(0, strcmp(buf, "a12"));
-  EXPECT_EQ(buf[3], 0);
-  EXPECT_EQ(buf[4], '5');
-  EXPECT_EQ(buf[5], '6');
-  EXPECT_EQ(buf[6], '7');
-  EXPECT_EQ(buf[7], '8');
-  EXPECT_EQ(buf[8], '9');
-  EXPECT_EQ(buf[9], 0);
-}
-
-TEST(Printf, OverflowPtr) {
-  char buf[] = "123456789";
-  internal_snprintf(buf, 4, "%p", (void*)0x123456789);  // NOLINT
-  EXPECT_EQ(0, strcmp(buf, "0x0"));
-  EXPECT_EQ(buf[3], 0);
-  EXPECT_EQ(buf[4], '5');
-  EXPECT_EQ(buf[5], '6');
-  EXPECT_EQ(buf[6], '7');
-  EXPECT_EQ(buf[7], '8');
-  EXPECT_EQ(buf[8], '9');
-  EXPECT_EQ(buf[9], 0);
-}
-
-template<typename T>
-static void TestMinMax(const char *fmt, T min, T max) {
-  char buf[1024];
-  uptr len = internal_snprintf(buf, sizeof(buf), fmt, min, max);
-  char buf2[1024];
-  snprintf(buf2, sizeof(buf2), fmt, min, max);
-  EXPECT_EQ(len, strlen(buf));
-  EXPECT_EQ(0, strcmp(buf, buf2));
-}
-
-TEST(Printf, MinMax) {
-  TestMinMax<int>("%d-%d", INT_MIN, INT_MAX);  // NOLINT
-  TestMinMax<long>("%zd-%zd", LONG_MIN, LONG_MAX);  // NOLINT
-  TestMinMax<unsigned>("%u-%u", 0, UINT_MAX);  // NOLINT
-  TestMinMax<unsigned long>("%zu-%zu", 0, ULONG_MAX);  // NOLINT
-  TestMinMax<unsigned>("%x-%x", 0, UINT_MAX);  // NOLINT
-  TestMinMax<unsigned long>("%zx-%zx", 0, ULONG_MAX);  // NOLINT
-}
-
-}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/unit_tests/tsan_shadow_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_shadow_test.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/unit_tests/tsan_shadow_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/unit_tests/tsan_shadow_test.cc (removed)
@@ -1,47 +0,0 @@
-//===-- tsan_shadow_test.cc -----------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_platform.h"
-#include "gtest/gtest.h"
-
-namespace __tsan {
-
-TEST(Shadow, Mapping) {
-  static int global;
-  int stack;
-  void *heap = malloc(0);
-  free(heap);
-
-  CHECK(IsAppMem((uptr)&global));
-  CHECK(IsAppMem((uptr)&stack));
-  CHECK(IsAppMem((uptr)heap));
-
-  CHECK(IsShadowMem(MemToShadow((uptr)&global)));
-  CHECK(IsShadowMem(MemToShadow((uptr)&stack)));
-  CHECK(IsShadowMem(MemToShadow((uptr)heap)));
-}
-
-TEST(Shadow, Celling) {
-  u64 aligned_data[4];
-  char *data = (char*)aligned_data;
-  CHECK_EQ((uptr)data % kShadowSize, 0);
-  uptr s0 = MemToShadow((uptr)&data[0]);
-  CHECK_EQ(s0 % kShadowSize, 0);
-  for (unsigned i = 1; i < kShadowCell; i++)
-    CHECK_EQ(s0, MemToShadow((uptr)&data[i]));
-  for (unsigned i = kShadowCell; i < 2*kShadowCell; i++)
-    CHECK_EQ(s0 + kShadowSize*kShadowCnt, MemToShadow((uptr)&data[i]));
-  for (unsigned i = 2*kShadowCell; i < 3*kShadowCell; i++)
-    CHECK_EQ(s0 + 2*kShadowSize*kShadowCnt, MemToShadow((uptr)&data[i]));
-}
-
-}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/unit_tests/tsan_stack_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_stack_test.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/unit_tests/tsan_stack_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/unit_tests/tsan_stack_test.cc (removed)
@@ -1,80 +0,0 @@
-//===-- tsan_stack_test.cc ------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_sync.h"
-#include "tsan_rtl.h"
-#include "gtest/gtest.h"
-#include <string.h>
-
-namespace __tsan {
-
-static void TestStackTrace(StackTrace *trace) {
-  ThreadState thr(0, 0, 0, 0, 0, 0, 0, 0);
-
-  trace->ObtainCurrent(&thr, 0);
-  EXPECT_EQ(trace->Size(), (uptr)0);
-
-  trace->ObtainCurrent(&thr, 42);
-  EXPECT_EQ(trace->Size(), (uptr)1);
-  EXPECT_EQ(trace->Get(0), (uptr)42);
-
-  *thr.shadow_stack_pos++ = 100;
-  *thr.shadow_stack_pos++ = 101;
-  trace->ObtainCurrent(&thr, 0);
-  EXPECT_EQ(trace->Size(), (uptr)2);
-  EXPECT_EQ(trace->Get(0), (uptr)100);
-  EXPECT_EQ(trace->Get(1), (uptr)101);
-
-  trace->ObtainCurrent(&thr, 42);
-  EXPECT_EQ(trace->Size(), (uptr)3);
-  EXPECT_EQ(trace->Get(0), (uptr)100);
-  EXPECT_EQ(trace->Get(1), (uptr)101);
-  EXPECT_EQ(trace->Get(2), (uptr)42);
-}
-
-TEST(StackTrace, Basic) {
-  ScopedInRtl in_rtl;
-  StackTrace trace;
-  TestStackTrace(&trace);
-}
-
-TEST(StackTrace, StaticBasic) {
-  ScopedInRtl in_rtl;
-  uptr buf[10];
-  StackTrace trace1(buf, 10);
-  TestStackTrace(&trace1);
-  StackTrace trace2(buf, 3);
-  TestStackTrace(&trace2);
-}
-
-TEST(StackTrace, StaticTrim) {
-  ScopedInRtl in_rtl;
-  uptr buf[2];
-  StackTrace trace(buf, 2);
-  ThreadState thr(0, 0, 0, 0, 0, 0, 0, 0);
-
-  *thr.shadow_stack_pos++ = 100;
-  *thr.shadow_stack_pos++ = 101;
-  *thr.shadow_stack_pos++ = 102;
-  trace.ObtainCurrent(&thr, 0);
-  EXPECT_EQ(trace.Size(), (uptr)2);
-  EXPECT_EQ(trace.Get(0), (uptr)101);
-  EXPECT_EQ(trace.Get(1), (uptr)102);
-
-  trace.ObtainCurrent(&thr, 42);
-  EXPECT_EQ(trace.Size(), (uptr)2);
-  EXPECT_EQ(trace.Get(0), (uptr)102);
-  EXPECT_EQ(trace.Get(1), (uptr)42);
-}
-
-
-}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/unit_tests/tsan_suppressions_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_suppressions_test.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/unit_tests/tsan_suppressions_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/unit_tests/tsan_suppressions_test.cc (removed)
@@ -1,128 +0,0 @@
-//===-- tsan_suppressions_test.cc -----------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_suppressions.h"
-#include "tsan_rtl.h"
-#include "gtest/gtest.h"
-
-#include <string.h>
-
-namespace __tsan {
-
-TEST(Suppressions, Parse) {
-  ScopedInRtl in_rtl;
-  Suppression *supp0 = SuppressionParse(
-    "race:foo\n"
-    " 	race:bar\n"  // NOLINT
-    "race:baz	 \n"  // NOLINT
-    "# a comment\n"
-    "race:quz\n"
-  );  // NOLINT
-  Suppression *supp = supp0;
-  EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->templ, "quz"));
-  supp = supp->next;
-  EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->templ, "baz"));
-  supp = supp->next;
-  EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->templ, "bar"));
-  supp = supp->next;
-  EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->templ, "foo"));
-  supp = supp->next;
-  EXPECT_EQ((Suppression*)0, supp);
-}
-
-TEST(Suppressions, Parse2) {
-  ScopedInRtl in_rtl;
-  Suppression *supp0 = SuppressionParse(
-    "  	# first line comment\n"  // NOLINT
-    " 	race:bar 	\n"  // NOLINT
-    "race:baz* *baz\n"
-    "# a comment\n"
-    "# last line comment\n"
-  );  // NOLINT
-  Suppression *supp = supp0;
-  EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->templ, "baz* *baz"));
-  supp = supp->next;
-  EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->templ, "bar"));
-  supp = supp->next;
-  EXPECT_EQ((Suppression*)0, supp);
-}
-
-TEST(Suppressions, Parse3) {
-  ScopedInRtl in_rtl;
-  Suppression *supp0 = SuppressionParse(
-    "# last suppression w/o line-feed\n"
-    "race:foo\n"
-    "race:bar"
-  );  // NOLINT
-  Suppression *supp = supp0;
-  EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->templ, "bar"));
-  supp = supp->next;
-  EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->templ, "foo"));
-  supp = supp->next;
-  EXPECT_EQ((Suppression*)0, supp);
-}
-
-TEST(Suppressions, ParseType) {
-  ScopedInRtl in_rtl;
-  Suppression *supp0 = SuppressionParse(
-    "race:foo\n"
-    "thread:bar\n"
-    "mutex:baz\n"
-    "signal:quz\n"
-  );  // NOLINT
-  Suppression *supp = supp0;
-  EXPECT_EQ(supp->type, SuppressionSignal);
-  EXPECT_EQ(0, strcmp(supp->templ, "quz"));
-  supp = supp->next;
-  EXPECT_EQ(supp->type, SuppressionMutex);
-  EXPECT_EQ(0, strcmp(supp->templ, "baz"));
-  supp = supp->next;
-  EXPECT_EQ(supp->type, SuppressionThread);
-  EXPECT_EQ(0, strcmp(supp->templ, "bar"));
-  supp = supp->next;
-  EXPECT_EQ(supp->type, SuppressionRace);
-  EXPECT_EQ(0, strcmp(supp->templ, "foo"));
-  supp = supp->next;
-  EXPECT_EQ((Suppression*)0, supp);
-}
-
-static bool MyMatch(const char *templ, const char *func) {
-  char tmp[1024];
-  strcpy(tmp, templ);  // NOLINT
-  return SuppressionMatch(tmp, func);
-}
-
-TEST(Suppressions, Match) {
-  EXPECT_TRUE(MyMatch("foobar", "foobar"));
-  EXPECT_TRUE(MyMatch("foobar", "prefix_foobar_postfix"));
-  EXPECT_TRUE(MyMatch("*foobar*", "prefix_foobar_postfix"));
-  EXPECT_TRUE(MyMatch("foo*bar", "foo_middle_bar"));
-  EXPECT_TRUE(MyMatch("foo*bar", "foobar"));
-  EXPECT_TRUE(MyMatch("foo*bar*baz", "foo_middle_bar_another_baz"));
-  EXPECT_TRUE(MyMatch("foo*bar*baz", "foo_middle_barbaz"));
-
-  EXPECT_FALSE(MyMatch("foo", "baz"));
-  EXPECT_FALSE(MyMatch("foobarbaz", "foobar"));
-  EXPECT_FALSE(MyMatch("foobarbaz", "barbaz"));
-  EXPECT_FALSE(MyMatch("foo*bar", "foobaz"));
-  EXPECT_FALSE(MyMatch("foo*bar", "foo_baz"));
-}
-
-}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/unit_tests/tsan_sync_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_sync_test.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/unit_tests/tsan_sync_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/unit_tests/tsan_sync_test.cc (removed)
@@ -1,65 +0,0 @@
-//===-- tsan_sync_test.cc -------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_sync.h"
-#include "tsan_rtl.h"
-#include "tsan_mman.h"
-#include "gtest/gtest.h"
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <map>
-
-namespace __tsan {
-
-TEST(Sync, Table) {
-  const uintptr_t kIters = 512*1024;
-  const uintptr_t kRange = 10000;
-
-  ScopedInRtl in_rtl;
-  ThreadState *thr = cur_thread();
-  uptr pc = 0;
-
-  SyncTab tab;
-  SyncVar *golden[kRange] = {};
-  unsigned seed = 0;
-  for (uintptr_t i = 0; i < kIters; i++) {
-    uintptr_t addr = rand_r(&seed) % (kRange - 1) + 1;
-    if (rand_r(&seed) % 2) {
-      // Get or add.
-      SyncVar *v = tab.GetAndLock(thr, pc, addr, true);
-      EXPECT_TRUE(golden[addr] == 0 || golden[addr] == v);
-      EXPECT_EQ(v->addr, addr);
-      golden[addr] = v;
-      v->mtx.Unlock();
-    } else {
-      // Remove.
-      SyncVar *v = tab.GetAndRemove(thr, pc, addr);
-      EXPECT_EQ(golden[addr], v);
-      if (v) {
-        EXPECT_EQ(v->addr, addr);
-        golden[addr] = 0;
-        DestroyAndFree(v);
-      }
-    }
-  }
-  for (uintptr_t addr = 0; addr < kRange; addr++) {
-    if (golden[addr] == 0)
-      continue;
-    SyncVar *v = tab.GetAndRemove(thr, pc, addr);
-    EXPECT_EQ(v, golden[addr]);
-    EXPECT_EQ(v->addr, addr);
-    DestroyAndFree(v);
-  }
-}
-
-}  // namespace __tsan

Removed: compiler-rt/trunk/lib/tsan/unit_tests/tsan_vector_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_vector_test.cc?rev=164021&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/unit_tests/tsan_vector_test.cc (original)
+++ compiler-rt/trunk/lib/tsan/unit_tests/tsan_vector_test.cc (removed)
@@ -1,45 +0,0 @@
-//===-- tsan_vector_test.cc -----------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file is a part of ThreadSanitizer (TSan), a race detector.
-//
-//===----------------------------------------------------------------------===//
-#include "tsan_vector.h"
-#include "tsan_rtl.h"
-#include "gtest/gtest.h"
-
-namespace __tsan {
-
-TEST(Vector, Basic) {
-  ScopedInRtl in_rtl;
-  Vector<int> v(MBlockScopedBuf);
-  EXPECT_EQ(v.Size(), (uptr)0);
-  v.PushBack(42);
-  EXPECT_EQ(v.Size(), (uptr)1);
-  EXPECT_EQ(v[0], 42);
-  v.PushBack(43);
-  EXPECT_EQ(v.Size(), (uptr)2);
-  EXPECT_EQ(v[0], 42);
-  EXPECT_EQ(v[1], 43);
-}
-
-TEST(Vector, Stride) {
-  ScopedInRtl in_rtl;
-  Vector<int> v(MBlockScopedBuf);
-  for (int i = 0; i < 1000; i++) {
-    v.PushBack(i);
-    EXPECT_EQ(v.Size(), (uptr)(i + 1));
-    EXPECT_EQ(v[i], i);
-  }
-  for (int i = 0; i < 1000; i++) {
-    EXPECT_EQ(v[i], i);
-  }
-}
-
-}  // namespace __tsan





More information about the llvm-commits mailing list