]> git.proxmox.com Git - rustc.git/blobdiff - src/compiler-rt/lib/msan/tests/CMakeLists.txt
Imported Upstream version 1.6.0+dfsg1
[rustc.git] / src / compiler-rt / lib / msan / tests / CMakeLists.txt
index cc58d2e1e2e3803b9a6f81f63f516f87dab7121e..087b1afbd5b3c2caee70330c5da7ccb393d95a09 100644 (file)
@@ -5,46 +5,26 @@ include(CompilerRTLink)
 include_directories(..)
 include_directories(../..)
 
-# Instrumented libcxx sources and build flags.
-file(GLOB MSAN_LIBCXX_SOURCES ${COMPILER_RT_LIBCXX_PATH}/src/*.cpp)
 set(MSAN_LIBCXX_CFLAGS
-  -I${COMPILER_RT_LIBCXX_PATH}/include
   -fsanitize=memory
   -fsanitize-memory-track-origins
-  -fPIC
-  -Wno-\#warnings
-  -Wno-pedantic
-  -g
-  -O2
-  -fstrict-aliasing
-  -fno-exceptions
-  -nostdinc++
-  -fno-omit-frame-pointer
-  -mno-omit-leaf-frame-pointer)
-set(MSAN_LIBCXX_LINK_FLAGS
-  -nodefaultlibs
-  -lrt
-  -lc
-  -lstdc++
-  -fsanitize=memory)
-append_if(COMPILER_RT_HAS_LIBPTHREAD -lpthread MSAN_LIBCXX_LINK_FLAGS)
+  -Wno-pedantic)
 
 # Unittest sources and build flags.
 set(MSAN_UNITTEST_SOURCES msan_test.cc msan_test_main.cc)
 set(MSAN_LOADABLE_SOURCE msan_loadable.cc)
 set(MSAN_UNITTEST_HEADERS
   msan_test_config.h
-  msandr_test_so.h
   ../../../include/sanitizer/msan_interface.h
 )
-set(MSANDR_UNITTEST_SOURCE msandr_test_so.cc)
 set(MSAN_UNITTEST_COMMON_CFLAGS
-  -I${COMPILER_RT_LIBCXX_PATH}/include
+  -nostdinc++
+  -isystem ${COMPILER_RT_LIBCXX_PATH}/include
+  ${COMPILER_RT_TEST_CFLAGS}
   ${COMPILER_RT_GTEST_CFLAGS}
   -I${COMPILER_RT_SOURCE_DIR}/include
   -I${COMPILER_RT_SOURCE_DIR}/lib
   -I${COMPILER_RT_SOURCE_DIR}/lib/msan
-  -stdlib=libc++
   -g
   -O2
   -fno-exceptions
@@ -53,6 +33,7 @@ set(MSAN_UNITTEST_COMMON_CFLAGS
   -Wno-deprecated-declarations
   -Wno-unused-variable
   -Wno-zero-length-array
+  -Wno-uninitialized
   -Werror=sign-compare
 )
 set(MSAN_UNITTEST_INSTRUMENTED_CFLAGS
@@ -63,15 +44,13 @@ set(MSAN_UNITTEST_INSTRUMENTED_CFLAGS
 )
 set(MSAN_UNITTEST_LINK_FLAGS
   -fsanitize=memory
+  # Don't need -stdlib=libc++ because we explicitly list libc++.so in the linker
+  # inputs.
   # FIXME: we build libcxx without cxxabi and need libstdc++ to provide it.
   -lstdc++
 )
 
-append_if(COMPILER_RT_HAS_LIBDL -ldl MSAN_UNITTEST_LINK_FLAGS)
-set(MSAN_LOADABLE_LINK_FLAGS
-  -fsanitize=memory
-  -shared
-)
+append_list_if(COMPILER_RT_HAS_LIBDL -ldl MSAN_UNITTEST_LINK_FLAGS)
 
 # Compile source for the given architecture, using compiler
 # options in ${ARGN}, and add it to the object list.
@@ -90,7 +69,7 @@ macro(msan_compile obj_list source arch kind)
 endmacro()
 
 macro(msan_link_shared so_list so_name arch kind)
-  parse_arguments(SOURCE "OBJECTS;LINKFLAGS;DEPS" "" ${ARGN})
+  cmake_parse_arguments(SOURCE "" "" "OBJECTS;LINKFLAGS;DEPS" ${ARGN})
   set(output_so "${CMAKE_CURRENT_BINARY_DIR}/${so_name}.${arch}${kind}.so")
   get_target_flags_for_arch(${arch} TARGET_LINKFLAGS)
   if(NOT COMPILER_RT_STANDALONE_BUILD)
@@ -103,22 +82,6 @@ macro(msan_link_shared so_list so_name arch kind)
   list(APPEND ${so_list} ${output_so})
 endmacro()
 
-# Link MSan unit test for a given architecture from a set
-# of objects in ${ARGN}.
-macro(add_msan_test test_suite test_name arch)
-  get_target_flags_for_arch(${arch} TARGET_LINK_FLAGS)
-  set(TEST_DEPS ${ARGN} ${MSAN_LOADABLE_SO})
-  if(NOT COMPILER_RT_STANDALONE_BUILD)
-    list(APPEND TEST_DEPS msan)
-  endif()
-  add_compiler_rt_test(${test_suite} ${test_name}
-                       OBJECTS ${ARGN}
-                       DEPS ${TEST_DEPS}
-                       LINK_FLAGS ${MSAN_UNITTEST_LINK_FLAGS}
-                                  ${TARGET_LINK_FLAGS}
-                                  "-Wl,-rpath=${CMAKE_CURRENT_BINARY_DIR}")
-endmacro()
-
 # Main MemorySanitizer unit tests.
 add_custom_target(MsanUnitTests)
 set_target_properties(MsanUnitTests PROPERTIES FOLDER "MSan unit tests")
@@ -130,19 +93,6 @@ macro(add_msan_tests_for_arch arch kind)
   msan_compile(MSAN_INST_GTEST ${COMPILER_RT_GTEST_SOURCE} ${arch} "${kind}"
                                ${MSAN_UNITTEST_INSTRUMENTED_CFLAGS} ${ARGN})
 
-  # Build libcxx instrumented with MSan.
-  set(MSAN_INST_LIBCXX_OBJECTS)
-  foreach(SOURCE ${MSAN_LIBCXX_SOURCES})
-    msan_compile(MSAN_INST_LIBCXX_OBJECTS ${SOURCE} ${arch} "${kind}"
-                 ${MSAN_LIBCXX_CFLAGS} ${ARGN})
-  endforeach(SOURCE)
-
-  set(MSAN_INST_LIBCXX)
-  msan_link_shared(MSAN_INST_LIBCXX "libcxx" ${arch} "${kind}"
-                   OBJECTS ${MSAN_INST_LIBCXX_OBJECTS}
-                   LINKFLAGS ${MSAN_LIBCXX_LINK_FLAGS}
-                   DEPS ${MSAN_INST_LIBCXX_OBJECTS})
-
   # Instrumented tests.
   set(MSAN_INST_TEST_OBJECTS)
   foreach (SOURCE ${MSAN_UNITTEST_SOURCES})
@@ -153,12 +103,7 @@ macro(add_msan_tests_for_arch arch kind)
   # Instrumented loadable module objects.
   set(MSAN_INST_LOADABLE_OBJECTS)
   msan_compile(MSAN_INST_LOADABLE_OBJECTS ${MSAN_LOADABLE_SOURCE} ${arch} "${kind}"
-               ${MSAN_UNITTEST_INSTRUMENTED_CFLAGS} ${ARGN})
-
-  # Uninstrumented shared object for MSanDR tests.
-  set(MSANDR_TEST_OBJECTS)
-  msan_compile(MSANDR_TEST_OBJECTS ${MSANDR_UNITTEST_SOURCE} ${arch} "${kind}"
-               ${MSAN_UNITTEST_COMMON_CFLAGS})
+               ${MSAN_UNITTEST_INSTRUMENTED_CFLAGS} "-fPIC" ${ARGN})
 
   # Instrumented loadable library tests.
   set(MSAN_LOADABLE_SO)
@@ -166,23 +111,34 @@ macro(add_msan_tests_for_arch arch kind)
                    OBJECTS ${MSAN_INST_LOADABLE_OBJECTS}
                    DEPS ${MSAN_INST_LOADABLE_OBJECTS})
 
-  # Uninstrumented shared library tests.
-  set(MSANDR_TEST_SO)
-  msan_link_shared(MSANDR_TEST_SO "libmsandr_test" ${arch} "${kind}"
-                   OBJECTS ${MSANDR_TEST_OBJECTS}
-                   DEPS ${MSANDR_TEST_OBJECTS})
-
-  # Link everything together.
-  add_msan_test(MsanUnitTests "Msan-${arch}${kind}-Test" ${arch}
-                ${MSAN_INST_TEST_OBJECTS} ${MSAN_INST_GTEST}
-                ${MSAN_INST_LIBCXX} ${MSANDR_TEST_SO})
+  set(MSAN_TEST_OBJECTS ${MSAN_INST_TEST_OBJECTS} ${MSAN_INST_GTEST})
+  set(MSAN_TEST_DEPS ${MSAN_TEST_OBJECTS} libcxx_msan_${arch}
+                     ${MSAN_LOADABLE_SO})
+  if(NOT COMPILER_RT_STANDALONE_BUILD)
+    list(APPEND MSAN_TEST_DEPS msan)
+  endif()
+  get_target_flags_for_arch(${arch} TARGET_LINK_FLAGS)
+  add_compiler_rt_test(MsanUnitTests "Msan-${arch}${kind}-Test" ${arch}
+    OBJECTS ${MSAN_TEST_OBJECTS} ${MSAN_LIBCXX_SO}
+    DEPS ${MSAN_TEST_DEPS}
+    LINK_FLAGS ${MSAN_UNITTEST_LINK_FLAGS}
+               ${TARGET_LINK_FLAGS}
+               "-Wl,-rpath=${CMAKE_CURRENT_BINARY_DIR}"
+               "-Wl,-rpath=${LIBCXX_PREFIX}/lib")
 endmacro()
 
 # We should only build MSan unit tests if we can build instrumented libcxx.
 if(COMPILER_RT_CAN_EXECUTE_TESTS AND COMPILER_RT_HAS_LIBCXX_SOURCES)
-  if(CAN_TARGET_x86_64)
-    add_msan_tests_for_arch(x86_64 "")
-    add_msan_tests_for_arch(x86_64 "-with-call"
+  foreach(arch ${MSAN_SUPPORTED_ARCH})
+    get_target_flags_for_arch(${arch} TARGET_CFLAGS)
+    set(LIBCXX_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/../libcxx_msan_${arch})
+    add_custom_libcxx(libcxx_msan_${arch} ${LIBCXX_PREFIX}
+      DEPS ${MSAN_RUNTIME_LIBRARIES}
+      CFLAGS ${MSAN_LIBCXX_CFLAGS} ${TARGET_CFLAGS})
+    set(MSAN_LIBCXX_SO ${LIBCXX_PREFIX}/lib/libc++.so)
+
+    add_msan_tests_for_arch(${arch} "")
+    add_msan_tests_for_arch(${arch} "-with-call"
                             -mllvm -msan-instrumentation-with-call-threshold=0)
-  endif()
+  endforeach()
 endif()