Home | History | Annotate | Download | only in tests
      1 include(CheckCXXCompilerFlag)
      2 include(CompilerRTCompile)
      3 include(CompilerRTLink)
      4 
      5 include_directories(..)
      6 include_directories(../..)
      7 
      8 # Instrumented libcxx sources and build flags.
      9 file(GLOB MSAN_LIBCXX_SOURCES ${MSAN_LIBCXX_PATH}/src/*.cpp)
     10 set(MSAN_LIBCXX_CFLAGS
     11   -I${MSAN_LIBCXX_PATH}/include
     12   -fsanitize=memory
     13   -fsanitize-memory-track-origins
     14   -fPIC
     15   -Wno-\#warnings
     16   -g
     17   -O2
     18   -std=c++0x
     19   -fstrict-aliasing
     20   -fno-exceptions
     21   -nostdinc++
     22   -fno-omit-frame-pointer
     23   -mno-omit-leaf-frame-pointer)
     24 set(MSAN_LIBCXX_LINK_FLAGS
     25   -nodefaultlibs
     26   -lpthread
     27   -lrt
     28   -lc
     29   -lstdc++
     30   -fsanitize=memory)
     31 
     32 # Unittest sources and build flags.
     33 set(MSAN_UNITTEST_SOURCES msan_test.cc msan_test_main.cc)
     34 set(MSAN_LOADABLE_SOURCE msan_loadable.cc)
     35 set(MSAN_UNITTEST_HEADERS
     36   msan_test_config.h
     37   msandr_test_so.h
     38   ../../../include/sanitizer/msan_interface.h
     39 )
     40 set(MSANDR_UNITTEST_SOURCE msandr_test_so.cc)
     41 set(MSAN_UNITTEST_COMMON_CFLAGS
     42   -I${MSAN_LIBCXX_PATH}/include
     43   ${COMPILER_RT_GTEST_INCLUDE_CFLAGS}
     44   -I${COMPILER_RT_SOURCE_DIR}/include
     45   -I${COMPILER_RT_SOURCE_DIR}/lib
     46   -I${COMPILER_RT_SOURCE_DIR}/lib/msan
     47   -std=c++0x
     48   -stdlib=libc++
     49   -g
     50   -O2
     51   -fno-exceptions
     52   -fno-omit-frame-pointer
     53   -mno-omit-leaf-frame-pointer
     54 )
     55 set(MSAN_UNITTEST_INSTRUMENTED_CFLAGS
     56   ${MSAN_UNITTEST_COMMON_CFLAGS}
     57   -fsanitize=memory
     58   -fsanitize-memory-track-origins
     59   -mllvm -msan-keep-going=1
     60 )
     61 set(MSAN_UNITTEST_LINK_FLAGS
     62   -fsanitize=memory
     63   -ldl
     64   # FIXME: we build libcxx without cxxabi and need libstdc++ to provide it.
     65   -lstdc++
     66 )
     67 set(MSAN_LOADABLE_LINK_FLAGS
     68   -fsanitize=memory
     69   -shared
     70 )
     71 
     72 # Compile source for the given architecture, using compiler
     73 # options in ${ARGN}, and add it to the object list.
     74 macro(msan_compile obj_list source arch)
     75   get_filename_component(basename ${source} NAME)
     76   set(output_obj "${basename}.${arch}.o")
     77   get_target_flags_for_arch(${arch} TARGET_CFLAGS)
     78   clang_compile(${output_obj} ${source}
     79                 CFLAGS ${ARGN} ${TARGET_CFLAGS}
     80                 DEPS gtest ${MSAN_RUNTIME_LIBRARIES} ${MSAN_UNITTEST_HEADERS})
     81   list(APPEND ${obj_list} ${output_obj})
     82 endmacro()
     83 
     84 macro(msan_link_shared so_list so_name arch)
     85   parse_arguments(SOURCE "OBJECTS;LINKFLAGS;DEPS" "" ${ARGN})
     86   set(output_so "${CMAKE_CURRENT_BINARY_DIR}/${so_name}.${arch}.so")
     87   get_target_flags_for_arch(${arch} TARGET_LINKFLAGS)
     88   clang_link_shared(${output_so}
     89                 OBJECTS ${SOURCE_OBJECTS}
     90                 LINKFLAGS ${TARGET_LINKFLAGS} ${SOURCE_LINKFLAGS}
     91                 DEPS ${SOURCE_DEPS})
     92   list(APPEND ${so_list} ${output_so})
     93 endmacro()
     94 
     95 # Link MSan unit test for a given architecture from a set
     96 # of objects in ${ARGN}.
     97 macro(add_msan_test test_suite test_name arch)
     98   get_target_flags_for_arch(${arch} TARGET_LINK_FLAGS)
     99   add_compiler_rt_test(${test_suite} ${test_name}
    100                        OBJECTS ${ARGN}
    101                        DEPS ${MSAN_RUNTIME_LIBRARIES} ${ARGN}
    102                             ${MSAN_LOADABLE_SO}
    103                        LINK_FLAGS ${MSAN_UNITTEST_LINK_FLAGS}
    104                                   ${TARGET_LINK_FLAGS}
    105                                   "-Wl,-rpath=${CMAKE_CURRENT_BINARY_DIR}")
    106 endmacro()
    107 
    108 # Main MemorySanitizer unit tests.
    109 add_custom_target(MsanUnitTests)
    110 set_target_properties(MsanUnitTests PROPERTIES FOLDER "MSan unit tests")
    111 
    112 # Adds MSan unit tests and benchmarks for architecture.
    113 macro(add_msan_tests_for_arch arch)
    114   # Build gtest instrumented with MSan.
    115   set(MSAN_INST_GTEST)
    116   msan_compile(MSAN_INST_GTEST ${COMPILER_RT_GTEST_SOURCE} ${arch} 
    117                                ${MSAN_UNITTEST_INSTRUMENTED_CFLAGS})
    118 
    119   # Build libcxx instrumented with MSan.
    120   set(MSAN_INST_LIBCXX_OBJECTS)
    121   foreach(SOURCE ${MSAN_LIBCXX_SOURCES})
    122     msan_compile(MSAN_INST_LIBCXX_OBJECTS ${SOURCE} ${arch} 
    123                  ${MSAN_LIBCXX_CFLAGS})
    124   endforeach(SOURCE)
    125 
    126   set(MSAN_INST_LIBCXX)
    127   msan_link_shared(MSAN_INST_LIBCXX "libcxx" ${arch}
    128                    OBJECTS ${MSAN_INST_LIBCXX_OBJECTS}
    129                    LINKFLAGS ${MSAN_LIBCXX_LINK_FLAGS}
    130                    DEPS ${MSAN_INST_LIBCXX_OBJECTS} ${MSAN_RUNTIME_LIBRARIES})
    131 
    132   # Instrumented tests.
    133   set(MSAN_INST_TEST_OBJECTS)
    134   foreach (SOURCE ${MSAN_UNITTEST_SOURCES})
    135     msan_compile(MSAN_INST_TEST_OBJECTS ${SOURCE} ${arch}
    136                  ${MSAN_UNITTEST_INSTRUMENTED_CFLAGS})
    137   endforeach(SOURCE)
    138 
    139   # Instrumented loadable module objects.
    140   set(MSAN_INST_LOADABLE_OBJECTS)
    141   msan_compile(MSAN_INST_LOADABLE_OBJECTS ${MSAN_LOADABLE_SOURCE} ${arch}
    142                ${MSAN_UNITTEST_INSTRUMENTED_CFLAGS})
    143 
    144   # Uninstrumented shared object for MSanDR tests.
    145   set(MSANDR_TEST_OBJECTS)
    146   msan_compile(MSANDR_TEST_OBJECTS ${MSANDR_UNITTEST_SOURCE} ${arch}
    147                ${MSAN_UNITTEST_COMMON_CFLAGS})
    148 
    149   # Instrumented loadable library tests.
    150   set(MSAN_LOADABLE_SO)
    151   msan_link_shared(MSAN_LOADABLE_SO "libmsan_loadable" ${arch}
    152                    OBJECTS ${MSAN_INST_LOADABLE_OBJECTS}
    153                    DEPS ${MSAN_INST_LOADABLE_OBJECTS} ${MSAN_RUNTIME_LIBRARIES})
    154 
    155   # Uninstrumented shared library tests.
    156   set(MSANDR_TEST_SO)
    157   msan_link_shared(MSANDR_TEST_SO "libmsandr_test" ${arch}
    158                    OBJECTS ${MSANDR_TEST_OBJECTS}
    159                    DEPS ${MSANDR_TEST_OBJECTS} ${MSAN_RUNTIME_LIBRARIES})
    160 
    161   # Link everything together.
    162   add_msan_test(MsanUnitTests "Msan-${arch}-Test" ${arch}
    163                 ${MSAN_INST_TEST_OBJECTS} ${MSAN_INST_GTEST}
    164                 ${MSAN_INST_LIBCXX} ${MSANDR_TEST_SO})
    165 endmacro()
    166 
    167 if(COMPILER_RT_CAN_EXECUTE_TESTS AND MSAN_CAN_INSTRUMENT_LIBCXX)
    168   if(CAN_TARGET_x86_64)
    169     add_msan_tests_for_arch(x86_64)
    170   endif()
    171 endif()
    172