blob: 3743db9908ce27069e6c2842dc240522db67c038 [file] [log] [blame]
george.karpenkov29efa6d2017-08-21 23:25:50 +00001set(LIBFUZZER_SOURCES
george.karpenkov29efa6d2017-08-21 23:25:50 +00002 FuzzerCrossOver.cpp
kcc86e43882018-06-06 01:23:29 +00003 FuzzerDataFlowTrace.cpp
george.karpenkov29efa6d2017-08-21 23:25:50 +00004 FuzzerDriver.cpp
5 FuzzerExtFunctionsDlsym.cpp
george.karpenkov29efa6d2017-08-21 23:25:50 +00006 FuzzerExtFunctionsWeak.cpp
metzmanee7a5b82019-01-15 02:20:53 +00007 FuzzerExtFunctionsWindows.cpp
george.karpenkov29efa6d2017-08-21 23:25:50 +00008 FuzzerExtraCounters.cpp
kcc2e6ca5c2019-02-12 22:48:55 +00009 FuzzerFork.cpp
george.karpenkov29efa6d2017-08-21 23:25:50 +000010 FuzzerIO.cpp
11 FuzzerIOPosix.cpp
12 FuzzerIOWindows.cpp
13 FuzzerLoop.cpp
14 FuzzerMerge.cpp
15 FuzzerMutate.cpp
16 FuzzerSHA1.cpp
george.karpenkov29efa6d2017-08-21 23:25:50 +000017 FuzzerTracePC.cpp
18 FuzzerUtil.cpp
19 FuzzerUtilDarwin.cpp
morehouse400262a2017-12-08 22:54:44 +000020 FuzzerUtilFuchsia.cpp
george.karpenkov29efa6d2017-08-21 23:25:50 +000021 FuzzerUtilLinux.cpp
22 FuzzerUtilPosix.cpp
delcypherc8a15ab2018-07-10 13:00:17 +000023 FuzzerUtilWindows.cpp)
24
25set(LIBFUZZER_HEADERS
metzman40132972019-01-09 21:46:09 +000026 FuzzerBuiltins.h
27 FuzzerBuiltinsMsvc.h
delcypherc8a15ab2018-07-10 13:00:17 +000028 FuzzerCommand.h
29 FuzzerCorpus.h
30 FuzzerDataFlowTrace.h
31 FuzzerDefs.h
32 FuzzerDictionary.h
33 FuzzerExtFunctions.def
34 FuzzerExtFunctions.h
35 FuzzerFlags.def
kcc2e6ca5c2019-02-12 22:48:55 +000036 FuzzerFork.h
delcypherc8a15ab2018-07-10 13:00:17 +000037 FuzzerIO.h
38 FuzzerInterface.h
39 FuzzerInternal.h
40 FuzzerMerge.h
41 FuzzerMutate.h
42 FuzzerOptions.h
43 FuzzerRandom.h
44 FuzzerSHA1.h
delcypherc8a15ab2018-07-10 13:00:17 +000045 FuzzerTracePC.h
46 FuzzerUtil.h
47 FuzzerValueBitMap.h)
george.karpenkov29efa6d2017-08-21 23:25:50 +000048
george.karpenkov9d1e8102017-08-22 18:34:28 +000049CHECK_CXX_SOURCE_COMPILES("
50 static thread_local int blah;
51 int main() {
52 return 0;
53 }
54 " HAS_THREAD_LOCAL)
55
george.karpenkovc126dea2017-08-28 19:44:19 +000056set(LIBFUZZER_CFLAGS ${SANITIZER_COMMON_CFLAGS})
57
hahnfeld523d9dd2019-02-17 12:16:20 +000058if(OS_NAME MATCHES "Linux|Fuchsia" AND
59 COMPILER_RT_LIBCXX_PATH AND
60 COMPILER_RT_LIBCXXABI_PATH)
phosek3816f4b2018-01-21 01:01:53 +000061 list(APPEND LIBFUZZER_CFLAGS -nostdinc++ -D_LIBCPP_ABI_VERSION=Fuzzer)
hahnfeldb7ef2612018-02-01 13:57:24 +000062 # Remove -stdlib= which is unused when passing -nostdinc++.
63 string(REGEX REPLACE "-stdlib=[a-zA-Z+]*" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
phoseke0e3d862018-07-16 18:48:20 +000064elseif(TARGET cxx-headers OR HAVE_LIBCXX)
65 set(LIBFUZZER_DEPS cxx-headers)
phosek966475e2018-01-17 20:39:14 +000066endif()
67
alekseyshldaca2042017-10-13 21:57:43 +000068append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fno-omit-frame-pointer LIBFUZZER_CFLAGS)
69
george.karpenkov29efa6d2017-08-21 23:25:50 +000070if (CMAKE_CXX_FLAGS MATCHES "fsanitize-coverage")
george.karpenkovc126dea2017-08-28 19:44:19 +000071 list(APPEND LIBFUZZER_CFLAGS -fno-sanitize-coverage=trace-pc-guard,edge,trace-cmp,indirect-calls,8bit-counters)
george.karpenkov29efa6d2017-08-21 23:25:50 +000072endif()
george.karpenkovc126dea2017-08-28 19:44:19 +000073
mstorsjo3ee20842019-01-23 07:23:16 +000074if(MSVC)
metzman8c9667b2019-01-25 01:10:57 +000075 # 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)
metzman1c6a8592019-01-22 18:59:25 +000079else()
80 if(NOT HAS_THREAD_LOCAL)
81 list(APPEND LIBFUZZER_CFLAGS -Dthread_local=__thread)
82 endif()
george.karpenkov9d1e8102017-08-22 18:34:28 +000083endif()
george.karpenkov29efa6d2017-08-21 23:25:50 +000084
george.karpenkovf44dac42018-06-14 20:46:07 +000085set(FUZZER_SUPPORTED_OS ${SANITIZER_COMMON_SUPPORTED_OS})
george.karpenkov29efa6d2017-08-21 23:25:50 +000086
cbienemanc01e88f2019-04-19 20:13:25 +000087add_compiler_rt_component(fuzzer)
88
george.karpenkov29efa6d2017-08-21 23:25:50 +000089add_compiler_rt_object_libraries(RTfuzzer
90 OS ${FUZZER_SUPPORTED_OS}
91 ARCHS ${FUZZER_SUPPORTED_ARCH}
92 SOURCES ${LIBFUZZER_SOURCES}
delcypherc8a15ab2018-07-10 13:00:17 +000093 ADDITIONAL_HEADERS ${LIBFUZZER_HEADERS}
phoseke3d13032018-06-18 08:01:57 +000094 CFLAGS ${LIBFUZZER_CFLAGS}
95 DEPS ${LIBFUZZER_DEPS})
george.karpenkov29efa6d2017-08-21 23:25:50 +000096
97add_compiler_rt_object_libraries(RTfuzzer_main
98 OS ${FUZZER_SUPPORTED_OS}
99 ARCHS ${FUZZER_SUPPORTED_ARCH}
100 SOURCES FuzzerMain.cpp
phoseke3d13032018-06-18 08:01:57 +0000101 CFLAGS ${LIBFUZZER_CFLAGS}
102 DEPS ${LIBFUZZER_DEPS})
george.karpenkov29efa6d2017-08-21 23:25:50 +0000103
104add_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
112add_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
hahnfeld523d9dd2019-02-17 12:16:20 +0000120if(OS_NAME MATCHES "Linux|Fuchsia" AND
121 COMPILER_RT_LIBCXX_PATH AND
122 COMPILER_RT_LIBCXXABI_PATH)
metzman780e66d2019-04-30 17:58:56 +0000123 macro(partially_link_libcxx name dir arch)
124 if(${arch} MATCHES "i386")
metzman2738dfb2019-04-30 17:58:54 +0000125 set(EMULATION_ARGUMENT "-m" "elf_i386")
126 else()
127 set(EMULATION_ARGUMENT "")
128 endif()
phosek966475e2018-01-17 20:39:14 +0000129 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
metzman5dc13852019-04-30 17:58:57 +0000132 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
phosek966475e2018-01-17 20:39:14 +0000133 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}
phosek7c0321b2018-04-13 23:05:14 +0000145 CMAKE_ARGS -DCMAKE_CXX_COMPILER_WORKS=ON
kongyic0d06602019-08-05 22:55:17 +0000146 -DCMAKE_POSITION_INDEPENDENT_CODE=ON
hahnfeld523d9dd2019-02-17 12:16:20 +0000147 -DLIBCXX_ABI_NAMESPACE=Fuzzer)
phoseka4b48cc2018-07-24 00:34:55 +0000148 target_compile_options(RTfuzzer.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1)
phosek3816f4b2018-01-21 01:01:53 +0000149 add_dependencies(RTfuzzer.${arch} libcxx_fuzzer_${arch}-build)
phoseka4b48cc2018-07-24 00:34:55 +0000150 target_compile_options(RTfuzzer_main.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1)
phosek3816f4b2018-01-21 01:01:53 +0000151 add_dependencies(RTfuzzer_main.${arch} libcxx_fuzzer_${arch}-build)
phosek966475e2018-01-17 20:39:14 +0000152 partially_link_libcxx(fuzzer_no_main ${LIBCXX_${arch}_PREFIX} ${arch})
153 partially_link_libcxx(fuzzer ${LIBCXX_${arch}_PREFIX} ${arch})
154 endforeach()
155endif()
156
george.karpenkov29efa6d2017-08-21 23:25:50 +0000157if(COMPILER_RT_INCLUDE_TESTS)
158 add_subdirectory(tests)
159endif()