• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1set(LIBFUZZER_SOURCES
2  FuzzerCrossOver.cpp
3  FuzzerDataFlowTrace.cpp
4  FuzzerDriver.cpp
5  FuzzerExtFunctionsDlsym.cpp
6  FuzzerExtFunctionsWeak.cpp
7  FuzzerExtFunctionsWindows.cpp
8  FuzzerExtraCounters.cpp
9  FuzzerFork.cpp
10  FuzzerIO.cpp
11  FuzzerIOPosix.cpp
12  FuzzerIOWindows.cpp
13  FuzzerLoop.cpp
14  FuzzerMerge.cpp
15  FuzzerMutate.cpp
16  FuzzerSHA1.cpp
17  FuzzerTracePC.cpp
18  FuzzerUtil.cpp
19  FuzzerUtilDarwin.cpp
20  FuzzerUtilFuchsia.cpp
21  FuzzerUtilLinux.cpp
22  FuzzerUtilPosix.cpp
23  FuzzerUtilWindows.cpp)
24
25set(LIBFUZZER_HEADERS
26  FuzzerBuiltins.h
27  FuzzerBuiltinsMsvc.h
28  FuzzerCommand.h
29  FuzzerCorpus.h
30  FuzzerDataFlowTrace.h
31  FuzzerDefs.h
32  FuzzerDictionary.h
33  FuzzerExtFunctions.def
34  FuzzerExtFunctions.h
35  FuzzerFlags.def
36  FuzzerFork.h
37  FuzzerIO.h
38  FuzzerInterface.h
39  FuzzerInternal.h
40  FuzzerMerge.h
41  FuzzerMutate.h
42  FuzzerOptions.h
43  FuzzerRandom.h
44  FuzzerSHA1.h
45  FuzzerTracePC.h
46  FuzzerUtil.h
47  FuzzerValueBitMap.h)
48
49include_directories(../../include)
50
51CHECK_CXX_SOURCE_COMPILES("
52  static thread_local int blah;
53  int main() {
54  return 0;
55  }
56  " HAS_THREAD_LOCAL)
57
58set(LIBFUZZER_CFLAGS ${COMPILER_RT_COMMON_CFLAGS})
59
60if(OS_NAME MATCHES "Linux|Fuchsia" AND
61   COMPILER_RT_LIBCXX_PATH AND
62   COMPILER_RT_LIBCXXABI_PATH)
63  list(APPEND LIBFUZZER_CFLAGS -D_LIBCPP_ABI_VERSION=Fuzzer)
64  append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ LIBFUZZER_CFLAGS)
65elseif(TARGET cxx-headers OR HAVE_LIBCXX)
66  # libFuzzer uses C++ standard library headers.
67  set(LIBFUZZER_DEPS cxx-headers)
68endif()
69
70append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fno-omit-frame-pointer LIBFUZZER_CFLAGS)
71
72if (CMAKE_CXX_FLAGS MATCHES "fsanitize-coverage")
73  list(APPEND LIBFUZZER_CFLAGS -fno-sanitize-coverage=trace-pc-guard,edge,trace-cmp,indirect-calls,8bit-counters)
74endif()
75
76if(MSVC)
77  # Silence warnings by turning off exceptions in MSVC headers and avoid an
78  # error by unecessarily defining thread_local when it isn't even used on
79  # Windows.
80  list(APPEND LIBFUZZER_CFLAGS -D_HAS_EXCEPTIONS=0)
81else()
82  if(NOT HAS_THREAD_LOCAL)
83    list(APPEND LIBFUZZER_CFLAGS -Dthread_local=__thread)
84  endif()
85endif()
86
87add_compiler_rt_component(fuzzer)
88
89add_compiler_rt_object_libraries(RTfuzzer
90  OS ${FUZZER_SUPPORTED_OS}
91  ARCHS ${FUZZER_SUPPORTED_ARCH}
92  SOURCES ${LIBFUZZER_SOURCES}
93  ADDITIONAL_HEADERS ${LIBFUZZER_HEADERS}
94  CFLAGS ${LIBFUZZER_CFLAGS}
95  DEPS ${LIBFUZZER_DEPS})
96
97add_compiler_rt_object_libraries(RTfuzzer_main
98  OS ${FUZZER_SUPPORTED_OS}
99  ARCHS ${FUZZER_SUPPORTED_ARCH}
100  SOURCES FuzzerMain.cpp
101  CFLAGS ${LIBFUZZER_CFLAGS}
102  DEPS ${LIBFUZZER_DEPS})
103
104add_compiler_rt_object_libraries(RTfuzzer_interceptors
105  OS ${FUZZER_SUPPORTED_OS}
106  ARCHS ${FUZZER_SUPPORTED_ARCH}
107  SOURCES FuzzerInterceptors.cpp
108  CFLAGS ${LIBFUZZER_CFLAGS}
109  DEPS ${LIBFUZZER_DEPS})
110
111add_compiler_rt_runtime(clang_rt.fuzzer
112  STATIC
113  OS ${FUZZER_SUPPORTED_OS}
114  ARCHS ${FUZZER_SUPPORTED_ARCH}
115  OBJECT_LIBS RTfuzzer RTfuzzer_main
116  CFLAGS ${LIBFUZZER_CFLAGS}
117  PARENT_TARGET fuzzer)
118
119add_compiler_rt_runtime(clang_rt.fuzzer_no_main
120  STATIC
121  OS ${FUZZER_SUPPORTED_OS}
122  ARCHS ${FUZZER_SUPPORTED_ARCH}
123  OBJECT_LIBS RTfuzzer
124  CFLAGS ${LIBFUZZER_CFLAGS}
125  PARENT_TARGET fuzzer)
126
127add_compiler_rt_runtime(clang_rt.fuzzer_interceptors
128  STATIC
129  OS ${FUZZER_SUPPORTED_OS}
130  ARCHS ${FUZZER_SUPPORTED_ARCH}
131  OBJECT_LIBS RTfuzzer_interceptors
132  CFLAGS ${LIBFUZZER_CFLAGS}
133  PARENT_TARGET fuzzer)
134
135if(OS_NAME MATCHES "Linux|Fuchsia" AND
136   COMPILER_RT_LIBCXX_PATH AND
137   COMPILER_RT_LIBCXXABI_PATH)
138  macro(partially_link_libcxx name dir arch)
139    if(${arch} MATCHES "i386")
140      set(EMULATION_ARGUMENT "-m" "elf_i386")
141    else()
142      set(EMULATION_ARGUMENT "")
143    endif()
144    set(cxx_${arch}_merge_dir "${CMAKE_CURRENT_BINARY_DIR}/cxx_${arch}_merge.dir")
145    file(MAKE_DIRECTORY ${cxx_${arch}_merge_dir})
146    add_custom_command(TARGET clang_rt.${name}-${arch} POST_BUILD
147      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
148      COMMAND ${CMAKE_OBJCOPY} --localize-hidden ${name}.o
149      COMMAND ${CMAKE_COMMAND} -E remove "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>"
150      COMMAND ${CMAKE_AR} qcs "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" ${name}.o
151      WORKING_DIRECTORY ${cxx_${arch}_merge_dir}
152    )
153  endmacro()
154
155  foreach(arch ${FUZZER_SUPPORTED_ARCH})
156    get_target_flags_for_arch(${arch} TARGET_CFLAGS)
157    set(LIBCXX_${arch}_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libcxx_fuzzer_${arch})
158    add_custom_libcxx(libcxx_fuzzer_${arch} ${LIBCXX_${arch}_PREFIX}
159      CFLAGS ${TARGET_CFLAGS}
160      CMAKE_ARGS -DCMAKE_CXX_COMPILER_WORKS=ON
161                 -DCMAKE_POSITION_INDEPENDENT_CODE=ON
162                 -DLIBCXXABI_ENABLE_EXCEPTIONS=OFF
163                 -DLIBCXX_ABI_NAMESPACE=__Fuzzer)
164    target_compile_options(RTfuzzer.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1)
165    add_dependencies(RTfuzzer.${arch} libcxx_fuzzer_${arch}-build)
166    target_compile_options(RTfuzzer_main.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1)
167    add_dependencies(RTfuzzer_main.${arch} libcxx_fuzzer_${arch}-build)
168    target_compile_options(RTfuzzer_interceptors.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1)
169    add_dependencies(RTfuzzer_interceptors.${arch} libcxx_fuzzer_${arch}-build)
170    partially_link_libcxx(fuzzer_no_main ${LIBCXX_${arch}_PREFIX} ${arch})
171    partially_link_libcxx(fuzzer_interceptors ${LIBCXX_${arch}_PREFIX} ${arch})
172    partially_link_libcxx(fuzzer ${LIBCXX_${arch}_PREFIX} ${arch})
173  endforeach()
174endif()
175
176if(COMPILER_RT_INCLUDE_TESTS)
177  add_subdirectory(tests)
178endif()
179