13cab2bb3Spatrickset(LIBFUZZER_SOURCES 23cab2bb3Spatrick FuzzerCrossOver.cpp 33cab2bb3Spatrick FuzzerDataFlowTrace.cpp 43cab2bb3Spatrick FuzzerDriver.cpp 53cab2bb3Spatrick FuzzerExtFunctionsDlsym.cpp 63cab2bb3Spatrick FuzzerExtFunctionsWeak.cpp 73cab2bb3Spatrick FuzzerExtFunctionsWindows.cpp 83cab2bb3Spatrick FuzzerExtraCounters.cpp 9*810390e3Srobert FuzzerExtraCountersDarwin.cpp 10*810390e3Srobert FuzzerExtraCountersWindows.cpp 113cab2bb3Spatrick FuzzerFork.cpp 123cab2bb3Spatrick FuzzerIO.cpp 133cab2bb3Spatrick FuzzerIOPosix.cpp 143cab2bb3Spatrick FuzzerIOWindows.cpp 153cab2bb3Spatrick FuzzerLoop.cpp 163cab2bb3Spatrick FuzzerMerge.cpp 173cab2bb3Spatrick FuzzerMutate.cpp 183cab2bb3Spatrick FuzzerSHA1.cpp 193cab2bb3Spatrick FuzzerTracePC.cpp 203cab2bb3Spatrick FuzzerUtil.cpp 213cab2bb3Spatrick FuzzerUtilDarwin.cpp 223cab2bb3Spatrick FuzzerUtilFuchsia.cpp 233cab2bb3Spatrick FuzzerUtilLinux.cpp 243cab2bb3Spatrick FuzzerUtilPosix.cpp 253cab2bb3Spatrick FuzzerUtilWindows.cpp) 263cab2bb3Spatrick 273cab2bb3Spatrickset(LIBFUZZER_HEADERS 283cab2bb3Spatrick FuzzerBuiltins.h 293cab2bb3Spatrick FuzzerBuiltinsMsvc.h 303cab2bb3Spatrick FuzzerCommand.h 313cab2bb3Spatrick FuzzerCorpus.h 323cab2bb3Spatrick FuzzerDataFlowTrace.h 333cab2bb3Spatrick FuzzerDefs.h 343cab2bb3Spatrick FuzzerDictionary.h 353cab2bb3Spatrick FuzzerExtFunctions.def 363cab2bb3Spatrick FuzzerExtFunctions.h 373cab2bb3Spatrick FuzzerFlags.def 383cab2bb3Spatrick FuzzerFork.h 393cab2bb3Spatrick FuzzerIO.h 403cab2bb3Spatrick FuzzerInterface.h 413cab2bb3Spatrick FuzzerInternal.h 423cab2bb3Spatrick FuzzerMerge.h 433cab2bb3Spatrick FuzzerMutate.h 443cab2bb3Spatrick FuzzerOptions.h 453cab2bb3Spatrick FuzzerRandom.h 463cab2bb3Spatrick FuzzerSHA1.h 473cab2bb3Spatrick FuzzerTracePC.h 483cab2bb3Spatrick FuzzerUtil.h 493cab2bb3Spatrick FuzzerValueBitMap.h) 503cab2bb3Spatrick 51d89ec533Spatrickinclude_directories(../../include) 52d89ec533Spatrick 533cab2bb3SpatrickCHECK_CXX_SOURCE_COMPILES(" 543cab2bb3Spatrick static thread_local int blah; 553cab2bb3Spatrick int main() { 563cab2bb3Spatrick return 0; 573cab2bb3Spatrick } 583cab2bb3Spatrick " HAS_THREAD_LOCAL) 593cab2bb3Spatrick 60d89ec533Spatrickset(LIBFUZZER_CFLAGS ${COMPILER_RT_COMMON_CFLAGS}) 613cab2bb3Spatrick 623cab2bb3Spatrickif(OS_NAME MATCHES "Linux|Fuchsia" AND 633cab2bb3Spatrick COMPILER_RT_LIBCXX_PATH AND 643cab2bb3Spatrick COMPILER_RT_LIBCXXABI_PATH) 65d89ec533Spatrick list(APPEND LIBFUZZER_CFLAGS -D_LIBCPP_ABI_VERSION=Fuzzer) 66d89ec533Spatrick append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ LIBFUZZER_CFLAGS) 673cab2bb3Spatrickelseif(TARGET cxx-headers OR HAVE_LIBCXX) 68d89ec533Spatrick # libFuzzer uses C++ standard library headers. 69*810390e3Srobert list(APPEND LIBFUZZER_CFLAGS ${COMPILER_RT_CXX_CFLAGS}) 703cab2bb3Spatrick set(LIBFUZZER_DEPS cxx-headers) 713cab2bb3Spatrickendif() 723cab2bb3Spatrick 733cab2bb3Spatrickappend_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fno-omit-frame-pointer LIBFUZZER_CFLAGS) 743cab2bb3Spatrick 753cab2bb3Spatrickif (CMAKE_CXX_FLAGS MATCHES "fsanitize-coverage") 76*810390e3Srobert list(APPEND LIBFUZZER_CFLAGS -fsanitize-coverage=0) 773cab2bb3Spatrickendif() 783cab2bb3Spatrick 793cab2bb3Spatrickif(MSVC) 803cab2bb3Spatrick # Silence warnings by turning off exceptions in MSVC headers and avoid an 81*810390e3Srobert # error by unnecessarily defining thread_local when it isn't even used on 823cab2bb3Spatrick # Windows. 833cab2bb3Spatrick list(APPEND LIBFUZZER_CFLAGS -D_HAS_EXCEPTIONS=0) 843cab2bb3Spatrickelse() 853cab2bb3Spatrick if(NOT HAS_THREAD_LOCAL) 863cab2bb3Spatrick list(APPEND LIBFUZZER_CFLAGS -Dthread_local=__thread) 873cab2bb3Spatrick endif() 883cab2bb3Spatrickendif() 893cab2bb3Spatrick 903cab2bb3Spatrickadd_compiler_rt_component(fuzzer) 913cab2bb3Spatrick 923cab2bb3Spatrickadd_compiler_rt_object_libraries(RTfuzzer 933cab2bb3Spatrick OS ${FUZZER_SUPPORTED_OS} 943cab2bb3Spatrick ARCHS ${FUZZER_SUPPORTED_ARCH} 953cab2bb3Spatrick SOURCES ${LIBFUZZER_SOURCES} 963cab2bb3Spatrick ADDITIONAL_HEADERS ${LIBFUZZER_HEADERS} 973cab2bb3Spatrick CFLAGS ${LIBFUZZER_CFLAGS} 983cab2bb3Spatrick DEPS ${LIBFUZZER_DEPS}) 993cab2bb3Spatrick 1003cab2bb3Spatrickadd_compiler_rt_object_libraries(RTfuzzer_main 1013cab2bb3Spatrick OS ${FUZZER_SUPPORTED_OS} 1023cab2bb3Spatrick ARCHS ${FUZZER_SUPPORTED_ARCH} 1033cab2bb3Spatrick SOURCES FuzzerMain.cpp 1043cab2bb3Spatrick CFLAGS ${LIBFUZZER_CFLAGS} 1053cab2bb3Spatrick DEPS ${LIBFUZZER_DEPS}) 1063cab2bb3Spatrick 107d89ec533Spatrickadd_compiler_rt_object_libraries(RTfuzzer_interceptors 108d89ec533Spatrick OS ${FUZZER_SUPPORTED_OS} 109d89ec533Spatrick ARCHS ${FUZZER_SUPPORTED_ARCH} 110d89ec533Spatrick SOURCES FuzzerInterceptors.cpp 111d89ec533Spatrick CFLAGS ${LIBFUZZER_CFLAGS} 112d89ec533Spatrick DEPS ${LIBFUZZER_DEPS}) 113d89ec533Spatrick 1143cab2bb3Spatrickadd_compiler_rt_runtime(clang_rt.fuzzer 1153cab2bb3Spatrick STATIC 1163cab2bb3Spatrick OS ${FUZZER_SUPPORTED_OS} 1173cab2bb3Spatrick ARCHS ${FUZZER_SUPPORTED_ARCH} 1183cab2bb3Spatrick OBJECT_LIBS RTfuzzer RTfuzzer_main 1193cab2bb3Spatrick CFLAGS ${LIBFUZZER_CFLAGS} 1203cab2bb3Spatrick PARENT_TARGET fuzzer) 1213cab2bb3Spatrick 1223cab2bb3Spatrickadd_compiler_rt_runtime(clang_rt.fuzzer_no_main 1233cab2bb3Spatrick STATIC 1243cab2bb3Spatrick OS ${FUZZER_SUPPORTED_OS} 1253cab2bb3Spatrick ARCHS ${FUZZER_SUPPORTED_ARCH} 1263cab2bb3Spatrick OBJECT_LIBS RTfuzzer 1273cab2bb3Spatrick CFLAGS ${LIBFUZZER_CFLAGS} 1283cab2bb3Spatrick PARENT_TARGET fuzzer) 1293cab2bb3Spatrick 130d89ec533Spatrickadd_compiler_rt_runtime(clang_rt.fuzzer_interceptors 131d89ec533Spatrick STATIC 132d89ec533Spatrick OS ${FUZZER_SUPPORTED_OS} 133d89ec533Spatrick ARCHS ${FUZZER_SUPPORTED_ARCH} 134d89ec533Spatrick OBJECT_LIBS RTfuzzer_interceptors 135d89ec533Spatrick CFLAGS ${LIBFUZZER_CFLAGS} 136d89ec533Spatrick PARENT_TARGET fuzzer) 137d89ec533Spatrick 1383cab2bb3Spatrickif(OS_NAME MATCHES "Linux|Fuchsia" AND 1393cab2bb3Spatrick COMPILER_RT_LIBCXX_PATH AND 1403cab2bb3Spatrick COMPILER_RT_LIBCXXABI_PATH) 1413cab2bb3Spatrick macro(partially_link_libcxx name dir arch) 142*810390e3Srobert get_target_flags_for_arch(${arch} target_cflags) 143*810390e3Srobert if(CMAKE_CXX_COMPILER_ID MATCHES Clang) 144*810390e3Srobert get_compiler_rt_target(${arch} target) 145*810390e3Srobert set(target_cflags --target=${target} ${target_cflags}) 1463cab2bb3Spatrick endif() 1473cab2bb3Spatrick set(cxx_${arch}_merge_dir "${CMAKE_CURRENT_BINARY_DIR}/cxx_${arch}_merge.dir") 1483cab2bb3Spatrick file(MAKE_DIRECTORY ${cxx_${arch}_merge_dir}) 1493cab2bb3Spatrick add_custom_command(TARGET clang_rt.${name}-${arch} POST_BUILD 150*810390e3Srobert COMMAND ${CMAKE_CXX_COMPILER} ${target_cflags} -Wl,--whole-archive "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" -Wl,--no-whole-archive ${dir}/lib/libc++.a -r -o ${name}.o 1513cab2bb3Spatrick COMMAND ${CMAKE_OBJCOPY} --localize-hidden ${name}.o 1523cab2bb3Spatrick COMMAND ${CMAKE_COMMAND} -E remove "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" 1533cab2bb3Spatrick COMMAND ${CMAKE_AR} qcs "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" ${name}.o 1543cab2bb3Spatrick WORKING_DIRECTORY ${cxx_${arch}_merge_dir} 1553cab2bb3Spatrick ) 1563cab2bb3Spatrick endmacro() 1573cab2bb3Spatrick 1583cab2bb3Spatrick foreach(arch ${FUZZER_SUPPORTED_ARCH}) 1593cab2bb3Spatrick get_target_flags_for_arch(${arch} TARGET_CFLAGS) 1603cab2bb3Spatrick set(LIBCXX_${arch}_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libcxx_fuzzer_${arch}) 1613cab2bb3Spatrick add_custom_libcxx(libcxx_fuzzer_${arch} ${LIBCXX_${arch}_PREFIX} 1623cab2bb3Spatrick CFLAGS ${TARGET_CFLAGS} 1633cab2bb3Spatrick CMAKE_ARGS -DCMAKE_CXX_COMPILER_WORKS=ON 1643cab2bb3Spatrick -DCMAKE_POSITION_INDEPENDENT_CODE=ON 1653cab2bb3Spatrick -DLIBCXXABI_ENABLE_EXCEPTIONS=OFF 166*810390e3Srobert -DLIBCXX_ABI_NAMESPACE=__Fuzzer 167*810390e3Srobert -DLIBCXX_ENABLE_EXCEPTIONS=OFF) 1683cab2bb3Spatrick target_compile_options(RTfuzzer.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1) 1693cab2bb3Spatrick add_dependencies(RTfuzzer.${arch} libcxx_fuzzer_${arch}-build) 1703cab2bb3Spatrick target_compile_options(RTfuzzer_main.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1) 1713cab2bb3Spatrick add_dependencies(RTfuzzer_main.${arch} libcxx_fuzzer_${arch}-build) 172d89ec533Spatrick target_compile_options(RTfuzzer_interceptors.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1) 173d89ec533Spatrick add_dependencies(RTfuzzer_interceptors.${arch} libcxx_fuzzer_${arch}-build) 1743cab2bb3Spatrick partially_link_libcxx(fuzzer_no_main ${LIBCXX_${arch}_PREFIX} ${arch}) 175d89ec533Spatrick partially_link_libcxx(fuzzer_interceptors ${LIBCXX_${arch}_PREFIX} ${arch}) 1763cab2bb3Spatrick partially_link_libcxx(fuzzer ${LIBCXX_${arch}_PREFIX} ${arch}) 1773cab2bb3Spatrick endforeach() 1783cab2bb3Spatrickendif() 1793cab2bb3Spatrick 1803cab2bb3Spatrickif(COMPILER_RT_INCLUDE_TESTS) 1813cab2bb3Spatrick add_subdirectory(tests) 1823cab2bb3Spatrickendif() 183