184 lines · plain
1set(LIBFUZZER_SOURCES2 FuzzerCrossOver.cpp3 FuzzerDataFlowTrace.cpp4 FuzzerDriver.cpp5 FuzzerExtFunctionsDlsym.cpp6 FuzzerExtFunctionsWeak.cpp7 FuzzerExtFunctionsWindows.cpp8 FuzzerExtraCounters.cpp9 FuzzerExtraCountersDarwin.cpp10 FuzzerExtraCountersWindows.cpp11 FuzzerFork.cpp12 FuzzerIO.cpp13 FuzzerIOPosix.cpp14 FuzzerIOWindows.cpp15 FuzzerLoop.cpp16 FuzzerMerge.cpp17 FuzzerMutate.cpp18 FuzzerSHA1.cpp19 FuzzerTracePC.cpp20 FuzzerUtil.cpp21 FuzzerUtilDarwin.cpp22 FuzzerUtilFuchsia.cpp23 FuzzerUtilLinux.cpp24 FuzzerUtilPosix.cpp25 FuzzerUtilWindows.cpp)26 27set(LIBFUZZER_HEADERS28 FuzzerBuiltins.h29 FuzzerBuiltinsMsvc.h30 FuzzerCommand.h31 FuzzerCorpus.h32 FuzzerDataFlowTrace.h33 FuzzerDefs.h34 FuzzerDictionary.h35 FuzzerExtFunctions.def36 FuzzerExtFunctions.h37 FuzzerFlags.def38 FuzzerFork.h39 FuzzerIO.h40 FuzzerInterface.h41 FuzzerInternal.h42 FuzzerMerge.h43 FuzzerMutate.h44 FuzzerOptions.h45 FuzzerRandom.h46 FuzzerSHA1.h47 FuzzerTracePC.h48 FuzzerUtil.h49 FuzzerValueBitMap.h)50 51include_directories(../../include)52 53CHECK_CXX_SOURCE_COMPILES("54 static thread_local int blah;55 int main() {56 return 0;57 }58 " HAS_THREAD_LOCAL)59 60set(LIBFUZZER_CFLAGS ${COMPILER_RT_COMMON_CFLAGS})61 62if(OS_NAME MATCHES "Android|Linux|Fuchsia" AND63 COMPILER_RT_LIBCXX_PATH AND64 COMPILER_RT_LIBCXXABI_PATH)65 list(APPEND LIBFUZZER_CFLAGS -D_LIBCPP_ABI_VERSION=Fuzzer)66 append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ LIBFUZZER_CFLAGS)67elseif(TARGET cxx-headers OR HAVE_LIBCXX)68 # libFuzzer uses C++ standard library headers.69 list(APPEND LIBFUZZER_CFLAGS ${COMPILER_RT_CXX_CFLAGS})70 set(LIBFUZZER_DEPS cxx-headers)71endif()72 73append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fno-omit-frame-pointer LIBFUZZER_CFLAGS)74 75if (CMAKE_CXX_FLAGS MATCHES "fsanitize-coverage")76 list(APPEND LIBFUZZER_CFLAGS -fsanitize-coverage=0)77endif()78 79if(MSVC)80 # Silence warnings by turning off exceptions in MSVC headers and avoid an81 # error by unnecessarily defining thread_local when it isn't even used on82 # Windows.83 list(APPEND LIBFUZZER_CFLAGS -D_HAS_EXCEPTIONS=0)84else()85 if(NOT HAS_THREAD_LOCAL)86 list(APPEND LIBFUZZER_CFLAGS -Dthread_local=__thread)87 endif()88endif()89 90add_compiler_rt_component(fuzzer)91 92add_compiler_rt_object_libraries(RTfuzzer93 OS ${FUZZER_SUPPORTED_OS}94 ARCHS ${FUZZER_SUPPORTED_ARCH}95 SOURCES ${LIBFUZZER_SOURCES}96 ADDITIONAL_HEADERS ${LIBFUZZER_HEADERS}97 CFLAGS ${LIBFUZZER_CFLAGS}98 DEPS ${LIBFUZZER_DEPS})99 100add_compiler_rt_object_libraries(RTfuzzer_main101 OS ${FUZZER_SUPPORTED_OS}102 ARCHS ${FUZZER_SUPPORTED_ARCH}103 SOURCES FuzzerMain.cpp104 CFLAGS ${LIBFUZZER_CFLAGS}105 DEPS ${LIBFUZZER_DEPS})106 107add_compiler_rt_object_libraries(RTfuzzer_interceptors108 OS ${FUZZER_SUPPORTED_OS}109 ARCHS ${FUZZER_SUPPORTED_ARCH}110 SOURCES FuzzerInterceptors.cpp111 CFLAGS ${LIBFUZZER_CFLAGS}112 DEPS ${LIBFUZZER_DEPS})113 114add_compiler_rt_runtime(clang_rt.fuzzer115 STATIC116 OS ${FUZZER_SUPPORTED_OS}117 ARCHS ${FUZZER_SUPPORTED_ARCH}118 OBJECT_LIBS RTfuzzer RTfuzzer_main119 CFLAGS ${LIBFUZZER_CFLAGS}120 PARENT_TARGET fuzzer)121 122add_compiler_rt_runtime(clang_rt.fuzzer_no_main123 STATIC124 OS ${FUZZER_SUPPORTED_OS}125 ARCHS ${FUZZER_SUPPORTED_ARCH}126 OBJECT_LIBS RTfuzzer127 CFLAGS ${LIBFUZZER_CFLAGS}128 PARENT_TARGET fuzzer)129 130add_compiler_rt_runtime(clang_rt.fuzzer_interceptors131 STATIC132 OS ${FUZZER_SUPPORTED_OS}133 ARCHS ${FUZZER_SUPPORTED_ARCH}134 OBJECT_LIBS RTfuzzer_interceptors135 CFLAGS ${LIBFUZZER_CFLAGS}136 PARENT_TARGET fuzzer)137 138if(OS_NAME MATCHES "Android|Linux|Fuchsia" AND139 COMPILER_RT_LIBCXX_PATH AND140 COMPILER_RT_LIBCXXABI_PATH)141 macro(partially_link_libcxx name dir arch)142 get_target_flags_for_arch(${arch} target_cflags)143 if(CMAKE_CXX_COMPILER_ID MATCHES Clang)144 get_compiler_rt_target(${arch} target)145 set(target_cflags --target=${target} ${target_cflags})146 endif()147 set(cxx_${arch}_merge_dir "${CMAKE_CURRENT_BINARY_DIR}/cxx_${arch}_merge.dir")148 file(MAKE_DIRECTORY ${cxx_${arch}_merge_dir})149 add_custom_command(TARGET clang_rt.${name}-${arch} POST_BUILD150 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}.o151 COMMAND ${CMAKE_OBJCOPY} --localize-hidden ${name}.o152 COMMAND ${CMAKE_COMMAND} -E remove "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>"153 COMMAND ${CMAKE_AR} qcs "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" ${name}.o154 WORKING_DIRECTORY ${cxx_${arch}_merge_dir}155 )156 endmacro()157 158 foreach(arch ${FUZZER_SUPPORTED_ARCH})159 get_target_flags_for_arch(${arch} TARGET_CFLAGS)160 set(LIBCXX_${arch}_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libcxx_fuzzer_${arch})161 add_custom_libcxx(libcxx_fuzzer_${arch} ${LIBCXX_${arch}_PREFIX}162 CFLAGS ${TARGET_CFLAGS}163 CMAKE_ARGS -DCMAKE_CXX_COMPILER_WORKS=ON164 -DCMAKE_POSITION_INDEPENDENT_CODE=ON165 -DRUNTIMES_EXECUTE_ONLY_CODE=${RUNTIMES_EXECUTE_ONLY_CODE}166 -DLIBCXXABI_ENABLE_EXCEPTIONS=OFF167 -DLIBCXX_ABI_NAMESPACE=__Fuzzer168 -DLIBCXX_ENABLE_EXCEPTIONS=OFF)169 target_compile_options(RTfuzzer.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1)170 add_dependencies(RTfuzzer.${arch} libcxx_fuzzer_${arch}-install-cmake326-workaround)171 target_compile_options(RTfuzzer_main.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1)172 add_dependencies(RTfuzzer_main.${arch} libcxx_fuzzer_${arch}-install-cmake326-workaround)173 target_compile_options(RTfuzzer_interceptors.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1)174 add_dependencies(RTfuzzer_interceptors.${arch} libcxx_fuzzer_${arch}-install-cmake326-workaround)175 partially_link_libcxx(fuzzer_no_main ${LIBCXX_${arch}_PREFIX} ${arch})176 partially_link_libcxx(fuzzer_interceptors ${LIBCXX_${arch}_PREFIX} ${arch})177 partially_link_libcxx(fuzzer ${LIBCXX_${arch}_PREFIX} ${arch})178 endforeach()179endif()180 181if(COMPILER_RT_INCLUDE_TESTS)182 add_subdirectory(tests)183endif()184