set(LLVM_LINK_COMPONENTS ${LLVM_TARGETS_TO_BUILD} FuzzerCLI)
set(CXX_FLAGS_NOFUZZ ${CMAKE_CXX_FLAGS})
set(DUMMY_MAIN DummyClangFuzzer.cpp)
if(LLVM_LIB_FUZZING_ENGINE)
unset(DUMMY_MAIN)
elseif(LLVM_USE_SANITIZE_COVERAGE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer")
set(CXX_FLAGS_NOFUZZ "${CXX_FLAGS_NOFUZZ} -fsanitize=fuzzer-no-link")
unset(DUMMY_MAIN)
endif()
# Needed by LLVM's CMake checks because this file defines multiple targets.
set(LLVM_OPTIONAL_SOURCES
ClangFuzzer.cpp
ClangObjectiveCFuzzer.cpp
DummyClangFuzzer.cpp
ExampleClangProtoFuzzer.cpp
ExampleClangLoopProtoFuzzer.cpp
ExampleClangLLVMProtoFuzzer.cpp
)
if(CLANG_ENABLE_PROTO_FUZZER)
# Create protobuf .h and .cc files, and put them in a library for use by
# clang-proto-fuzzer components.
find_package(Protobuf REQUIRED)
add_definitions(-DGOOGLE_PROTOBUF_NO_RTTI)
include_directories(${PROTOBUF_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS cxx_proto.proto)
protobuf_generate_cpp(LOOP_PROTO_SRCS LOOP_PROTO_HDRS cxx_loop_proto.proto)
set(LLVM_OPTIONAL_SOURCES ${LLVM_OPTIONAL_SOURCES} ${PROTO_SRCS})
add_clang_library(clangCXXProto
${PROTO_SRCS}
${PROTO_HDRS}
LINK_LIBS
${PROTOBUF_LIBRARIES}
)
add_clang_library(clangCXXLoopProto
${LOOP_PROTO_SRCS}
${LOOP_PROTO_HDRS}
LINK_LIBS
${PROTOBUF_LIBRARIES}
)
# Build and include libprotobuf-mutator
include(ProtobufMutator)
include_directories(${ProtobufMutator_INCLUDE_DIRS})
# Build the protobuf->C++ translation library and driver.
add_clang_subdirectory(proto-to-cxx)
# Build the protobuf->LLVM IR translation library and driver.
add_clang_subdirectory(proto-to-llvm)
# Build the fuzzer initialization library.
add_clang_subdirectory(fuzzer-initialize)
# Build the protobuf fuzzer
add_clang_executable(clang-proto-fuzzer
${DUMMY_MAIN}
ExampleClangProtoFuzzer.cpp
)
# Build the loop protobuf fuzzer
add_clang_executable(clang-loop-proto-fuzzer
${DUMMY_MAIN}
ExampleClangLoopProtoFuzzer.cpp
)
# Build the llvm protobuf fuzzer
add_clang_executable(clang-llvm-proto-fuzzer
${DUMMY_MAIN}
ExampleClangLLVMProtoFuzzer.cpp
)
set(COMMON_PROTO_FUZZ_LIBRARIES
${ProtobufMutator_LIBRARIES}
${PROTOBUF_LIBRARIES}
${LLVM_LIB_FUZZING_ENGINE}
clangFuzzerInitialize
)
target_link_libraries(clang-proto-fuzzer
PRIVATE
${COMMON_PROTO_FUZZ_LIBRARIES}
clangHandleCXX
clangCXXProto
clangProtoToCXX
)
target_link_libraries(clang-loop-proto-fuzzer
PRIVATE
${COMMON_PROTO_FUZZ_LIBRARIES}
clangHandleCXX
clangCXXLoopProto
clangLoopProtoToCXX
)
target_link_libraries(clang-llvm-proto-fuzzer
PRIVATE
${COMMON_PROTO_FUZZ_LIBRARIES}
clangHandleLLVM
clangCXXLoopProto
clangLoopProtoToLLVM
)
endif()
add_clang_subdirectory(handle-cxx)
add_clang_subdirectory(handle-llvm)
add_clang_subdirectory(dictionary)
add_clang_executable(clang-fuzzer
EXCLUDE_FROM_ALL
${DUMMY_MAIN}
ClangFuzzer.cpp
DEPENDS
ClangDriverOptions
)
target_link_libraries(clang-fuzzer
PRIVATE
${LLVM_LIB_FUZZING_ENGINE}
clangHandleCXX
)
add_clang_executable(clang-objc-fuzzer
EXCLUDE_FROM_ALL
${DUMMY_MAIN}
ClangObjectiveCFuzzer.cpp
DEPENDS
ClangDriverOptions
)
target_link_libraries(clang-objc-fuzzer
PRIVATE
${LLVM_LIB_FUZZING_ENGINE}
clangHandleCXX
)