Index: cmake/Modules/AddCompilerRT.cmake =================================================================== --- cmake/Modules/AddCompilerRT.cmake +++ cmake/Modules/AddCompilerRT.cmake @@ -491,6 +491,7 @@ -DCMAKE_INSTALL_PREFIX:PATH= -DLLVM_PATH=${LLVM_MAIN_SRC_DIR} -DLIBCXX_STANDALONE_BUILD=On + -DLIBCXX_CXX_ABI=none LOG_BUILD 1 LOG_CONFIGURE 1 LOG_INSTALL 1 Index: lib/fuzzer/CMakeLists.txt =================================================================== --- lib/fuzzer/CMakeLists.txt +++ lib/fuzzer/CMakeLists.txt @@ -32,6 +32,10 @@ set(LIBFUZZER_CFLAGS ${SANITIZER_COMMON_CFLAGS}) +if(COMPILER_RT_HAS_LIBCXX_SOURCES) + list(APPEND LIBFUZZER_CFLAGS -nostdinc++ -D_LIBCPP_NAMESPACE=__Fuzzer) +endif() + append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fno-omit-frame-pointer LIBFUZZER_CFLAGS) if (CMAKE_CXX_FLAGS MATCHES "fsanitize-coverage") @@ -74,6 +78,40 @@ CFLAGS ${LIBFUZZER_CFLAGS} PARENT_TARGET fuzzer) +if(COMPILER_RT_HAS_LIBCXX_SOURCES) + foreach(arch ${FUZZER_SUPPORTED_ARCH}) + get_target_flags_for_arch(${arch} TARGET_CFLAGS) + set(LIBCXX_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libcxx_fuzzer_${arch}) + add_custom_libcxx(libcxx_fuzzer_${arch} ${LIBCXX_PREFIX} + CFLAGS ${TARGET_CFLAGS} -D_LIBCPP_NAMESPACE=__Fuzzer) + add_dependencies(RTfuzzer.${arch} libcxx_fuzzer_${arch}) + add_dependencies(RTfuzzer_main.${arch} libcxx_fuzzer_${arch}) + target_compile_options(RTfuzzer.${arch} PRIVATE + -isystem ${CMAKE_CURRENT_BINARY_DIR}/libcxx_fuzzer_${arch}/include/c++/v1 + ) + target_compile_options(RTfuzzer_main.${arch} PRIVATE + -isystem ${CMAKE_CURRENT_BINARY_DIR}/libcxx_fuzzer_${arch}/include/c++/v1 + ) + set(cxx_${arch}_merge_dir "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/cxx_${arch}_merge.dir") + file(MAKE_DIRECTORY ${cxx_${arch}_merge_dir}) + add_custom_command(TARGET clang_rt.fuzzer-${arch} POST_BUILD + COMMAND + ${CMAKE_AR} + ARGS + x ${CMAKE_CURRENT_BINARY_DIR}/libcxx_fuzzer_${arch}/lib/libc++.a + COMMAND + ${CMAKE_AR} + ARGS + x "$" + COMMAND + ${CMAKE_AR} + ARGS + qcs "$" *.o* + WORKING_DIRECTORY ${cxx_${arch}_merge_dir} + ) + endforeach() +endif() + if(COMPILER_RT_INCLUDE_TESTS) add_subdirectory(tests) endif() Index: lib/fuzzer/tests/CMakeLists.txt =================================================================== --- lib/fuzzer/tests/CMakeLists.txt +++ lib/fuzzer/tests/CMakeLists.txt @@ -18,6 +18,10 @@ list(APPEND LIBFUZZER_UNITTEST_LINK_FLAGS -lstdc++ -lpthread) endif() +if(COMPILER_RT_HAS_LIBCXX_SOURCES) + list(APPEND LIBFUZZER_UNITTEST_CFLAGS -nostdinc++ -D_LIBCPP_NAMESPACE=__Fuzzer) +endif() + foreach(arch ${FUZZER_SUPPORTED_ARCH}) set(LIBFUZZER_TEST_RUNTIME RTFuzzerTest.${arch}) if(APPLE) @@ -33,14 +37,22 @@ ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} FOLDER "Compiler-RT Runtime tests") + if(COMPILER_RT_HAS_LIBCXX_SOURCES) + set(LIBFUZZER_TEST_RUNTIME_DEPS libcxx_fuzzer_${arch}) + set(LIBFUZZER_TEST_RUNTIME_CFLAGS + -isystem ${CMAKE_CURRENT_BINARY_DIR}/../libcxx_fuzzer_${arch}/include/c++/v1) + set(LIBFUZZER_TEST_RUNTIME_LINK_FLAGS + ${CMAKE_CURRENT_BINARY_DIR}/../libcxx_fuzzer_${arch}/lib/libc++.a) + endif() + set(FuzzerTestObjects) generate_compiler_rt_tests(FuzzerTestObjects FuzzerUnitTests "Fuzzer-${arch}-Test" ${arch} SOURCES FuzzerUnittest.cpp ${COMPILER_RT_GTEST_SOURCE} RUNTIME ${LIBFUZZER_TEST_RUNTIME} - DEPS gtest - CFLAGS ${LIBFUZZER_UNITTEST_CFLAGS} - LINK_FLAGS ${LIBFUZZER_UNITTEST_LINK_FLAGS}) + DEPS gtest ${LIBFUZZER_TEST_RUNTIME_DEPS} + CFLAGS ${LIBFUZZER_UNITTEST_CFLAGS} ${LIBFUZZER_TEST_RUNTIME_CFLAGS} + LINK_FLAGS ${LIBFUZZER_UNITTEST_LINK_FLAGS} ${LIBFUZZER_TEST_RUNTIME_LINK_FLAGS}) set_target_properties(FuzzerUnitTests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) endforeach() Index: test/CMakeLists.txt =================================================================== --- test/CMakeLists.txt +++ test/CMakeLists.txt @@ -8,6 +8,8 @@ # BlocksRuntime (and most of builtins) testsuites are not yet ported to lit. # add_subdirectory(BlocksRuntime) +pythonize_bool(COMPILER_RT_HAS_STDLIB_LIBCXX) + set(SANITIZER_COMMON_LIT_TEST_DEPS) if(COMPILER_RT_BUILD_PROFILE AND COMPILER_RT_HAS_PROFILE) Index: test/fuzzer/CMakeLists.txt =================================================================== --- test/fuzzer/CMakeLists.txt +++ test/fuzzer/CMakeLists.txt @@ -19,20 +19,24 @@ list(APPEND LIBFUZZER_TESTSUITES ${CMAKE_CURRENT_BINARY_DIR}/unit) endif() -foreach(arch ${FUZZER_SUPPORTED_ARCH}) - set(LIBFUZZER_TEST_COMPILER ${COMPILER_RT_TEST_COMPILER}) - get_test_cc_for_arch(${arch} LIBFUZZER_TEST_COMPILER LIBFUZZER_TEST_FLAGS) - - string(TOUPPER ${arch} ARCH_UPPER_CASE) - set(CONFIG_NAME ${ARCH_UPPER_CASE}${OS_NAME}Config) - - # LIT-based libFuzzer tests. - configure_lit_site_cfg( - ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in - ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/lit.site.cfg - ) - list(APPEND LIBFUZZER_TESTSUITES ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}) - +foreach(stdlib IN ITEMS stdlibc++) + foreach(arch ${FUZZER_SUPPORTED_ARCH}) + set(LIBFUZZER_TEST_COMPILER ${COMPILER_RT_TEST_COMPILER}) + get_test_cc_for_arch(${arch} LIBFUZZER_TEST_COMPILER LIBFUZZER_TEST_FLAGS) + + set(LIBFUZZER_TEST_STDLIB ${stdlib}) + string(TOUPPER ${stdlib} STDLIB_UPPER_CASE) + + string(TOUPPER ${arch} ARCH_UPPER_CASE) + set(CONFIG_NAME ${ARCH_UPPER_CASE}${STDLIB_UPPER_CASE}${OS_NAME}Config) + + # LIT-based libFuzzer tests. + configure_lit_site_cfg( + ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in + ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/lit.site.cfg + ) + list(APPEND LIBFUZZER_TESTSUITES ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}) + endforeach() endforeach() set(EXCLUDE_FROM_ALL ON) Index: test/fuzzer/lit.site.cfg.in =================================================================== --- test/fuzzer/lit.site.cfg.in +++ test/fuzzer/lit.site.cfg.in @@ -5,6 +5,7 @@ config.cpp_compiler = "@LIBFUZZER_TEST_COMPILER@" config.target_flags = "@LIBFUZZER_TEST_FLAGS@" config.c_compiler = "@LIBFUZZER_TEST_COMPILER@" +config.stdlib = "@LIBFUZZER_TEST_STDLIB@" config.osx_sysroot_flag = "@OSX_SYSROOT_FLAG@" config.cmake_binary_dir = "@CMAKE_BINARY_DIR@"