george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 1 | set(LIBFUZZER_SOURCES |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 2 | FuzzerCrossOver.cpp |
kcc | 86e4388 | 2018-06-06 01:23:29 +0000 | [diff] [blame] | 3 | FuzzerDataFlowTrace.cpp |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 4 | FuzzerDriver.cpp |
| 5 | FuzzerExtFunctionsDlsym.cpp |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 6 | FuzzerExtFunctionsWeak.cpp |
metzman | ee7a5b8 | 2019-01-15 02:20:53 +0000 | [diff] [blame] | 7 | FuzzerExtFunctionsWindows.cpp |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 8 | FuzzerExtraCounters.cpp |
kcc | 2e6ca5c | 2019-02-12 22:48:55 +0000 | [diff] [blame] | 9 | FuzzerFork.cpp |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 10 | FuzzerIO.cpp |
| 11 | FuzzerIOPosix.cpp |
| 12 | FuzzerIOWindows.cpp |
| 13 | FuzzerLoop.cpp |
| 14 | FuzzerMerge.cpp |
| 15 | FuzzerMutate.cpp |
| 16 | FuzzerSHA1.cpp |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 17 | FuzzerTracePC.cpp |
| 18 | FuzzerUtil.cpp |
| 19 | FuzzerUtilDarwin.cpp |
morehouse | 400262a | 2017-12-08 22:54:44 +0000 | [diff] [blame] | 20 | FuzzerUtilFuchsia.cpp |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 21 | FuzzerUtilLinux.cpp |
| 22 | FuzzerUtilPosix.cpp |
delcypher | c8a15ab | 2018-07-10 13:00:17 +0000 | [diff] [blame] | 23 | FuzzerUtilWindows.cpp) |
| 24 | |
| 25 | set(LIBFUZZER_HEADERS |
metzman | 4013297 | 2019-01-09 21:46:09 +0000 | [diff] [blame] | 26 | FuzzerBuiltins.h |
| 27 | FuzzerBuiltinsMsvc.h |
delcypher | c8a15ab | 2018-07-10 13:00:17 +0000 | [diff] [blame] | 28 | FuzzerCommand.h |
| 29 | FuzzerCorpus.h |
| 30 | FuzzerDataFlowTrace.h |
| 31 | FuzzerDefs.h |
| 32 | FuzzerDictionary.h |
| 33 | FuzzerExtFunctions.def |
| 34 | FuzzerExtFunctions.h |
| 35 | FuzzerFlags.def |
kcc | 2e6ca5c | 2019-02-12 22:48:55 +0000 | [diff] [blame] | 36 | FuzzerFork.h |
delcypher | c8a15ab | 2018-07-10 13:00:17 +0000 | [diff] [blame] | 37 | FuzzerIO.h |
| 38 | FuzzerInterface.h |
| 39 | FuzzerInternal.h |
| 40 | FuzzerMerge.h |
| 41 | FuzzerMutate.h |
| 42 | FuzzerOptions.h |
| 43 | FuzzerRandom.h |
| 44 | FuzzerSHA1.h |
delcypher | c8a15ab | 2018-07-10 13:00:17 +0000 | [diff] [blame] | 45 | FuzzerTracePC.h |
| 46 | FuzzerUtil.h |
| 47 | FuzzerValueBitMap.h) |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 48 | |
george.karpenkov | 9d1e810 | 2017-08-22 18:34:28 +0000 | [diff] [blame] | 49 | CHECK_CXX_SOURCE_COMPILES(" |
| 50 | static thread_local int blah; |
| 51 | int main() { |
| 52 | return 0; |
| 53 | } |
| 54 | " HAS_THREAD_LOCAL) |
| 55 | |
george.karpenkov | c126dea | 2017-08-28 19:44:19 +0000 | [diff] [blame] | 56 | set(LIBFUZZER_CFLAGS ${SANITIZER_COMMON_CFLAGS}) |
| 57 | |
hahnfeld | 523d9dd | 2019-02-17 12:16:20 +0000 | [diff] [blame] | 58 | if(OS_NAME MATCHES "Linux|Fuchsia" AND |
| 59 | COMPILER_RT_LIBCXX_PATH AND |
| 60 | COMPILER_RT_LIBCXXABI_PATH) |
phosek | 3816f4b | 2018-01-21 01:01:53 +0000 | [diff] [blame] | 61 | list(APPEND LIBFUZZER_CFLAGS -nostdinc++ -D_LIBCPP_ABI_VERSION=Fuzzer) |
hahnfeld | b7ef261 | 2018-02-01 13:57:24 +0000 | [diff] [blame] | 62 | # Remove -stdlib= which is unused when passing -nostdinc++. |
| 63 | string(REGEX REPLACE "-stdlib=[a-zA-Z+]*" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) |
phosek | e0e3d86 | 2018-07-16 18:48:20 +0000 | [diff] [blame] | 64 | elseif(TARGET cxx-headers OR HAVE_LIBCXX) |
| 65 | set(LIBFUZZER_DEPS cxx-headers) |
phosek | 966475e | 2018-01-17 20:39:14 +0000 | [diff] [blame] | 66 | endif() |
| 67 | |
alekseyshl | daca204 | 2017-10-13 21:57:43 +0000 | [diff] [blame] | 68 | append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fno-omit-frame-pointer LIBFUZZER_CFLAGS) |
| 69 | |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 70 | if (CMAKE_CXX_FLAGS MATCHES "fsanitize-coverage") |
george.karpenkov | c126dea | 2017-08-28 19:44:19 +0000 | [diff] [blame] | 71 | list(APPEND LIBFUZZER_CFLAGS -fno-sanitize-coverage=trace-pc-guard,edge,trace-cmp,indirect-calls,8bit-counters) |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 72 | endif() |
george.karpenkov | c126dea | 2017-08-28 19:44:19 +0000 | [diff] [blame] | 73 | |
mstorsjo | 3ee2084 | 2019-01-23 07:23:16 +0000 | [diff] [blame] | 74 | if(MSVC) |
metzman | 8c9667b | 2019-01-25 01:10:57 +0000 | [diff] [blame] | 75 | # Silence warnings by turning off exceptions in MSVC headers and avoid an |
| 76 | # error by unecessarily defining thread_local when it isn't even used on |
| 77 | # Windows. |
| 78 | list(APPEND LIBFUZZER_CFLAGS -D_HAS_EXCEPTIONS=0) |
metzman | 1c6a859 | 2019-01-22 18:59:25 +0000 | [diff] [blame] | 79 | else() |
| 80 | if(NOT HAS_THREAD_LOCAL) |
| 81 | list(APPEND LIBFUZZER_CFLAGS -Dthread_local=__thread) |
| 82 | endif() |
george.karpenkov | 9d1e810 | 2017-08-22 18:34:28 +0000 | [diff] [blame] | 83 | endif() |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 84 | |
george.karpenkov | f44dac4 | 2018-06-14 20:46:07 +0000 | [diff] [blame] | 85 | set(FUZZER_SUPPORTED_OS ${SANITIZER_COMMON_SUPPORTED_OS}) |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 86 | |
cbieneman | c01e88f | 2019-04-19 20:13:25 +0000 | [diff] [blame] | 87 | add_compiler_rt_component(fuzzer) |
| 88 | |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 89 | add_compiler_rt_object_libraries(RTfuzzer |
| 90 | OS ${FUZZER_SUPPORTED_OS} |
| 91 | ARCHS ${FUZZER_SUPPORTED_ARCH} |
| 92 | SOURCES ${LIBFUZZER_SOURCES} |
delcypher | c8a15ab | 2018-07-10 13:00:17 +0000 | [diff] [blame] | 93 | ADDITIONAL_HEADERS ${LIBFUZZER_HEADERS} |
phosek | e3d1303 | 2018-06-18 08:01:57 +0000 | [diff] [blame] | 94 | CFLAGS ${LIBFUZZER_CFLAGS} |
| 95 | DEPS ${LIBFUZZER_DEPS}) |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 96 | |
| 97 | add_compiler_rt_object_libraries(RTfuzzer_main |
| 98 | OS ${FUZZER_SUPPORTED_OS} |
| 99 | ARCHS ${FUZZER_SUPPORTED_ARCH} |
| 100 | SOURCES FuzzerMain.cpp |
phosek | e3d1303 | 2018-06-18 08:01:57 +0000 | [diff] [blame] | 101 | CFLAGS ${LIBFUZZER_CFLAGS} |
| 102 | DEPS ${LIBFUZZER_DEPS}) |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 103 | |
| 104 | add_compiler_rt_runtime(clang_rt.fuzzer |
| 105 | STATIC |
| 106 | OS ${FUZZER_SUPPORTED_OS} |
| 107 | ARCHS ${FUZZER_SUPPORTED_ARCH} |
| 108 | OBJECT_LIBS RTfuzzer RTfuzzer_main |
| 109 | CFLAGS ${LIBFUZZER_CFLAGS} |
| 110 | PARENT_TARGET fuzzer) |
| 111 | |
| 112 | add_compiler_rt_runtime(clang_rt.fuzzer_no_main |
| 113 | STATIC |
| 114 | OS ${FUZZER_SUPPORTED_OS} |
| 115 | ARCHS ${FUZZER_SUPPORTED_ARCH} |
| 116 | OBJECT_LIBS RTfuzzer |
| 117 | CFLAGS ${LIBFUZZER_CFLAGS} |
| 118 | PARENT_TARGET fuzzer) |
| 119 | |
hahnfeld | 523d9dd | 2019-02-17 12:16:20 +0000 | [diff] [blame] | 120 | if(OS_NAME MATCHES "Linux|Fuchsia" AND |
| 121 | COMPILER_RT_LIBCXX_PATH AND |
| 122 | COMPILER_RT_LIBCXXABI_PATH) |
metzman | 780e66d | 2019-04-30 17:58:56 +0000 | [diff] [blame] | 123 | macro(partially_link_libcxx name dir arch) |
| 124 | if(${arch} MATCHES "i386") |
metzman | 2738dfb | 2019-04-30 17:58:54 +0000 | [diff] [blame] | 125 | set(EMULATION_ARGUMENT "-m" "elf_i386") |
| 126 | else() |
| 127 | set(EMULATION_ARGUMENT "") |
| 128 | endif() |
phosek | 966475e | 2018-01-17 20:39:14 +0000 | [diff] [blame] | 129 | set(cxx_${arch}_merge_dir "${CMAKE_CURRENT_BINARY_DIR}/cxx_${arch}_merge.dir") |
| 130 | file(MAKE_DIRECTORY ${cxx_${arch}_merge_dir}) |
| 131 | add_custom_command(TARGET clang_rt.${name}-${arch} POST_BUILD |
metzman | 5dc1385 | 2019-04-30 17:58:57 +0000 | [diff] [blame] | 132 | COMMAND ${CMAKE_LINKER} ${EMULATION_ARGUMENT} --whole-archive "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" --no-whole-archive ${dir}/lib/libc++.a -r -o ${name}.o |
phosek | 966475e | 2018-01-17 20:39:14 +0000 | [diff] [blame] | 133 | COMMAND ${CMAKE_OBJCOPY} --localize-hidden ${name}.o |
| 134 | COMMAND ${CMAKE_COMMAND} -E remove "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" |
| 135 | COMMAND ${CMAKE_AR} qcs "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" ${name}.o |
| 136 | WORKING_DIRECTORY ${cxx_${arch}_merge_dir} |
| 137 | ) |
| 138 | endmacro() |
| 139 | |
| 140 | foreach(arch ${FUZZER_SUPPORTED_ARCH}) |
| 141 | get_target_flags_for_arch(${arch} TARGET_CFLAGS) |
| 142 | set(LIBCXX_${arch}_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libcxx_fuzzer_${arch}) |
| 143 | add_custom_libcxx(libcxx_fuzzer_${arch} ${LIBCXX_${arch}_PREFIX} |
| 144 | CFLAGS ${TARGET_CFLAGS} |
phosek | 7c0321b | 2018-04-13 23:05:14 +0000 | [diff] [blame] | 145 | CMAKE_ARGS -DCMAKE_CXX_COMPILER_WORKS=ON |
kongyi | c0d0660 | 2019-08-05 22:55:17 +0000 | [diff] [blame] | 146 | -DCMAKE_POSITION_INDEPENDENT_CODE=ON |
hahnfeld | 523d9dd | 2019-02-17 12:16:20 +0000 | [diff] [blame] | 147 | -DLIBCXX_ABI_NAMESPACE=Fuzzer) |
phosek | a4b48cc | 2018-07-24 00:34:55 +0000 | [diff] [blame] | 148 | target_compile_options(RTfuzzer.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1) |
phosek | 3816f4b | 2018-01-21 01:01:53 +0000 | [diff] [blame] | 149 | add_dependencies(RTfuzzer.${arch} libcxx_fuzzer_${arch}-build) |
phosek | a4b48cc | 2018-07-24 00:34:55 +0000 | [diff] [blame] | 150 | target_compile_options(RTfuzzer_main.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1) |
phosek | 3816f4b | 2018-01-21 01:01:53 +0000 | [diff] [blame] | 151 | add_dependencies(RTfuzzer_main.${arch} libcxx_fuzzer_${arch}-build) |
phosek | 966475e | 2018-01-17 20:39:14 +0000 | [diff] [blame] | 152 | partially_link_libcxx(fuzzer_no_main ${LIBCXX_${arch}_PREFIX} ${arch}) |
| 153 | partially_link_libcxx(fuzzer ${LIBCXX_${arch}_PREFIX} ${arch}) |
| 154 | endforeach() |
| 155 | endif() |
| 156 | |
george.karpenkov | 29efa6d | 2017-08-21 23:25:50 +0000 | [diff] [blame] | 157 | if(COMPILER_RT_INCLUDE_TESTS) |
| 158 | add_subdirectory(tests) |
| 159 | endif() |