[llvm-commits] [compiler-rt] r164110 - in /compiler-rt/trunk/lib/tsan: ./ lit_tests/ output_tests/

David Blaikie dblaikie at gmail.com
Sun Nov 25 17:35:39 PST 2012


For what it's worth, running "ninja check-all" on my ubuntu machine is
failing several of these tests. Do you know anything about this?

Failing Tests (4):
    ThreadSanitizer :: race_on_mutex.c
    ThreadSanitizer :: simple_stack.c
    ThreadSanitizer :: simple_stack2.cc
    ThreadSanitizer :: write_in_reader_lock.cc


for example:

FAIL: ThreadSanitizer :: simple_stack.c (12713 of 12789)
******************** TEST 'ThreadSanitizer :: simple_stack.c' FAILED
********************
Script:
--
/home/blaikie/local/Development/llvm/build/clang/x86-64/Debug/llvm/bin/clang
-fsanitize=thread -fPIE -fno-builtin -g -Wall -pie -lpthread -ldl  -O1
/usr/local/google/home/blaikie/Development/llvm/src/projects/compiler-rt/lib/tsan/lit_tests/simple_stack.c
-o /usr/local/google/home/blaikie/Development/llvm/build/clang/x86-64/Debug/llvm/projects/compiler-rt/lib/tsan/lit_tests/Output/simple_stack.c.tmp
&& /usr/local/google/home/blaikie/Development/llvm/build/clang/x86-64/Debug/llvm/projects/compiler-rt/lib/tsan/lit_tests/Output/simple_stack.c.tmp
2>&1 | FileCheck
/usr/local/google/home/blaikie/Development/llvm/src/projects/compiler-rt/lib/tsan/lit_tests/simple_stack.c
--
Exit Code: 1
Command Output (stderr):
--
/usr/local/google/home/blaikie/Development/llvm/src/projects/compiler-rt/lib/tsan/lit_tests/simple_stack.c:52:16:
error: expected string not found in input
// CHECK-NEXT: #0 foo1{{.*}} {{.*}}simple_stack.c:9{{(:3)?}} ({{.*}})
               ^
<stdin>:4:2: note: scanning from here
 #0 foo1 <null>:0 (simple_stack.c.tmp+0x000000005d7a)
 ^
--

On Tue, Sep 18, 2012 at 12:23 AM, Alexey Samsonov <samsonov at google.com> wrote:
> Author: samsonov
> Date: Tue Sep 18 02:23:54 2012
> New Revision: 164110
>
> URL: http://llvm.org/viewvc/llvm-project?rev=164110&view=rev
> Log:
> [TSan] port all output tests to lit and move them to lit_tests directory. This makes 'make check-tsan' command test both unit and output TSan tests. Old custom makefiles for running TSan tests are still functional as well.
>
> Added:
>     compiler-rt/trunk/lib/tsan/lit_tests/free_race.c
>     compiler-rt/trunk/lib/tsan/lit_tests/free_race2.c
>     compiler-rt/trunk/lib/tsan/lit_tests/heap_race.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/lit.cfg
>     compiler-rt/trunk/lib/tsan/lit_tests/lit.site.cfg.in
>     compiler-rt/trunk/lib/tsan/lit_tests/memcpy_race.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/mop_with_offset.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/mop_with_offset2.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/mutex_destroy_locked.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/race_on_barrier.c
>     compiler-rt/trunk/lib/tsan/lit_tests/race_on_barrier2.c
>     compiler-rt/trunk/lib/tsan/lit_tests/race_on_heap.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/race_on_mutex.c
>     compiler-rt/trunk/lib/tsan/lit_tests/race_with_finished_thread.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/simple_race.c
>     compiler-rt/trunk/lib/tsan/lit_tests/simple_race.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/simple_stack.c
>     compiler-rt/trunk/lib/tsan/lit_tests/simple_stack2.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/sleep_sync.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/sleep_sync2.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/static_init1.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/static_init2.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/static_init3.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/static_init4.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/static_init5.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/suppress_same_address.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/suppress_same_stacks.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/test_output.sh   (with props)
>     compiler-rt/trunk/lib/tsan/lit_tests/thread_leak.c
>     compiler-rt/trunk/lib/tsan/lit_tests/thread_leak2.c
>     compiler-rt/trunk/lib/tsan/lit_tests/thread_leak3.c
>     compiler-rt/trunk/lib/tsan/lit_tests/tiny_race.c
>     compiler-rt/trunk/lib/tsan/lit_tests/virtual_inheritance_compile_bug.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/vptr_benign_race.cc
>     compiler-rt/trunk/lib/tsan/lit_tests/vptr_harmful_race.cc
> Removed:
>     compiler-rt/trunk/lib/tsan/output_tests/
> Modified:
>     compiler-rt/trunk/lib/tsan/Makefile.old
>     compiler-rt/trunk/lib/tsan/lit_tests/CMakeLists.txt
>
> Modified: compiler-rt/trunk/lib/tsan/Makefile.old
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/Makefile.old?rev=164110&r1=164109&r2=164110&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/Makefile.old (original)
> +++ compiler-rt/trunk/lib/tsan/Makefile.old Tue Sep 18 02:23:54 2012
> @@ -53,7 +53,7 @@
>
>  run: all
>         (ulimit -s 8192; ./tsan_test)
> -       ./output_tests/test_output.sh
> +       ./lit_tests/test_output.sh
>
>  presubmit:
>         # Debug build with clang.
>
> Modified: 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=164110&r1=164109&r2=164110&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/CMakeLists.txt (original)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/CMakeLists.txt Tue Sep 18 02:23:54 2012
> @@ -1,10 +1,34 @@
>  configure_lit_site_cfg(
> +  ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in
> +  ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
> +  )
> +
> +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)
> +if("${CMAKE_HOST_SYSTEM}" STREQUAL "${CMAKE_SYSTEM}")
> +  # Run TSan output tests only if we're not cross-compiling,
> +  # and can be sure that clang would produce working binaries.
> +  set(TSAN_TEST_DEPS
> +    clang clang-headers FileCheck count not
> +    ${TSAN_RUNTIME_LIBRARIES}
> +    )
> +  set(TSAN_TEST_PARAMS
> +    tsan_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
> +    )
> +  if(LLVM_INCLUDE_TESTS)
> +    list(APPEND ASAN_TEST_DEPS TsanUnitTests)
> +  endif()
> +  add_lit_testsuite(check-tsan "Running ThreadSanitizer tests"
> +    ${CMAKE_CURRENT_BINARY_DIR}
> +    PARAMS ${TSAN_TEST_PARAMS}
> +    DEPENDS ${TSAN_TEST_DEPS}
> +    )
> +  set_target_properties(check-tsan PROPERTIES FOLDER "TSan unittests")
> +elseif(LLVM_INCLUDE_TESTS)
> +  # Otherwise run only TSan unit tests.
>    add_lit_testsuite(check-tsan "Running ThreadSanitizer tests"
>      ${CMAKE_CURRENT_BINARY_DIR}/Unit
>      DEPENDS TsanUnitTests)
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/free_race.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/free_race.c?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/free_race.c (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/free_race.c Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,43 @@
> +// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <stddef.h>
> +#include <unistd.h>
> +
> +int *mem;
> +pthread_mutex_t mtx;
> +
> +void *Thread1(void *x) {
> +  pthread_mutex_lock(&mtx);
> +  free(mem);
> +  pthread_mutex_unlock(&mtx);
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  usleep(1000000);
> +  pthread_mutex_lock(&mtx);
> +  mem[0] = 42;
> +  pthread_mutex_unlock(&mtx);
> +  return NULL;
> +}
> +
> +int main() {
> +  mem = (int*)malloc(100);
> +  pthread_mutex_init(&mtx, 0);
> +  pthread_t t;
> +  pthread_create(&t, NULL, Thread1, NULL);
> +  Thread2(0);
> +  pthread_join(t, NULL);
> +  pthread_mutex_destroy(&mtx);
> +  return 0;
> +}
> +
> +// CHECK: WARNING: ThreadSanitizer: heap-use-after-free
> +// CHECK:   Write of size 4 at {{.*}} by main thread:
> +// CHECK:     #0 Thread2
> +// CHECK:     #1 main
> +// CHECK:   Previous write of size 8 at {{.*}} by thread 1:
> +// CHECK:     #0 free
> +// CHECK:     #1 Thread1
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/free_race2.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/free_race2.c?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/free_race2.c (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/free_race2.c Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,26 @@
> +// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <stdlib.h>
> +
> +void __attribute__((noinline)) foo(int *mem) {
> +  free(mem);
> +}
> +
> +void __attribute__((noinline)) bar(int *mem) {
> +  mem[0] = 42;
> +}
> +
> +int main() {
> +  int *mem = (int*)malloc(100);
> +  foo(mem);
> +  bar(mem);
> +  return 0;
> +}
> +
> +// CHECK: WARNING: ThreadSanitizer: heap-use-after-free
> +// CHECK:   Write of size 4 at {{.*}} by main thread:
> +// CHECK:     #0 bar
> +// CHECK:     #1 main
> +// CHECK:   Previous write of size 8 at {{.*}} by main thread:
> +// CHECK:     #0 free
> +// CHECK:     #1 foo
> +// CHECK:     #2 main
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/heap_race.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/heap_race.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/heap_race.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/heap_race.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,20 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdio.h>
> +#include <stddef.h>
> +
> +void *Thread(void *a) {
> +  ((int*)a)[0]++;
> +  return NULL;
> +}
> +
> +int main() {
> +  int *p = new int(42);
> +  pthread_t t;
> +  pthread_create(&t, NULL, Thread, p);
> +  p[0]++;
> +  pthread_join(t, NULL);
> +  delete p;
> +}
> +
> +// CHECK: WARNING: ThreadSanitizer: data race
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/lit.cfg
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/lit.cfg?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/lit.cfg (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/lit.cfg Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,86 @@
> +# -*- Python -*-
> +
> +import os
> +
> +# Setup config name.
> +config.name = 'ThreadSanitizer'
> +
> +# Setup source root.
> +config.test_source_root = os.path.dirname(__file__)
> +
> +def DisplayNoConfigMessage():
> +  lit.fatal("No site specific configuration available! " +
> +            "Try running your test from the build tree or running " +
> +            "make check-tsan")
> +
> +# Figure out LLVM source root.
> +llvm_src_root = getattr(config, 'llvm_src_root', None)
> +if llvm_src_root is None:
> +  # We probably haven't loaded the site-specific configuration: the user
> +  # is likely trying to run a test file directly, and the site configuration
> +  # wasn't created by the build system.
> +  tsan_site_cfg = lit.params.get('tsan_site_config', None)
> +  if (tsan_site_cfg) and (os.path.exists(tsan_site_cfg)):
> +    lit.load_config(config, tsan_site_cfg)
> +    raise SystemExit
> +
> +  # Try to guess the location of site-specific configuration using llvm-config
> +  # util that can point where the build tree is.
> +  llvm_config = lit.util.which("llvm-config", config.environment["PATH"])
> +  if not llvm_config:
> +    DisplayNoConfigMessage()
> +
> +  # Validate that llvm-config points to the same source tree.
> +  llvm_src_root = lit.util.capture(["llvm-config", "--src-root"]).strip()
> +  tsan_test_src_root = os.path.join(llvm_src_root, "projects", "compiler-rt",
> +                                    "lib", "tsan", "lit_tests")
> +  if (os.path.realpath(tsan_test_src_root) !=
> +      os.path.realpath(config.test_source_root)):
> +    DisplayNoConfigMessage()
> +
> +  # Find out the presumed location of generated site config.
> +  llvm_obj_root = lit.util.capture(["llvm-config", "--obj-root"]).strip()
> +  tsan_site_cfg = os.path.join(llvm_obj_root, "projects", "compiler-rt",
> +                               "lib", "tsan", "lit_tests", "lit.site.cfg")
> +  if (not tsan_site_cfg) or (not os.path.exists(tsan_site_cfg)):
> +    DisplayNoConfigMessage()
> +
> +  lit.load_config(config, tsan_site_cfg)
> +  raise SystemExit
> +
> +# Setup attributes common for all compiler-rt projects.
> +compiler_rt_lit_cfg = os.path.join(llvm_src_root, "projects", "compiler-rt",
> +                                   "lib", "lit.common.cfg")
> +if (not compiler_rt_lit_cfg) or (not os.path.exists(compiler_rt_lit_cfg)):
> +  lit.fatal("Can't find common compiler-rt lit config at: %r"
> +            % compiler_rt_lit_cfg)
> +lit.load_config(config, compiler_rt_lit_cfg)
> +
> +# Setup environment variables for running ThreadSanitizer.
> +config.environment['TSAN_OPTIONS'] = "atexit_sleep_ms=0"
> +
> +# Setup default compiler flags used with -faddress-sanitizer option.
> +# FIXME: Review the set of required flags and check if it can be reduced.
> +clang_tsan_cflags = ("-fthread-sanitizer "
> +                      + "-fPIE "
> +                      + "-fno-builtin "
> +                      + "-g "
> +                      + "-Wall "
> +                      + "-pie "
> +                      + "-lpthread "
> +                      + "-ldl ")
> +clang_tsan_cxxflags = "-ccc-clang-cxx -ccc-cxx " + clang_tsan_cflags
> +config.substitutions.append( ("%clangxx_tsan ", (" " + config.clang + " " +
> +                                                clang_tsan_cxxflags + " ")) )
> +config.substitutions.append( ("%clang_tsan ", (" " + config.clang + " " +
> +                                              clang_tsan_cflags + " ")) )
> +
> +# Define CHECK-%os to check for OS-dependent output.
> +config.substitutions.append( ('CHECK-%os', ("CHECK-" + config.host_os)))
> +
> +# Default test suffixes.
> +config.suffixes = ['.c', '.cc', '.cpp']
> +
> +# ThreadSanitizer tests are currently supported on Linux only.
> +if config.host_os not in ['Linux']:
> +  config.unsupported = True
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/lit.site.cfg.in
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/lit.site.cfg.in?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/lit.site.cfg.in (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/lit.site.cfg.in Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,19 @@
> +## Autogenerated by LLVM/Clang configuration.
> +# Do not edit!
> +
> +config.clang = "@LLVM_BINARY_DIR@/bin/clang"
> +config.host_os = "@HOST_OS@"
> +config.llvm_src_root = "@LLVM_SOURCE_DIR@"
> +config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
> +config.target_triple = "@TARGET_TRIPLE@"
> +
> +# LLVM tools dir can be passed in lit parameters, so try to
> +# apply substitution.
> +try:
> +  config.llvm_tools_dir = config.llvm_tools_dir % lit.params
> +except KeyError,e:
> +  key, = e.args
> +  lit.fatal("unable to find %r parameter, use '--param=%s=VALUE'" % (key, key))
> +
> +# Let the main config do the real work.
> +lit.load_config(config, "@CMAKE_CURRENT_SOURCE_DIR@/lit.cfg")
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/memcpy_race.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/memcpy_race.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/memcpy_race.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/memcpy_race.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,40 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stddef.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <unistd.h>
> +
> +char *data = new char[10];
> +char *data1 = new char[10];
> +char *data2 = new char[10];
> +
> +void *Thread1(void *x) {
> +  memcpy(data+5, data1, 1);
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  usleep(500*1000);
> +  memcpy(data+3, data2, 4);
> +  return NULL;
> +}
> +
> +int main() {
> +  fprintf(stderr, "addr=%p\n", &data[5]);
> +  pthread_t t[2];
> +  pthread_create(&t[0], NULL, Thread1, NULL);
> +  pthread_create(&t[1], NULL, Thread2, NULL);
> +  pthread_join(t[0], NULL);
> +  pthread_join(t[1], NULL);
> +  return 0;
> +}
> +
> +// CHECK: addr=[[ADDR:0x[0-9,a-f]+]]
> +// CHECK: WARNING: ThreadSanitizer: data race
> +// CHECK:   Write of size 1 at [[ADDR]] by thread 2:
> +// CHECK:     #0 memcpy
> +// CHECK:     #1 Thread2
> +// CHECK:   Previous write of size 1 at [[ADDR]] by thread 1:
> +// CHECK:     #0 memcpy
> +// CHECK:     #1 Thread1
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/mop_with_offset.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/mop_with_offset.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/mop_with_offset.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/mop_with_offset.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,36 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stddef.h>
> +#include <stdio.h>
> +#include <unistd.h>
> +
> +void *Thread1(void *x) {
> +  int *p = (int*)x;
> +  p[0] = 1;
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  usleep(500*1000);
> +  char *p = (char*)x;
> +  p[2] = 1;
> +  return NULL;
> +}
> +
> +int main() {
> +  int *data = new int(42);
> +  fprintf(stderr, "ptr1=%p\n", data);
> +  fprintf(stderr, "ptr2=%p\n", (char*)data + 2);
> +  pthread_t t[2];
> +  pthread_create(&t[0], NULL, Thread1, data);
> +  pthread_create(&t[1], NULL, Thread2, data);
> +  pthread_join(t[0], NULL);
> +  pthread_join(t[1], NULL);
> +  delete data;
> +}
> +
> +// CHECK: ptr1=[[PTR1:0x[0-9,a-f]+]]
> +// CHECK: ptr2=[[PTR2:0x[0-9,a-f]+]]
> +// CHECK: WARNING: ThreadSanitizer: data race
> +// CHECK:   Write of size 1 at [[PTR2]] by thread 2:
> +// CHECK:   Previous write of size 4 at [[PTR1]] by thread 1:
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/mop_with_offset2.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/mop_with_offset2.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/mop_with_offset2.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/mop_with_offset2.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,36 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stddef.h>
> +#include <stdio.h>
> +#include <unistd.h>
> +
> +void *Thread1(void *x) {
> +  usleep(500*1000);
> +  int *p = (int*)x;
> +  p[0] = 1;
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  char *p = (char*)x;
> +  p[2] = 1;
> +  return NULL;
> +}
> +
> +int main() {
> +  int *data = new int(42);
> +  fprintf(stderr, "ptr1=%p\n", data);
> +  fprintf(stderr, "ptr2=%p\n", (char*)data + 2);
> +  pthread_t t[2];
> +  pthread_create(&t[0], NULL, Thread1, data);
> +  pthread_create(&t[1], NULL, Thread2, data);
> +  pthread_join(t[0], NULL);
> +  pthread_join(t[1], NULL);
> +  delete data;
> +}
> +
> +// CHECK: ptr1=[[PTR1:0x[0-9,a-f]+]]
> +// CHECK: ptr2=[[PTR2:0x[0-9,a-f]+]]
> +// CHECK: WARNING: ThreadSanitizer: data race
> +// CHECK:   Write of size 4 at [[PTR1]] by thread 1:
> +// CHECK:   Previous write of size 1 at [[PTR2]] by thread 2:
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/mutex_destroy_locked.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/mutex_destroy_locked.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/mutex_destroy_locked.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/mutex_destroy_locked.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,29 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <unistd.h>
> +
> +void *Thread(void *p) {
> +  pthread_mutex_lock((pthread_mutex_t*)p);
> +  return 0;
> +}
> +
> +int main() {
> +  pthread_mutex_t m;
> +  pthread_mutex_init(&m, 0);
> +  pthread_t t;
> +  pthread_create(&t, 0, Thread, &m);
> +  usleep(1000*1000);
> +  pthread_mutex_destroy(&m);
> +  pthread_join(t, 0);
> +  return 0;
> +}
> +
> +// CHECK: WARNING: ThreadSanitizer: destroy of a locked mutex
> +// CHECK:     #0 pthread_mutex_destroy
> +// CHECK:     #1 main
> +// CHECK:   and:
> +// CHECK:     #0 pthread_mutex_lock
> +// CHECK:     #1 Thread
> +// CHECK:   Mutex {{.*}} created at:
> +// CHECK:     #0 pthread_mutex_init
> +// CHECK:     #1 main
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/race_on_barrier.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/race_on_barrier.c?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/race_on_barrier.c (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/race_on_barrier.c Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,31 @@
> +// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdio.h>
> +#include <stddef.h>
> +#include <unistd.h>
> +
> +pthread_barrier_t B;
> +int Global;
> +
> +void *Thread1(void *x) {
> +  pthread_barrier_init(&B, 0, 2);
> +  pthread_barrier_wait(&B);
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  usleep(1000000);
> +  pthread_barrier_wait(&B);
> +  return NULL;
> +}
> +
> +int main() {
> +  pthread_t t;
> +  pthread_create(&t, NULL, Thread1, NULL);
> +  Thread2(0);
> +  pthread_join(t, NULL);
> +  pthread_barrier_destroy(&B);
> +  return 0;
> +}
> +
> +// CHECK:      WARNING: ThreadSanitizer: data race
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/race_on_barrier2.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/race_on_barrier2.c?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/race_on_barrier2.c (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/race_on_barrier2.c Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,31 @@
> +// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdio.h>
> +#include <stddef.h>
> +#include <unistd.h>
> +
> +pthread_barrier_t B;
> +int Global;
> +
> +void *Thread1(void *x) {
> +  if (pthread_barrier_wait(&B) == PTHREAD_BARRIER_SERIAL_THREAD)
> +    pthread_barrier_destroy(&B);
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  if (pthread_barrier_wait(&B) == PTHREAD_BARRIER_SERIAL_THREAD)
> +    pthread_barrier_destroy(&B);
> +  return NULL;
> +}
> +
> +int main() {
> +  pthread_barrier_init(&B, 0, 2);
> +  pthread_t t;
> +  pthread_create(&t, NULL, Thread1, NULL);
> +  Thread2(0);
> +  pthread_join(t, NULL);
> +  return 0;
> +}
> +
> +// CHECK:      WARNING: ThreadSanitizer: data race
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/race_on_heap.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/race_on_heap.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/race_on_heap.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/race_on_heap.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,47 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +
> +void *Thread1(void *p) {
> +  *(int*)p = 42;
> +  return 0;
> +}
> +
> +void *Thread2(void *p) {
> +  *(int*)p = 44;
> +  return 0;
> +}
> +
> +void *alloc() {
> +  return malloc(99);
> +}
> +
> +void *AllocThread(void* arg) {
> +  return alloc();
> +}
> +
> +int main() {
> +  void *p = 0;
> +  pthread_t t[2];
> +  pthread_create(&t[0], 0, AllocThread, 0);
> +  pthread_join(t[0], &p);
> +  fprintf(stderr, "addr=%p\n", p);
> +  pthread_create(&t[0], 0, Thread1, (char*)p + 16);
> +  pthread_create(&t[1], 0, Thread2, (char*)p + 16);
> +  pthread_join(t[0], 0);
> +  pthread_join(t[1], 0);
> +  return 0;
> +}
> +
> +// CHECK: addr=[[ADDR:0x[0-9,a-f]+]]
> +// CHECK: WARNING: ThreadSanitizer: data race
> +// ...
> +// CHECK:   Location is heap block of size 99 at [[ADDR]] allocated by thread 1:
> +// CHCEKL     #0 malloc
> +// CHECK:     #1 alloc
> +// CHECK:     #2 AllocThread
> +// ...
> +// CHECK:   Thread 1 (finished) created at:
> +// CHECK:     #0 pthread_create
> +// CHECK:     #1 main
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/race_on_mutex.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/race_on_mutex.c?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/race_on_mutex.c (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/race_on_mutex.c Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,42 @@
> +// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdio.h>
> +#include <stddef.h>
> +#include <unistd.h>
> +
> +pthread_mutex_t Mtx;
> +int Global;
> +
> +void *Thread1(void *x) {
> +  pthread_mutex_init(&Mtx, 0);
> +  pthread_mutex_lock(&Mtx);
> +  Global = 42;
> +  pthread_mutex_unlock(&Mtx);
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  usleep(1000000);
> +  pthread_mutex_lock(&Mtx);
> +  Global = 43;
> +  pthread_mutex_unlock(&Mtx);
> +  return NULL;
> +}
> +
> +int main() {
> +  pthread_t t[2];
> +  pthread_create(&t[0], NULL, Thread1, NULL);
> +  pthread_create(&t[1], NULL, Thread2, NULL);
> +  pthread_join(t[0], NULL);
> +  pthread_join(t[1], NULL);
> +  pthread_mutex_destroy(&Mtx);
> +  return 0;
> +}
> +
> +// CHECK:      WARNING: ThreadSanitizer: data race
> +// CHECK-NEXT:   Read of size 1 at {{.*}} by thread 2:
> +// CHECK-NEXT:     #0 pthread_mutex_lock
> +// CHECK-NEXT:     #1 Thread2{{.*}} {{.*}}race_on_mutex.c:20{{(:3)?}} ({{.*}})
> +// CHECK:        Previous write of size 1 at {{.*}} by thread 1:
> +// CHECK-NEXT:     #0 pthread_mutex_init {{.*}} ({{.*}})
> +// CHECK-NEXT:     #1 Thread1{{.*}} {{.*}}race_on_mutex.c:11{{(:3)?}} ({{.*}})
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/race_with_finished_thread.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/race_with_finished_thread.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/race_with_finished_thread.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/race_with_finished_thread.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,43 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stddef.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <unistd.h>
> +
> +// Ensure that we can restore a stack of a finished thread.
> +
> +int g_data;
> +
> +void __attribute__((noinline)) foobar(int *p) {
> +  *p = 42;
> +}
> +
> +void *Thread1(void *x) {
> +  foobar(&g_data);
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  usleep(1000*1000);
> +  g_data = 43;
> +  return NULL;
> +}
> +
> +int main() {
> +  pthread_t t[2];
> +  pthread_create(&t[0], NULL, Thread1, NULL);
> +  pthread_create(&t[1], NULL, Thread2, NULL);
> +  pthread_join(t[0], NULL);
> +  pthread_join(t[1], NULL);
> +  return 0;
> +}
> +
> +// CHECK: WARNING: ThreadSanitizer: data race
> +// CHECK:   Write of size 4 at {{.*}} by thread 2:
> +// CHECK:   Previous write of size 4 at {{.*}} by thread 1:
> +// CHECK:     #0 foobar
> +// CHECK:     #1 Thread1
> +// CHECK:   Thread 1 (finished) created at:
> +// CHECK:     #0 pthread_create
> +// CHECK:     #1 main
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/simple_race.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/simple_race.c?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/simple_race.c (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/simple_race.c Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,26 @@
> +// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdio.h>
> +
> +int Global;
> +
> +void *Thread1(void *x) {
> +  Global = 42;
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  Global = 43;
> +  return NULL;
> +}
> +
> +int main() {
> +  pthread_t t[2];
> +  pthread_create(&t[0], NULL, Thread1, NULL);
> +  pthread_create(&t[1], NULL, Thread2, NULL);
> +  pthread_join(t[0], NULL);
> +  pthread_join(t[1], NULL);
> +  return 0;
> +}
> +
> +// CHECK: WARNING: ThreadSanitizer: data race
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/simple_race.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/simple_race.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/simple_race.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/simple_race.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,25 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdio.h>
> +
> +int Global;
> +
> +void *Thread1(void *x) {
> +  Global++;
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  Global--;
> +  return NULL;
> +}
> +
> +int main() {
> +  pthread_t t[2];
> +  pthread_create(&t[0], NULL, Thread1, NULL);
> +  pthread_create(&t[1], NULL, Thread2, NULL);
> +  pthread_join(t[0], NULL);
> +  pthread_join(t[1], NULL);
> +}
> +
> +// CHECK: WARNING: ThreadSanitizer: data race
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/simple_stack.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/simple_stack.c?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/simple_stack.c (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/simple_stack.c Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,66 @@
> +// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdio.h>
> +#include <unistd.h>
> +
> +int Global;
> +
> +void __attribute__((noinline)) foo1() {
> +  Global = 42;
> +}
> +
> +void __attribute__((noinline)) bar1() {
> +  volatile int tmp = 42; (void)tmp;
> +  foo1();
> +}
> +
> +void __attribute__((noinline)) foo2() {
> +  volatile int v = Global; (void)v;
> +}
> +
> +void __attribute__((noinline)) bar2() {
> +  volatile int tmp = 42; (void)tmp;
> +  foo2();
> +}
> +
> +void *Thread1(void *x) {
> +  usleep(1000000);
> +  bar1();
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  bar2();
> +  return NULL;
> +}
> +
> +void StartThread(pthread_t *t, void *(*f)(void*)) {
> +  pthread_create(t, NULL, f, NULL);
> +}
> +
> +int main() {
> +  pthread_t t[2];
> +  StartThread(&t[0], Thread1);
> +  StartThread(&t[1], Thread2);
> +  pthread_join(t[0], NULL);
> +  pthread_join(t[1], NULL);
> +  return 0;
> +}
> +
> +// CHECK:      WARNING: ThreadSanitizer: data race
> +// CHECK-NEXT:   Write of size 4 at {{.*}} by thread 1:
> +// CHECK-NEXT:     #0 foo1{{.*}} {{.*}}simple_stack.c:9{{(:3)?}} ({{.*}})
> +// CHECK-NEXT:     #1 bar1{{.*}} {{.*}}simple_stack.c:14{{(:3)?}} ({{.*}})
> +// CHECK-NEXT:     #2 Thread1{{.*}} {{.*}}simple_stack.c:28{{(:3)?}} ({{.*}})
> +// CHECK:        Previous read of size 4 at {{.*}} by thread 2:
> +// CHECK-NEXT:     #0 foo2{{.*}} {{.*}}simple_stack.c:18{{(:26)?}} ({{.*}})
> +// CHECK-NEXT:     #1 bar2{{.*}} {{.*}}simple_stack.c:23{{(:3)?}} ({{.*}})
> +// CHECK-NEXT:     #2 Thread2{{.*}} {{.*}}simple_stack.c:33{{(:3)?}} ({{.*}})
> +// CHECK:        Thread 1 (running) created at:
> +// CHECK-NEXT:     #0 pthread_create {{.*}} ({{.*}})
> +// CHECK-NEXT:     #1 StartThread{{.*}} {{.*}}simple_stack.c:38{{(:3)?}} ({{.*}})
> +// CHECK-NEXT:     #2 main{{.*}} {{.*}}simple_stack.c:43{{(:3)?}} ({{.*}})
> +// CHECK:        Thread 2 ({{.*}}) created at:
> +// CHECK-NEXT:     #0 pthread_create {{.*}} ({{.*}})
> +// CHECK-NEXT:     #1 StartThread{{.*}} {{.*}}simple_stack.c:38{{(:3)?}} ({{.*}})
> +// CHECK-NEXT:     #2 main{{.*}} {{.*}}simple_stack.c:44{{(:3)?}} ({{.*}})
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/simple_stack2.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/simple_stack2.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/simple_stack2.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/simple_stack2.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,53 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdio.h>
> +#include <unistd.h>
> +
> +int Global;
> +
> +void __attribute__((noinline)) foo1() {
> +  Global = 42;
> +}
> +
> +void __attribute__((noinline)) bar1() {
> +  volatile int tmp = 42;
> +  int tmp2 = tmp;
> +  (void)tmp2;
> +  foo1();
> +}
> +
> +void __attribute__((noinline)) foo2() {
> +  volatile int tmp = Global;
> +  int tmp2 = tmp;
> +  (void)tmp2;
> +}
> +
> +void __attribute__((noinline)) bar2() {
> +  volatile int tmp = 42;
> +  int tmp2 = tmp;
> +  (void)tmp2;
> +  foo2();
> +}
> +
> +void *Thread1(void *x) {
> +  usleep(1000000);
> +  bar1();
> +  return NULL;
> +}
> +
> +int main() {
> +  pthread_t t;
> +  pthread_create(&t, NULL, Thread1, NULL);
> +  bar2();
> +  pthread_join(t, NULL);
> +}
> +
> +// CHECK:      WARNING: ThreadSanitizer: data race
> +// CHECK-NEXT:   Write of size 4 at {{.*}} by thread 1:
> +// CHECK-NEXT:     #0 foo1{{.*}} {{.*}}simple_stack2.cc:9{{(:3)?}} ({{.*}})
> +// CHECK-NEXT:     #1 bar1{{.*}} {{.*}}simple_stack2.cc:16{{(:3)?}} ({{.*}})
> +// CHECK-NEXT:     #2 Thread1{{.*}} {{.*}}simple_stack2.cc:34{{(:3)?}} ({{.*}})
> +// CHECK:        Previous read of size 4 at {{.*}} by main thread:
> +// CHECK-NEXT:     #0 foo2{{.*}} {{.*}}simple_stack2.cc:20{{(:28)?}} ({{.*}})
> +// CHECK-NEXT:     #1 bar2{{.*}} {{.*}}simple_stack2.cc:29{{(:3)?}} ({{.*}})
> +// CHECK-NEXT:     #2 main{{.*}} {{.*}}simple_stack2.cc:41{{(:3)?}} ({{.*}})
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/sleep_sync.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/sleep_sync.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/sleep_sync.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/sleep_sync.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,30 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <unistd.h>
> +
> +int X = 0;
> +
> +void *Thread(void *p) {
> +  X = 42;
> +  return 0;
> +}
> +
> +void MySleep() {
> +  usleep(100*1000);
> +}
> +
> +int main() {
> +  pthread_t t;
> +  pthread_create(&t, 0, Thread, 0);
> +  MySleep();  // Assume the thread has done the write.
> +  X = 43;
> +  pthread_join(t, 0);
> +  return 0;
> +}
> +
> +// CHECK: WARNING: ThreadSanitizer: data race
> +// ...
> +// CHECK:   As if synchronized via sleep:
> +// CHECK-NEXT:     #0 usleep
> +// CHECK-NEXT:     #1 MySleep
> +// CHECK-NEXT:     #2 main
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/sleep_sync2.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/sleep_sync2.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/sleep_sync2.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/sleep_sync2.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,22 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <unistd.h>
> +
> +int X = 0;
> +
> +void *Thread(void *p) {
> +  X = 42;
> +  return 0;
> +}
> +
> +int main() {
> +  pthread_t t;
> +  usleep(100*1000);
> +  pthread_create(&t, 0, Thread, 0);
> +  X = 43;
> +  pthread_join(t, 0);
> +  return 0;
> +}
> +
> +// CHECK: WARNING: ThreadSanitizer: data race
> +// CHECK-NOT: As if synchronized via sleep
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/static_init1.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/static_init1.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/static_init1.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/static_init1.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,27 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +
> +struct P {
> +  int x;
> +  int y;
> +};
> +
> +void *Thread(void *x) {
> +  static P p = {rand(), rand()};
> +  if (p.x > RAND_MAX || p.y > RAND_MAX)
> +    exit(1);
> +  return 0;
> +}
> +
> +int main() {
> +  pthread_t t[2];
> +  pthread_create(&t[0], 0, Thread, 0);
> +  pthread_create(&t[1], 0, Thread, 0);
> +  pthread_join(t[0], 0);
> +  pthread_join(t[1], 0);
> +  printf("PASS\n");
> +}
> +
> +// CHECK-NOT: WARNING: ThreadSanitizer: data race
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/static_init2.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/static_init2.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/static_init2.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/static_init2.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,33 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +
> +struct Cache {
> +  int x;
> +  explicit Cache(int x)
> +    : x(x) {
> +  }
> +};
> +
> +void foo(Cache *my) {
> +  static Cache *c = my ? my : new Cache(rand());
> +  if (c->x >= RAND_MAX)
> +    exit(1);
> +}
> +
> +void *Thread(void *x) {
> +  foo(new Cache(rand()));
> +  return 0;
> +}
> +
> +int main() {
> +  pthread_t t[2];
> +  pthread_create(&t[0], 0, Thread, 0);
> +  pthread_create(&t[1], 0, Thread, 0);
> +  pthread_join(t[0], 0);
> +  pthread_join(t[1], 0);
> +  printf("PASS\n");
> +}
> +
> +// CHECK-NOT: WARNING: ThreadSanitizer: data race
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/static_init3.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/static_init3.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/static_init3.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/static_init3.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,47 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <sched.h>
> +
> +struct Cache {
> +  int x;
> +};
> +
> +Cache g_cache;
> +
> +Cache *CreateCache() {
> +  g_cache.x = rand();
> +  return &g_cache;
> +}
> +
> +_Atomic(Cache*) queue;
> +
> +void *Thread1(void *x) {
> +  static Cache *c = CreateCache();
> +  __c11_atomic_store(&queue, c, 0);
> +  return 0;
> +}
> +
> +void *Thread2(void *x) {
> +  Cache *c = 0;
> +  for (;;) {
> +    c = __c11_atomic_load(&queue, 0);
> +    if (c)
> +      break;
> +    sched_yield();
> +  }
> +  if (c->x >= RAND_MAX)
> +    exit(1);
> +  return 0;
> +}
> +
> +int main() {
> +  pthread_t t[2];
> +  pthread_create(&t[0], 0, Thread1, 0);
> +  pthread_create(&t[1], 0, Thread2, 0);
> +  pthread_join(t[0], 0);
> +  pthread_join(t[1], 0);
> +}
> +
> +// CHECK: WARNING: ThreadSanitizer: data race
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/static_init4.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/static_init4.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/static_init4.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/static_init4.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,37 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <sched.h>
> +
> +struct Cache {
> +  int x;
> +  explicit Cache(int x)
> +    : x(x) {
> +  }
> +};
> +
> +int g_other;
> +
> +Cache *CreateCache() {
> +  g_other = rand();
> +  return new Cache(rand());
> +}
> +
> +void *Thread1(void *x) {
> +  static Cache *c = CreateCache();
> +  if (c->x == g_other)
> +    exit(1);
> +  return 0;
> +}
> +
> +int main() {
> +  pthread_t t[2];
> +  pthread_create(&t[0], 0, Thread1, 0);
> +  pthread_create(&t[1], 0, Thread1, 0);
> +  pthread_join(t[0], 0);
> +  pthread_join(t[1], 0);
> +  printf("PASS\n");
> +}
> +
> +// CHECK-NOT: WARNING: ThreadSanitizer: data race
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/static_init5.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/static_init5.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/static_init5.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/static_init5.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,42 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <sched.h>
> +
> +struct Cache {
> +  int x;
> +  explicit Cache(int x)
> +    : x(x) {
> +  }
> +};
> +
> +void *AsyncInit(void *p) {
> +  return new Cache((int)(long)p);
> +}
> +
> +Cache *CreateCache() {
> +  pthread_t t;
> +  pthread_create(&t, 0, AsyncInit, (void*)rand());
> +  void *res;
> +  pthread_join(t, &res);
> +  return (Cache*)res;
> +}
> +
> +void *Thread1(void *x) {
> +  static Cache *c = CreateCache();
> +  if (c->x >= RAND_MAX)
> +    exit(1);
> +  return 0;
> +}
> +
> +int main() {
> +  pthread_t t[2];
> +  pthread_create(&t[0], 0, Thread1, 0);
> +  pthread_create(&t[1], 0, Thread1, 0);
> +  pthread_join(t[0], 0);
> +  pthread_join(t[1], 0);
> +  printf("PASS\n");
> +}
> +
> +// CHECK-NOT: WARNING: ThreadSanitizer: data race
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/suppress_same_address.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/suppress_same_address.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/suppress_same_address.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/suppress_same_address.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,27 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +
> +int X;
> +
> +void *Thread1(void *x) {
> +  X = 42;
> +  X = 66;
> +  X = 78;
> +  return 0;
> +}
> +
> +void *Thread2(void *x) {
> +  X = 11;
> +  X = 99;
> +  X = 73;
> +  return 0;
> +}
> +
> +int main() {
> +  pthread_t t;
> +  pthread_create(&t, 0, Thread1, 0);
> +  Thread2(0);
> +  pthread_join(t, 0);
> +}
> +
> +// CHECK: ThreadSanitizer: reported 1 warnings
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/suppress_same_stacks.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/suppress_same_stacks.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/suppress_same_stacks.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/suppress_same_stacks.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,27 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +
> +volatile int N;  // Prevent loop unrolling.
> +int **data;
> +
> +void *Thread1(void *x) {
> +  for (int i = 0; i < N; i++)
> +    data[i][0] = 42;
> +  return 0;
> +}
> +
> +int main() {
> +  N = 4;
> +  data = new int*[N];
> +  for (int i = 0; i < N; i++)
> +    data[i] = new int;
> +  pthread_t t;
> +  pthread_create(&t, 0, Thread1, 0);
> +  Thread1(0);
> +  pthread_join(t, 0);
> +  for (int i = 0; i < N; i++)
> +    delete data[i];
> +  delete[] data;
> +}
> +
> +// CHECK: ThreadSanitizer: reported 1 warnings
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/test_output.sh
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/test_output.sh?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/test_output.sh (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/test_output.sh Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,49 @@
> +#!/bin/bash
> +
> +ulimit -s 8192
> +set -e # fail on any error
> +
> +ROOTDIR=$(dirname $0)/..
> +
> +# Assuming clang is in path.
> +CC=clang
> +CXX=clang++
> +
> +# TODO: add testing for all of -O0...-O3
> +CFLAGS="-fthread-sanitizer -fPIE -O1 -g -fno-builtin -Wall"
> +LDFLAGS="-pie -lpthread -ldl $ROOTDIR/rtl/libtsan.a"
> +
> +test_file() {
> +  SRC=$1
> +  COMPILER=$2
> +  echo ----- TESTING $(basename $1)
> +  OBJ=$SRC.o
> +  EXE=$SRC.exe
> +  $COMPILER $SRC $CFLAGS -c -o $OBJ
> +  $COMPILER $OBJ $LDFLAGS -o $EXE
> +  RES=$(TSAN_OPTIONS="atexit_sleep_ms=0" $EXE 2>&1 || true)
> +  if [ "$3" != "" ]; then
> +    printf "%s\n" "$RES"
> +  fi
> +  printf "%s\n" "$RES" | FileCheck $SRC
> +  if [ "$3" == "" ]; then
> +    rm -f $EXE $OBJ
> +  fi
> +}
> +
> +if [ "$1" == "" ]; then
> +  for c in $ROOTDIR/lit_tests/*.{c,cc}; do
> +    if [[ $c == */failing_* ]]; then
> +      echo SKIPPING FAILING TEST $c
> +      continue
> +    fi
> +    COMPILER=$CXX
> +    case $c in
> +      *.c) COMPILER=$CC
> +    esac
> +    test_file $c $COMPILER
> +  done
> +  wait
> +else
> +  test_file $ROOTDIR/lit_tests/$1 $CXX "DUMP"
> +fi
>
> Propchange: compiler-rt/trunk/lib/tsan/lit_tests/test_output.sh
> ------------------------------------------------------------------------------
>     svn:executable = *
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/thread_leak.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/thread_leak.c?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/thread_leak.c (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/thread_leak.c Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,17 @@
> +// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdio.h>
> +
> +void *Thread(void *x) {
> +  return 0;
> +}
> +
> +int main() {
> +  pthread_t t;
> +  pthread_create(&t, 0, Thread, 0);
> +  pthread_join(t, 0);
> +  printf("PASS\n");
> +  return 0;
> +}
> +
> +// CHECK-NOT: WARNING: ThreadSanitizer: thread leak
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/thread_leak2.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/thread_leak2.c?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/thread_leak2.c (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/thread_leak2.c Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,17 @@
> +// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <stdio.h>
> +
> +void *Thread(void *x) {
> +  return 0;
> +}
> +
> +int main() {
> +  pthread_t t;
> +  pthread_create(&t, 0, Thread, 0);
> +  pthread_detach(t);
> +  printf("PASS\n");
> +  return 0;
> +}
> +
> +// CHECK-NOT: WARNING: ThreadSanitizer: thread leak
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/thread_leak3.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/thread_leak3.c?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/thread_leak3.c (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/thread_leak3.c Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,14 @@
> +// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +
> +void *Thread(void *x) {
> +  return 0;
> +}
> +
> +int main() {
> +  pthread_t t;
> +  pthread_create(&t, 0, Thread, 0);
> +  return 0;
> +}
> +
> +// CHECK: WARNING: ThreadSanitizer: thread leak
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/tiny_race.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/tiny_race.c?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/tiny_race.c (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/tiny_race.c Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,15 @@
> +// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +int Global;
> +void *Thread1(void *x) {
> +  Global = 42;
> +  return x;
> +}
> +int main() {
> +  pthread_t t;
> +  pthread_create(&t, NULL, Thread1, NULL);
> +  Global = 43;
> +  pthread_join(t, NULL);
> +  return Global;
> +}
> +// CHECK: WARNING: ThreadSanitizer: data race
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/virtual_inheritance_compile_bug.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/virtual_inheritance_compile_bug.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/virtual_inheritance_compile_bug.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/virtual_inheritance_compile_bug.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,15 @@
> +// Regression test for http://code.google.com/p/thread-sanitizer/issues/detail?id=3.
> +// The C++ variant is much more compact that the LLVM IR equivalent.
> +
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <stdio.h>
> +struct AAA              {  virtual long aaa () { return 0; } };  // NOLINT
> +struct BBB: virtual AAA { unsigned long bbb; };  // NOLINT
> +struct CCC: virtual AAA { };
> +struct DDD: CCC, BBB { DDD(); };  // NOLINT
> +DDD::DDD()  { }
> +int main() {
> +  DDD d;
> +  printf("OK\n");
> +}
> +// CHECK: OK
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/vptr_benign_race.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/vptr_benign_race.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/vptr_benign_race.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/vptr_benign_race.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,51 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <semaphore.h>
> +#include <stdio.h>
> +
> +struct A {
> +  A() {
> +    sem_init(&sem_, 0, 0);
> +  }
> +  virtual void F() {
> +  }
> +  void Done() {
> +    sem_post(&sem_);
> +  }
> +  virtual ~A() {
> +  }
> +  sem_t sem_;
> +};
> +
> +struct B : A {
> +  virtual void F() {
> +  }
> +  virtual ~B() {
> +    sem_wait(&sem_);
> +    sem_destroy(&sem_);
> +  }
> +};
> +
> +static A *obj = new B;
> +
> +void *Thread1(void *x) {
> +  obj->F();
> +  obj->Done();
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  delete obj;
> +  return NULL;
> +}
> +
> +int main() {
> +  pthread_t t[2];
> +  pthread_create(&t[0], NULL, Thread1, NULL);
> +  pthread_create(&t[1], NULL, Thread2, NULL);
> +  pthread_join(t[0], NULL);
> +  pthread_join(t[1], NULL);
> +  fprintf(stderr, "PASS\n");
> +}
> +// CHECK: PASS
> +// CHECK-NOT: WARNING: ThreadSanitizer: data race
>
> Added: compiler-rt/trunk/lib/tsan/lit_tests/vptr_harmful_race.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/vptr_harmful_race.cc?rev=164110&view=auto
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/lit_tests/vptr_harmful_race.cc (added)
> +++ compiler-rt/trunk/lib/tsan/lit_tests/vptr_harmful_race.cc Tue Sep 18 02:23:54 2012
> @@ -0,0 +1,49 @@
> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
> +#include <pthread.h>
> +#include <semaphore.h>
> +#include <stdio.h>
> +
> +struct A {
> +  A() {
> +    sem_init(&sem_, 0, 0);
> +  }
> +  virtual void F() {
> +  }
> +  void Done() {
> +    sem_post(&sem_);
> +  }
> +  virtual ~A() {
> +    sem_wait(&sem_);
> +    sem_destroy(&sem_);
> +  }
> +  sem_t sem_;
> +};
> +
> +struct B : A {
> +  virtual void F() {
> +  }
> +  virtual ~B() { }
> +};
> +
> +static A *obj = new B;
> +
> +void *Thread1(void *x) {
> +  obj->F();
> +  obj->Done();
> +  return NULL;
> +}
> +
> +void *Thread2(void *x) {
> +  delete obj;
> +  return NULL;
> +}
> +
> +int main() {
> +  pthread_t t[2];
> +  pthread_create(&t[0], NULL, Thread1, NULL);
> +  pthread_create(&t[1], NULL, Thread2, NULL);
> +  pthread_join(t[0], NULL);
> +  pthread_join(t[1], NULL);
> +}
> +
> +// CHECK: WARNING: ThreadSanitizer: data race
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list