<div dir="ltr">Can we use this for clang-msan bootstrap now?</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, May 10, 2014 at 2:11 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: Fri May  9 17:11:03 2014<br>
New Revision: 208451<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=208451&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=208451&view=rev</a><br>
Log:<br>
[CMake] Use ExternalProject to build MSan-ified version of libcxx for unit tests.<br>
<br>
This change lets MSan rely on libcxx's own build system instead of manually<br>
compiling its sources and setting up all the necessary compile flags. It would<br>
also simplify compiling libcxx with another sanitizers (in particular, TSan).<br>
<br>
The tricky part is to make sure libcxx is reconfigured/rebuilt when Clang or<br>
MSan runtime library is changed. "clobber" step used in this patch works well<br>
for me, but it's possible it would break for other configurations - will<br>
watch the buildbots.<br>
<br>
Modified:<br>
    compiler-rt/trunk/cmake/Modules/AddCompilerRT.cmake<br>
    compiler-rt/trunk/lib/msan/CMakeLists.txt<br>
    compiler-rt/trunk/lib/msan/tests/CMakeLists.txt<br>
<br>
Modified: compiler-rt/trunk/cmake/Modules/AddCompilerRT.cmake<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/cmake/Modules/AddCompilerRT.cmake?rev=208451&r1=208450&r2=208451&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/cmake/Modules/AddCompilerRT.cmake?rev=208451&r1=208450&r2=208451&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/cmake/Modules/AddCompilerRT.cmake (original)<br>
+++ compiler-rt/trunk/cmake/Modules/AddCompilerRT.cmake Fri May  9 17:11:03 2014<br>
@@ -1,4 +1,5 @@<br>
 include(AddLLVM)<br>
+include(ExternalProject)<br>
 include(LLVMParseArguments)<br>
 include(CompilerRTUtils)<br>
<br>
@@ -167,3 +168,48 @@ macro(add_compiler_rt_script name)<br>
     PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE<br>
     DESTINATION ${COMPILER_RT_INSTALL_PATH}/bin)<br>
 endmacro(add_compiler_rt_script src name)<br>
+<br>
+# Builds custom version of libc++ and installs it in <prefix>.<br>
+# Can be used to build sanitized versions of libc++ for running unit tests.<br>
+# add_custom_libcxx(<name> <prefix><br>
+#                   DEPS <list of build deps><br>
+#                   CFLAGS <list of compile flags>)<br>
+macro(add_custom_libcxx name prefix)<br>
+  if(NOT COMPILER_RT_HAS_LIBCXX_SOURCES)<br>
+    message(FATAL_ERROR "libcxx not found!")<br>
+  endif()<br>
+<br>
+  parse_arguments(LIBCXX "DEPS;CFLAGS" "" ${ARGN})<br>
+  foreach(flag ${LIBCXX_CFLAGS})<br>
+    set(flagstr "${flagstr} ${flag}")<br>
+  endforeach()<br>
+  set(LIBCXX_CFLAGS ${flagstr})<br>
+<br>
+  if(NOT COMPILER_RT_STANDALONE_BUILD)<br>
+    list(APPEND LIBCXX_DEPS clang)<br>
+  endif()<br>
+<br>
+  ExternalProject_Add(${name}<br>
+    PREFIX ${prefix}<br>
+    SOURCE_DIR ${COMPILER_RT_LIBCXX_PATH}<br>
+    CMAKE_ARGS -DCMAKE_C_COMPILER=${COMPILER_RT_TEST_COMPILER}<br>
+               -DCMAKE_CXX_COMPILER=${COMPILER_RT_TEST_COMPILER}<br>
+               -DCMAKE_C_FLAGS=${LIBCXX_CFLAGS}<br>
+               -DCMAKE_CXX_FLAGS=${LIBCXX_CFLAGS}<br>
+               -DCMAKE_BUILD_TYPE=Release<br>
+               -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR><br>
+    )<br>
+<br>
+  ExternalProject_Add_Step(${name} force-reconfigure<br>
+    DEPENDERS configure<br>
+    ALWAYS 1<br>
+    )<br>
+<br>
+  ExternalProject_Add_Step(${name} clobber<br>
+    COMMAND ${CMAKE_COMMAND} -E remove_directory <BINARY_DIR><br>
+    COMMAND ${CMAKE_COMMAND} -E make_directory <BINARY_DIR><br>
+    COMMENT "Clobberring ${name} build directory..."<br>
+    DEPENDERS configure<br>
+    DEPENDS ${LIBCXX_DEPS}<br>
+    )<br>
+endmacro()<br>
<br>
Modified: compiler-rt/trunk/lib/msan/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/CMakeLists.txt?rev=208451&r1=208450&r2=208451&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/CMakeLists.txt?rev=208451&r1=208450&r2=208451&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/msan/CMakeLists.txt (original)<br>
+++ compiler-rt/trunk/lib/msan/CMakeLists.txt Fri May  9 17:11:03 2014<br>
@@ -17,6 +17,8 @@ append_if(COMPILER_RT_HAS_FPIE_FLAG -fPI<br>
 # Prevent clang from generating libc calls.<br>
 append_if(COMPILER_RT_HAS_FFREESTANDING_FLAG -ffreestanding MSAN_RTL_CFLAGS)<br>
<br>
+set(MSAN_RUNTIME_LIBRARIES)<br>
+<br>
 # Static runtime library.<br>
 add_custom_target(msan)<br>
 set(arch "x86_64")<br>
@@ -28,6 +30,7 @@ if(CAN_TARGET_${arch})<br>
             $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}><br>
     CFLAGS ${MSAN_RTL_CFLAGS})<br>
   add_dependencies(msan clang_rt.msan-${arch})<br>
+  list(APPEND MSAN_RUNTIME_LIBRARIES clang_rt.msan-${arch})<br>
   if(UNIX)<br>
     add_sanitizer_rt_symbols(clang_rt.msan-${arch} msan.syms.extra)<br>
     add_dependencies(msan clang_rt.msan-${arch}-symbols)<br>
<br>
Modified: compiler-rt/trunk/lib/msan/tests/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/tests/CMakeLists.txt?rev=208451&r1=208450&r2=208451&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/tests/CMakeLists.txt?rev=208451&r1=208450&r2=208451&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/msan/tests/CMakeLists.txt (original)<br>
+++ compiler-rt/trunk/lib/msan/tests/CMakeLists.txt Fri May  9 17:11:03 2014<br>
@@ -5,29 +5,10 @@ include(CompilerRTLink)<br>
 include_directories(..)<br>
 include_directories(../..)<br>
<br>
-# Instrumented libcxx sources and build flags.<br>
-file(GLOB MSAN_LIBCXX_SOURCES ${COMPILER_RT_LIBCXX_PATH}/src/*.cpp)<br>
 set(MSAN_LIBCXX_CFLAGS<br>
-  -I${COMPILER_RT_LIBCXX_PATH}/include<br>
   -fsanitize=memory<br>
   -fsanitize-memory-track-origins<br>
-  -fPIC<br>
-  -Wno-\#warnings<br>
-  -Wno-pedantic<br>
-  -g<br>
-  -O2<br>
-  -fstrict-aliasing<br>
-  -fno-exceptions<br>
-  -nostdinc++<br>
-  -fno-omit-frame-pointer<br>
-  -mno-omit-leaf-frame-pointer)<br>
-set(MSAN_LIBCXX_LINK_FLAGS<br>
-  -nodefaultlibs<br>
-  -lrt<br>
-  -lc<br>
-  -lstdc++<br>
-  -fsanitize=memory)<br>
-append_if(COMPILER_RT_HAS_LIBPTHREAD -lpthread MSAN_LIBCXX_LINK_FLAGS)<br>
+  -Wno-pedantic)<br>
<br>
 # Unittest sources and build flags.<br>
 set(MSAN_UNITTEST_SOURCES msan_test.cc msan_test_main.cc)<br>
@@ -103,46 +84,23 @@ macro(msan_link_shared so_list so_name a<br>
   list(APPEND ${so_list} ${output_so})<br>
 endmacro()<br>
<br>
-# Link MSan unit test for a given architecture from a set<br>
-# of objects in ${ARGN}.<br>
-macro(add_msan_test test_suite test_name arch)<br>
-  get_target_flags_for_arch(${arch} TARGET_LINK_FLAGS)<br>
-  set(TEST_DEPS ${ARGN} ${MSAN_LOADABLE_SO})<br>
-  if(NOT COMPILER_RT_STANDALONE_BUILD)<br>
-    list(APPEND TEST_DEPS msan)<br>
-  endif()<br>
-  add_compiler_rt_test(${test_suite} ${test_name}<br>
-                       OBJECTS ${ARGN}<br>
-                       DEPS ${TEST_DEPS}<br>
-                       LINK_FLAGS ${MSAN_UNITTEST_LINK_FLAGS}<br>
-                                  ${TARGET_LINK_FLAGS}<br>
-                                  "-Wl,-rpath=${CMAKE_CURRENT_BINARY_DIR}")<br>
-endmacro()<br>
-<br>
 # Main MemorySanitizer unit tests.<br>
 add_custom_target(MsanUnitTests)<br>
 set_target_properties(MsanUnitTests PROPERTIES FOLDER "MSan unit tests")<br>
<br>
 # Adds MSan unit tests and benchmarks for architecture.<br>
 macro(add_msan_tests_for_arch arch kind)<br>
+  set(LIBCXX_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/../libcxx_msan${kind})<br>
+  add_custom_libcxx(libcxx_msan${kind} ${LIBCXX_PREFIX}<br>
+    DEPS ${MSAN_RUNTIME_LIBRARIES}<br>
+    CFLAGS ${MSAN_LIBCXX_CFLAGS} ${ARGN})<br>
+  set(MSAN_LIBCXX_SO ${LIBCXX_PREFIX}/lib/libc++.so)<br>
+<br>
   # Build gtest instrumented with MSan.<br>
   set(MSAN_INST_GTEST)<br>
   msan_compile(MSAN_INST_GTEST ${COMPILER_RT_GTEST_SOURCE} ${arch} "${kind}"<br>
                                ${MSAN_UNITTEST_INSTRUMENTED_CFLAGS} ${ARGN})<br>
<br>
-  # Build libcxx instrumented with MSan.<br>
-  set(MSAN_INST_LIBCXX_OBJECTS)<br>
-  foreach(SOURCE ${MSAN_LIBCXX_SOURCES})<br>
-    msan_compile(MSAN_INST_LIBCXX_OBJECTS ${SOURCE} ${arch} "${kind}"<br>
-                 ${MSAN_LIBCXX_CFLAGS} ${ARGN})<br>
-  endforeach(SOURCE)<br>
-<br>
-  set(MSAN_INST_LIBCXX)<br>
-  msan_link_shared(MSAN_INST_LIBCXX "libcxx" ${arch} "${kind}"<br>
-                   OBJECTS ${MSAN_INST_LIBCXX_OBJECTS}<br>
-                   LINKFLAGS ${MSAN_LIBCXX_LINK_FLAGS}<br>
-                   DEPS ${MSAN_INST_LIBCXX_OBJECTS})<br>
-<br>
   # Instrumented tests.<br>
   set(MSAN_INST_TEST_OBJECTS)<br>
   foreach (SOURCE ${MSAN_UNITTEST_SOURCES})<br>
@@ -172,10 +130,21 @@ macro(add_msan_tests_for_arch arch kind)<br>
                    OBJECTS ${MSANDR_TEST_OBJECTS}<br>
                    DEPS ${MSANDR_TEST_OBJECTS})<br>
<br>
-  # Link everything together.<br>
-  add_msan_test(MsanUnitTests "Msan-${arch}${kind}-Test" ${arch}<br>
-                ${MSAN_INST_TEST_OBJECTS} ${MSAN_INST_GTEST}<br>
-                ${MSAN_INST_LIBCXX} ${MSANDR_TEST_SO})<br>
+  set(MSAN_TEST_OBJECTS ${MSAN_INST_TEST_OBJECTS} ${MSAN_INST_GTEST}<br>
+                        ${MSANDR_TEST_SO})<br>
+  set(MSAN_TEST_DEPS ${MSAN_TEST_OBJECTS} libcxx_msan${kind}<br>
+                     ${MSAN_LOADABLE_SO})<br>
+  if(NOT COMPILER_RT_STANDALONE_BUILD)<br>
+    list(APPEND MSAN_TEST_DEPS msan)<br>
+  endif()<br>
+  get_target_flags_for_arch(${arch} TARGET_LINK_FLAGS)<br>
+  add_compiler_rt_test(MsanUnitTests "Msan-${arch}${kind}-Test" ${arch}<br>
+         OBJECTS ${MSAN_TEST_OBJECTS} ${MSAN_LIBCXX_SO}<br>
+         DEPS ${MSAN_TEST_DEPS}<br>
+         LINK_FLAGS ${MSAN_UNITTEST_LINK_FLAGS}<br>
+                     ${TARGET_LINK_FLAGS}<br>
+                     "-Wl,-rpath=${CMAKE_CURRENT_BINARY_DIR}"<br>
+                     "-Wl,-rpath=${LIBCXX_PREFIX}/lib")<br>
 endmacro()<br>
<br>
 # We should only build MSan unit tests if we can build instrumented libcxx.<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>