diff --git a/compiler-rt/lib/lsan/CMakeLists.txt b/compiler-rt/lib/lsan/CMakeLists.txt index beb9c8aa4f9c..378f08199218 100644 --- a/compiler-rt/lib/lsan/CMakeLists.txt +++ b/compiler-rt/lib/lsan/CMakeLists.txt @@ -45,4 +45,7 @@ if (NOT APPLE AND NOT ANDROID) endforeach() endif() -add_subdirectory(tests) +if (LLVM_INCLUDE_TESTS) + add_subdirectory(tests) +endif() +add_subdirectory(lit_tests) diff --git a/compiler-rt/lib/lsan/lit_tests/CMakeLists.txt b/compiler-rt/lib/lsan/lit_tests/CMakeLists.txt new file mode 100644 index 000000000000..e1be508202b8 --- /dev/null +++ b/compiler-rt/lib/lsan/lit_tests/CMakeLists.txt @@ -0,0 +1,28 @@ +set(LSAN_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/..) +set(LSAN_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/..) + +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 + ) + +if(COMPILER_RT_CAN_EXECUTE_TESTS) + set(LSAN_TEST_DEPS + ${SANITIZER_COMMON_LIT_TEST_DEPS} + ${LSAN_RUNTIME_LIBRARIES}) + set(LSAN_TEST_PARAMS + lsan_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg) + if(LLVM_INCLUDE_TESTS) + list(APPEND LSAN_TEST_DEPS LsanTests) + endif() + add_lit_testsuite(check-lsan "Running the LeakSanitizer tests" + ${CMAKE_CURRENT_BINARY_DIR} + PARAMS ${LSAN_TEST_PARAMS} + DEPENDS ${LSAN_TEST_DEPS}) + set_target_properties(check-lsan PROPERTIES FOLDER "LSan tests") +endif() diff --git a/compiler-rt/lib/lsan/tests/lit.cfg b/compiler-rt/lib/lsan/lit_tests/Unit/lit.cfg similarity index 72% rename from compiler-rt/lib/lsan/tests/lit.cfg rename to compiler-rt/lib/lsan/lit_tests/Unit/lit.cfg index 2551d7aa965f..1b1fb10278c6 100644 --- a/compiler-rt/lib/lsan/tests/lit.cfg +++ b/compiler-rt/lib/lsan/lit_tests/Unit/lit.cfg @@ -18,12 +18,10 @@ compiler_rt_lit_unit_cfg = os.path.join(llvm_src_root, "projects", lit.load_config(config, compiler_rt_lit_unit_cfg) # Setup config name. -config.name = 'LeakSanitizer' +config.name = 'LeakSanitizer-Unit' # Setup test source and exec root. For unit tests, we define -# it as build directory with lsan unit tests. -llvm_obj_root = get_required_attr(config, "llvm_obj_root") -config.test_exec_root = os.path.join(llvm_obj_root, "projects", - "compiler-rt", "lib", - "lsan", "tests") +# it as build directory with LSan unit tests. +lsan_binary_dir = get_required_attr(config, "lsan_binary_dir") +config.test_exec_root = os.path.join(lsan_binary_dir, "tests") config.test_source_root = config.test_exec_root diff --git a/compiler-rt/lib/lsan/lit_tests/Unit/lit.site.cfg.in b/compiler-rt/lib/lsan/lit_tests/Unit/lit.site.cfg.in new file mode 100644 index 000000000000..641c734dd4ac --- /dev/null +++ b/compiler-rt/lib/lsan/lit_tests/Unit/lit.site.cfg.in @@ -0,0 +1,16 @@ +## Autogenerated by LLVM/Clang configuration. +# Do not edit! + +config.target_triple = "@TARGET_TRIPLE@" +config.llvm_src_root = "@LLVM_SOURCE_DIR@" +config.llvm_build_mode = "@LLVM_BUILD_MODE@" +config.lsan_binary_dir = "@LSAN_BINARY_DIR@" + +try: + config.llvm_build_mode = config.llvm_build_mode % 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, "@LSAN_SOURCE_DIR@/lit_tests/Unit/lit.cfg") diff --git a/compiler-rt/lib/lsan/lit_tests/lit.cfg b/compiler-rt/lib/lsan/lit_tests/lit.cfg new file mode 100644 index 000000000000..c7438c082db2 --- /dev/null +++ b/compiler-rt/lib/lsan/lit_tests/lit.cfg @@ -0,0 +1,46 @@ +# -*- Python -*- + +import os + +def get_required_attr(config, attr_name): + attr_value = getattr(config, attr_name, None) + if not attr_value: + lit.fatal("No attribute %r in test configuration! You may need to run " + "tests from your build directory or add this attribute " + "to lit.site.cfg " % attr_name) + return attr_value + +# Setup attributes common for all compiler-rt projects. +llvm_src_root = get_required_attr(config, 'llvm_src_root') +compiler_rt_lit_unit_cfg = os.path.join(llvm_src_root, "projects", + "compiler-rt", "lib", + "lit.common.unit.cfg") +lit.load_config(config, compiler_rt_lit_unit_cfg) + +# Setup config name. +config.name = 'LeakSanitizer' + +# Setup source root. +config.test_source_root = os.path.dirname(__file__) + +# 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 default compiler flags used with -fsanitize=leak option. +clang_lsan_cxxflags = ("-ccc-cxx " + + "-fsanitize=leak " + + "-g") +config.substitutions.append( ("%clangxx_lsan ", (" " + config.clang + " " + + clang_lsan_cxxflags + " ")) ) + +# Default test suffixes. +config.suffixes = ['.c', '.cc', '.cpp'] + +# LeakSanitizer tests are currently supported on x86-64 Linux only. +if config.host_os not in ['Linux'] or config.host_arch not in ['x86_64']: + config.unsupported = True diff --git a/compiler-rt/lib/lsan/tests/lit.site.cfg.in b/compiler-rt/lib/lsan/lit_tests/lit.site.cfg.in similarity index 59% rename from compiler-rt/lib/lsan/tests/lit.site.cfg.in rename to compiler-rt/lib/lsan/lit_tests/lit.site.cfg.in index 7839b77b2ccc..869a2535c7f4 100644 --- a/compiler-rt/lib/lsan/tests/lit.site.cfg.in +++ b/compiler-rt/lib/lsan/lit_tests/lit.site.cfg.in @@ -1,12 +1,17 @@ +config.host_os = "@HOST_OS@" +config.host_arch = "@HOST_ARCH@" +config.llvm_build_mode = "@LLVM_BUILD_MODE@" config.llvm_src_root = "@LLVM_SOURCE_DIR@" config.llvm_obj_root = "@LLVM_BINARY_DIR@" -config.llvm_build_mode = "@LLVM_BUILD_MODE@" +config.llvm_tools_dir = "@LLVM_TOOLS_DIR@" +config.clang = "@LLVM_BINARY_DIR@/bin/clang" +config.compiler_rt_arch = "@COMPILER_RT_SUPPORTED_ARCH@" # LLVM tools dir can be passed in lit parameters, so try to # apply substitution. try: - config.llvm_build_mode = config.llvm_build_mode % lit.params -except KeyError, e: + 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)) diff --git a/compiler-rt/lib/lsan/tests/CMakeLists.txt b/compiler-rt/lib/lsan/tests/CMakeLists.txt index 735159ab7c9c..41fa71b7d17c 100644 --- a/compiler-rt/lib/lsan/tests/CMakeLists.txt +++ b/compiler-rt/lib/lsan/tests/CMakeLists.txt @@ -56,22 +56,3 @@ if(UNIX AND NOT APPLE AND CAN_TARGET_x86_64) add_lsan_tests_for_arch(x86_64) endif() -configure_lit_site_cfg( - ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in - ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg) - -if(COMPILER_RT_CAN_EXECUTE_TESTS) - set(LSAN_TEST_DEPS - clang clang-headers - ${LSAN_RUNTIME_LIBRARIES}) - set(LSAN_TEST_PARAMS - lsan_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg) - if(LLVM_INCLUDE_TESTS) - list(APPEND LSAN_TEST_DEPS LsanTests) - endif() - add_lit_testsuite(check-lsan "Running the LeakSanitizer tests" - ${CMAKE_CURRENT_BINARY_DIR} - PARAMS ${LSAN_TEST_PARAMS} - DEPENDS ${LSAN_TEST_DEPS}) - set_target_properties(check-lsan PROPERTIES FOLDER "LSan tests") -endif()