diff options
| -rw-r--r-- | libcxx/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | libcxx/cmake/Modules/CodeCoverage.cmake | 18 | ||||
| -rw-r--r-- | libcxx/cmake/Modules/HandleCompilerRT.cmake | 43 | ||||
| -rw-r--r-- | libcxx/lib/CMakeLists.txt | 11 | 
4 files changed, 65 insertions, 8 deletions
diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt index 45ef0c01fde..9e9360ea9ea 100644 --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -57,6 +57,7 @@ endif()  # Setup CMake Options  #===============================================================================  include(CMakeDependentOption) +include(HandleCompilerRT)  # Basic options ---------------------------------------------------------------  option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." OFF) diff --git a/libcxx/cmake/Modules/CodeCoverage.cmake b/libcxx/cmake/Modules/CodeCoverage.cmake index addd10abdfe..1bd3a786812 100644 --- a/libcxx/cmake/Modules/CodeCoverage.cmake +++ b/libcxx/cmake/Modules/CodeCoverage.cmake @@ -3,6 +3,11 @@ if (NOT CODE_COVERAGE_LCOV)    message(FATAL_ERROR "Cannot find lcov...")  endif() +find_program(CODE_COVERAGE_LLVM_COV llvm-cov) +if (NOT CODE_COVERAGE_LLVM_COV) +  message(FATAL_ERROR "Cannot find llvm-cov...") +endif() +  find_program(CODE_COVERAGE_GENHTML genhtml)  if (NOT CODE_COVERAGE_GENHTML)    message(FATAL_ERROR "Cannot find genhtml...") @@ -11,6 +16,14 @@ endif()  set(CMAKE_CXX_FLAGS_COVERAGE "-g -O0 --coverage")  function(setup_lcov_test_target_coverage target_name output_dir capture_dirs source_dirs) +  if (NOT DEFINED LIBCXX_BINARY_DIR) +    message(FATAL_ERROR "Variable must be set") +  endif() + +  set(GCOV_TOOL "${LIBCXX_BINARY_DIR}/llvm-cov-wrapper") +  file(GENERATE OUTPUT ${GCOV_TOOL} +    CONTENT "#!/usr/bin/env bash\n${CODE_COVERAGE_LLVM_COV} gcov \"$@\"\n") +    file(MAKE_DIRECTORY ${output_dir})    set(CAPTURE_DIRS "") @@ -27,8 +40,9 @@ function(setup_lcov_test_target_coverage target_name output_dir capture_dirs sou    message(STATUS "Extract Directories: ${EXTRACT_DIRS}")    add_custom_target(generate-lib${target_name}-coverage -        COMMAND ${CODE_COVERAGE_LCOV} --capture ${CAPTURE_DIRS} -o test_coverage.info -        COMMAND ${CODE_COVERAGE_LCOV} --extract test_coverage.info ${EXTRACT_DIRS} -o test_coverage.info +        COMMAND chmod +x ${GCOV_TOOL} +        COMMAND ${CODE_COVERAGE_LCOV} --gcov-tool ${GCOV_TOOL} --capture ${CAPTURE_DIRS} -o test_coverage.info +        COMMAND ${CODE_COVERAGE_LCOV} --gcov-tool ${GCOV_TOOL} --extract test_coverage.info ${EXTRACT_DIRS} -o test_coverage.info          COMMAND ${CODE_COVERAGE_GENHTML} --demangle-cpp test_coverage.info -o test_coverage          COMMAND ${CMAKE_COMMAND} -E remove test_coverage.info          WORKING_DIRECTORY ${output_dir} diff --git a/libcxx/cmake/Modules/HandleCompilerRT.cmake b/libcxx/cmake/Modules/HandleCompilerRT.cmake new file mode 100644 index 00000000000..d7c4247dff7 --- /dev/null +++ b/libcxx/cmake/Modules/HandleCompilerRT.cmake @@ -0,0 +1,43 @@ +function(find_compiler_rt_library name dest) +  if (NOT DEFINED LIBCXX_COMPILE_FLAGS) +    message(FATAL_ERROR "LIBCXX_COMPILE_FLAGS must be defined when using this function") +  endif() +  set(dest "" PARENT_SCOPE) +  set(CLANG_COMMAND ${CMAKE_CXX_COMPILER} ${LIBCXX_COMPILE_FLAGS} +      "--rtlib=compiler-rt" "--print-libgcc-file-name") +  execute_process( +      COMMAND ${CLANG_COMMAND} +      RESULT_VARIABLE HAD_ERROR +      OUTPUT_VARIABLE LIBRARY_FILE +  ) +  string(STRIP "${LIBRARY_FILE}" LIBRARY_FILE) +  string(REPLACE "builtins" "${name}" LIBRARY_FILE "${LIBRARY_FILE}") +  if (NOT HAD_ERROR AND EXISTS "${LIBRARY_FILE}") +    message(STATUS "Found compiler-rt library: ${LIBRARY_FILE}") +    set(${dest} "${LIBRARY_FILE}" PARENT_SCOPE) +  else() +    message(STATUS "Failed to find compiler-rt library") +  endif() +endfunction() + +function(find_compiler_rt_dir dest) +  if (NOT DEFINED LIBCXX_COMPILE_FLAGS) +    message(FATAL_ERROR "LIBCXX_COMPILE_FLAGS must be defined when using this function") +  endif() +  set(dest "" PARENT_SCOPE) +  set(CLANG_COMMAND ${CMAKE_CXX_COMPILER} ${LIBCXX_COMPILE_FLAGS} +      "--rtlib=compiler-rt" "--print-libgcc-file-name") +  execute_process( +      COMMAND ${CLANG_COMMAND} +      RESULT_VARIABLE HAD_ERROR +      OUTPUT_VARIABLE LIBRARY_FILE +  ) +  string(STRIP "${LIBRARY_FILE}" LIBRARY_FILE) +  get_filename_component(LIBRARY_DIR "${LIBRARY_FILE}" DIRECTORY) +  if (NOT HAD_ERROR AND EXISTS "${LIBRARY_DIR}") +    message(STATUS "Found compiler-rt directory: ${LIBRARY_DIR}") +    set(${dest} "${LIBRARY_DIR}" PARENT_SCOPE) +  else() +    message(STATUS "Failed to find compiler-rt directory") +  endif() +endfunction() diff --git a/libcxx/lib/CMakeLists.txt b/libcxx/lib/CMakeLists.txt index c6a94e3b814..66bb14c89a1 100644 --- a/libcxx/lib/CMakeLists.txt +++ b/libcxx/lib/CMakeLists.txt @@ -32,6 +32,10 @@ endif()  add_link_flags_if(LIBCXX_CXX_ABI_LIBRARY_PATH                    "${CMAKE_LIBRARY_PATH_FLAG}${LIBCXX_CXX_ABI_LIBRARY_PATH}") + +if (LIBCXX_GENERATE_COVERAGE AND NOT LIBCXX_COVERAGE_LIBRARY) +  find_compiler_rt_library(profile LIBCXX_COVERAGE_LIBRARY) +endif()  add_library_flags_if(LIBCXX_COVERAGE_LIBRARY "${LIBCXX_COVERAGE_LIBRARY}")  if (APPLE AND (LIBCXX_CXX_ABI_LIBNAME STREQUAL "libcxxabi" OR @@ -62,12 +66,7 @@ if (APPLE AND LLVM_USE_SANITIZER)      message(WARNING "LLVM_USE_SANITIZER=${LLVM_USE_SANITIZER} is not supported on OS X")    endif()    if (LIBFILE) -    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=lib OUTPUT_VARIABLE LIBDIR RESULT_VARIABLE Result) -    if (NOT ${Result} EQUAL "0") -      message(FATAL "Failed to find library resource directory") -    endif() -    string(STRIP "${LIBDIR}" LIBDIR) -    set(LIBDIR "${LIBDIR}/darwin/") +    find_compiler_rt_dir(LIBDIR)      if (NOT IS_DIRECTORY "${LIBDIR}")        message(FATAL_ERROR "Cannot find compiler-rt directory on OS X required for LLVM_USE_SANITIZER")      endif()  | 

