xref: /openbsd-src/gnu/llvm/compiler-rt/lib/fuzzer/CMakeLists.txt (revision 810390e339a5425391477d5d41c78d7cab2424ac)
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