<div dir="ltr">If I type "ninja" I get this: <div><br></div><div><div>Make Error at /usr/local/google/kcc/llvm_cmake/projects/compiler-rt/lib/tsan/libcxx_tsan/src/libcxx_tsan-stamp/libcxx_tsan-build.cmake:17 (message):</div>
<div>  Command failed: 1</div><div><br></div><div>   '/home/kcc/cmake/bin/cmake' '--build' '/usr/local/google/kcc/llvm_cmake/projects/compiler-rt/lib/tsan/libcxx_tsan/src/libcxx_tsan-build' '--config' '.'</div>
</div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, May 14, 2014 at 2:30 AM, Alexey Samsonov <span dir="ltr"><<a href="mailto:samsonov@google.com" target="_blank">samsonov@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: samsonov<br>
Date: Tue May 13 17:30:16 2014<br>
New Revision: 208737<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=208737&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=208737&view=rev</a><br>
Log:<br>
[TSan] Build TSan-instrumented version of libcxx and use it in lit tests.<br>
<br>
TSan can produce false positives in code that uses C++11 threading,<br>
as it doesn't see synchronization inside standard library. See<br>
<a href="http://lists.cs.uiuc.edu/pipermail/cfe-dev/2014-February/035408.html" target="_blank">http://lists.cs.uiuc.edu/pipermail/cfe-dev/2014-February/035408.html</a><br>
for an example of such case.<br>
<br>
We may build custom TSan-instrumented version libcxx to fight with that.<br>
This change adds build rules for libcxx_tsan and integrates it into<br>
testing infrastructure.<br>
<br>
Added:<br>
    compiler-rt/trunk/test/tsan/libcxx/<br>
    compiler-rt/trunk/test/tsan/libcxx/lit.local.cfg<br>
    compiler-rt/trunk/test/tsan/libcxx/std_shared_ptr.cc<br>
Modified:<br>
    compiler-rt/trunk/lib/tsan/CMakeLists.txt<br>
    compiler-rt/trunk/test/<a href="http://lit.common.configured.in" target="_blank">lit.common.configured.in</a><br>
    compiler-rt/trunk/test/tsan/CMakeLists.txt<br>
    compiler-rt/trunk/test/tsan/lit.cfg<br>
    compiler-rt/trunk/test/tsan/<a href="http://lit.site.cfg.in" target="_blank">lit.site.cfg.in</a><br>
<br>
Modified: compiler-rt/trunk/lib/tsan/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/CMakeLists.txt?rev=208737&r1=208736&r2=208737&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/CMakeLists.txt?rev=208737&r1=208736&r2=208737&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/CMakeLists.txt (original)<br>
+++ compiler-rt/trunk/lib/tsan/CMakeLists.txt Tue May 13 17:30:16 2014<br>
@@ -75,6 +75,7 @@ set(TSAN_HEADERS<br>
   rtl/tsan_update_shadow_word_inl.h<br>
   rtl/tsan_vector.h)<br>
<br>
+set(TSAN_RUNTIME_LIBRARIES)<br>
 add_custom_target(tsan)<br>
 # TSan is currently supported on 64-bit Linux only.<br>
 if(CAN_TARGET_x86_64 AND UNIX AND NOT APPLE)<br>
@@ -90,6 +91,7 @@ if(CAN_TARGET_x86_64 AND UNIX AND NOT AP<br>
             $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}><br>
     CFLAGS ${TSAN_RTL_CFLAGS}<br>
     DEFS ${TSAN_COMMON_DEFINITIONS})<br>
+  list(APPEND TSAN_RUNTIME_LIBRARIES clang_rt.tsan-${arch})<br>
   add_sanitizer_rt_symbols(clang_rt.tsan-${arch} rtl/tsan.syms.extra)<br>
   add_dependencies(tsan clang_rt.tsan-${arch}<br>
     clang_rt.tsan-${arch}-symbols)<br>
@@ -97,6 +99,14 @@ endif()<br>
<br>
 add_dependencies(compiler-rt tsan)<br>
<br>
+# Build libcxx instrumented with TSan.<br>
+if(COMPILER_RT_HAS_LIBCXX_SOURCES)<br>
+  set(LIBCXX_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libcxx_tsan)<br>
+  add_custom_libcxx(libcxx_tsan ${LIBCXX_PREFIX}<br>
+    DEPS ${TSAN_RUNTIME_LIBRARIES}<br>
+    CFLAGS -fsanitize=thread)<br>
+endif()<br>
+<br>
 if(COMPILER_RT_INCLUDE_TESTS)<br>
   add_subdirectory(tests)<br>
 endif()<br>
<br>
Modified: compiler-rt/trunk/test/<a href="http://lit.common.configured.in" target="_blank">lit.common.configured.in</a><br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lit.common.configured.in?rev=208737&r1=208736&r2=208737&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lit.common.configured.in?rev=208737&r1=208736&r2=208737&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/test/<a href="http://lit.common.configured.in" target="_blank">lit.common.configured.in</a> (original)<br>
+++ compiler-rt/trunk/test/<a href="http://lit.common.configured.in" target="_blank">lit.common.configured.in</a> Tue May 13 17:30:16 2014<br>
@@ -16,6 +16,7 @@ set_default("llvm_build_mode", "@LLVM_BU<br>
 set_default("llvm_src_root", "@LLVM_SOURCE_DIR@")<br>
 set_default("llvm_obj_root", "@LLVM_BINARY_DIR@")<br>
 set_default("compiler_rt_src_root", "@COMPILER_RT_SOURCE_DIR@")<br>
+set_default("compiler_rt_obj_root", "@COMPILER_RT_BINARY_DIR@")<br>
 set_default("llvm_tools_dir", "@LLVM_TOOLS_DIR@")<br>
 set_default("clang", "@COMPILER_RT_TEST_COMPILER@")<br>
 set_default("compiler_id", "@COMPILER_RT_TEST_COMPILER_ID@")<br>
<br>
Modified: compiler-rt/trunk/test/tsan/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/CMakeLists.txt?rev=208737&r1=208736&r2=208737&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/CMakeLists.txt?rev=208737&r1=208736&r2=208737&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/test/tsan/CMakeLists.txt (original)<br>
+++ compiler-rt/trunk/test/tsan/CMakeLists.txt Tue May 13 17:30:16 2014<br>
@@ -1,11 +1,17 @@<br>
-configure_lit_site_cfg(<br>
-  ${CMAKE_CURRENT_SOURCE_DIR}/<a href="http://lit.site.cfg.in" target="_blank">lit.site.cfg.in</a><br>
-  ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg)<br>
-<br>
 set(TSAN_TEST_DEPS ${SANITIZER_COMMON_LIT_TEST_DEPS})<br>
 if(NOT COMPILER_RT_STANDALONE_BUILD)<br>
   list(APPEND TSAN_TEST_DEPS tsan)<br>
 endif()<br>
+if(COMPILER_RT_HAS_LIBCXX_SOURCES)<br>
+  list(APPEND TSAN_TEST_DEPS libcxx_tsan)<br>
+  set(TSAN_HAS_LIBCXX True)<br>
+else()<br>
+  set(TSAN_HAS_LIBCXX False)<br>
+endif()<br>
+<br>
+configure_lit_site_cfg(<br>
+  ${CMAKE_CURRENT_SOURCE_DIR}/<a href="http://lit.site.cfg.in" target="_blank">lit.site.cfg.in</a><br>
+  ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg)<br>
<br>
 if(COMPILER_RT_INCLUDE_TESTS)<br>
   configure_lit_site_cfg(<br>
<br>
Added: compiler-rt/trunk/test/tsan/libcxx/lit.local.cfg<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/libcxx/lit.local.cfg?rev=208737&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/libcxx/lit.local.cfg?rev=208737&view=auto</a><br>

==============================================================================<br>
--- compiler-rt/trunk/test/tsan/libcxx/lit.local.cfg (added)<br>
+++ compiler-rt/trunk/test/tsan/libcxx/lit.local.cfg Tue May 13 17:30:16 2014<br>
@@ -0,0 +1,10 @@<br>
+def getRoot(config):<br>
+  if not config.parent:<br>
+    return config<br>
+  return getRoot(config.parent)<br>
+<br>
+root = getRoot(config)<br>
+<br>
+if not root.has_libcxx:<br>
+  config.unsupported = True<br>
+<br>
<br>
Added: compiler-rt/trunk/test/tsan/libcxx/std_shared_ptr.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/libcxx/std_shared_ptr.cc?rev=208737&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/libcxx/std_shared_ptr.cc?rev=208737&view=auto</a><br>

==============================================================================<br>
--- compiler-rt/trunk/test/tsan/libcxx/std_shared_ptr.cc (added)<br>
+++ compiler-rt/trunk/test/tsan/libcxx/std_shared_ptr.cc Tue May 13 17:30:16 2014<br>
@@ -0,0 +1,24 @@<br>
+// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s<br>
+#include <stdio.h><br>
+#include <memory><br>
+#include <thread><br>
+<br>
+int main() {<br>
+  int v1 = 0;<br>
+  int v2 = 0;<br>
+  std::thread t1;<br>
+  std::thread t2;<br>
+<br>
+  {<br>
+     auto thingy = std::make_shared<int>(42);<br>
+     t1 = std::thread([thingy, &v1] { v1 = *thingy; });<br>
+     t2 = std::thread([thingy, &v2] { v2 = *thingy; });<br>
+  }<br>
+<br>
+  t1.join();<br>
+  t2.join();<br>
+  printf("%d %d\n", v1, v2);<br>
+  // CHECK-NOT: ThreadSanitizer: data race<br>
+  // CHECK: 42 42<br>
+  return 0;<br>
+}<br>
<br>
Modified: compiler-rt/trunk/test/tsan/lit.cfg<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/lit.cfg?rev=208737&r1=208736&r2=208737&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/lit.cfg?rev=208737&r1=208736&r2=208737&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/test/tsan/lit.cfg (original)<br>
+++ compiler-rt/trunk/test/tsan/lit.cfg Tue May 13 17:30:16 2014<br>
@@ -31,6 +31,18 @@ clang_tsan_cflags = ["-fsanitize=thread"<br>
                      "-ldl",<br>
                      "-m64"]<br>
 clang_tsan_cxxflags = config.cxx_mode_flags + clang_tsan_cflags<br>
+# Add additional flags if we're using instrumented libc++.<br>
+if config.has_libcxx:<br>
+  # FIXME: Dehardcode this path somehow.<br>
+  libcxx_path = os.path.join(config.compiler_rt_obj_root, "lib",<br>
+                             "tsan", "libcxx_tsan")<br>
+  libcxx_incdir = os.path.join(libcxx_path, "include", "c++", "v1")<br>
+  libcxx_libdir = os.path.join(libcxx_path, "lib")<br>
+  libcxx_so = os.path.join(libcxx_libdir, "libc++.so")<br>
+  clang_tsan_cxxflags += ["-std=c++11",<br>
+                          "-I%s" % libcxx_incdir,<br>
+                          libcxx_so,<br>
+                          "-Wl,-rpath=%s" % libcxx_libdir]<br>
<br>
 def build_invocation(compile_flags):<br>
   return " " + " ".join([config.clang] + compile_flags) + " "<br>
<br>
Modified: compiler-rt/trunk/test/tsan/<a href="http://lit.site.cfg.in" target="_blank">lit.site.cfg.in</a><br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/lit.site.cfg.in?rev=208737&r1=208736&r2=208737&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/lit.site.cfg.in?rev=208737&r1=208736&r2=208737&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/test/tsan/<a href="http://lit.site.cfg.in" target="_blank">lit.site.cfg.in</a> (original)<br>
+++ compiler-rt/trunk/test/tsan/<a href="http://lit.site.cfg.in" target="_blank">lit.site.cfg.in</a> Tue May 13 17:30:16 2014<br>
@@ -1,6 +1,8 @@<br>
 ## Autogenerated by LLVM/Clang configuration.<br>
 # Do not edit!<br>
<br>
+config.has_libcxx = @TSAN_HAS_LIBCXX@<br>
+<br>
 # Load common config for all compiler-rt lit tests.<br>
 lit_config.load_config(config, "@COMPILER_RT_BINARY_DIR@/test/lit.common.configured")<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>