1set(LLVM_LINK_COMPONENTS ${LLVM_TARGETS_TO_BUILD} FuzzMutate)
2set(CXX_FLAGS_NOFUZZ ${CMAKE_CXX_FLAGS})
3set(DUMMY_MAIN DummyClangFuzzer.cpp)
4if(LLVM_LIB_FUZZING_ENGINE)
5  unset(DUMMY_MAIN)
6elseif(LLVM_USE_SANITIZE_COVERAGE)
7  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer")
8  set(CXX_FLAGS_NOFUZZ "${CXX_FLAGS_NOFUZZ} -fsanitize=fuzzer-no-link")
9  unset(DUMMY_MAIN)
10endif()
11
12# Needed by LLVM's CMake checks because this file defines multiple targets.
13set(LLVM_OPTIONAL_SOURCES
14  ClangFuzzer.cpp
15  ClangObjectiveCFuzzer.cpp
16  DummyClangFuzzer.cpp
17  ExampleClangProtoFuzzer.cpp
18  ExampleClangLoopProtoFuzzer.cpp
19  ExampleClangLLVMProtoFuzzer.cpp
20  )
21
22if(CLANG_ENABLE_PROTO_FUZZER)
23  # Create protobuf .h and .cc files, and put them in a library for use by
24  # clang-proto-fuzzer components.
25  find_package(Protobuf REQUIRED)
26  add_definitions(-DGOOGLE_PROTOBUF_NO_RTTI)
27  include_directories(${PROTOBUF_INCLUDE_DIRS})
28  include_directories(${CMAKE_CURRENT_BINARY_DIR})
29  protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS cxx_proto.proto)
30  protobuf_generate_cpp(LOOP_PROTO_SRCS LOOP_PROTO_HDRS cxx_loop_proto.proto)
31  set(LLVM_OPTIONAL_SOURCES ${LLVM_OPTIONAL_SOURCES} ${PROTO_SRCS})
32  add_clang_library(clangCXXProto
33    ${PROTO_SRCS}
34    ${PROTO_HDRS}
35
36    LINK_LIBS
37    ${PROTOBUF_LIBRARIES}
38    )
39
40  add_clang_library(clangCXXLoopProto
41    ${LOOP_PROTO_SRCS}
42    ${LOOP_PROTO_HDRS}
43
44    LINK_LIBS
45    ${PROTOBUF_LIBRARIES}
46    )
47
48  # Build and include libprotobuf-mutator
49  include(ProtobufMutator)
50  include_directories(${ProtobufMutator_INCLUDE_DIRS})
51
52  # Build the protobuf->C++ translation library and driver.
53  add_clang_subdirectory(proto-to-cxx)
54
55  # Build the protobuf->LLVM IR translation library and driver.
56  add_clang_subdirectory(proto-to-llvm)
57
58  # Build the fuzzer initialization library.
59  add_clang_subdirectory(fuzzer-initialize)
60
61  # Build the protobuf fuzzer
62  add_clang_executable(clang-proto-fuzzer
63    ${DUMMY_MAIN}
64    ExampleClangProtoFuzzer.cpp
65    )
66
67  # Build the loop protobuf fuzzer
68  add_clang_executable(clang-loop-proto-fuzzer
69    ${DUMMY_MAIN}
70    ExampleClangLoopProtoFuzzer.cpp
71    )
72
73  # Build the llvm protobuf fuzzer
74  add_clang_executable(clang-llvm-proto-fuzzer
75    ${DUMMY_MAIN}
76    ExampleClangLLVMProtoFuzzer.cpp
77    )
78
79  set(COMMON_PROTO_FUZZ_LIBRARIES
80    ${ProtobufMutator_LIBRARIES}
81    ${PROTOBUF_LIBRARIES}
82    ${LLVM_LIB_FUZZING_ENGINE}
83    clangFuzzerInitialize
84    )
85
86  target_link_libraries(clang-proto-fuzzer
87    PRIVATE
88    ${COMMON_PROTO_FUZZ_LIBRARIES}
89    clangHandleCXX
90    clangCXXProto
91    clangProtoToCXX
92    )
93  target_link_libraries(clang-loop-proto-fuzzer
94    PRIVATE
95    ${COMMON_PROTO_FUZZ_LIBRARIES}
96    clangHandleCXX
97    clangCXXLoopProto
98    clangLoopProtoToCXX
99    )
100  target_link_libraries(clang-llvm-proto-fuzzer
101    PRIVATE
102    ${COMMON_PROTO_FUZZ_LIBRARIES}
103    clangHandleLLVM
104    clangCXXLoopProto
105    clangLoopProtoToLLVM
106    )
107
108endif()
109
110add_clang_subdirectory(handle-cxx)
111add_clang_subdirectory(handle-llvm)
112
113add_clang_executable(clang-fuzzer
114  EXCLUDE_FROM_ALL
115  ${DUMMY_MAIN}
116  ClangFuzzer.cpp
117  )
118
119target_link_libraries(clang-fuzzer
120  PRIVATE
121  ${LLVM_LIB_FUZZING_ENGINE}
122  clangHandleCXX
123  )
124
125add_clang_executable(clang-objc-fuzzer
126  EXCLUDE_FROM_ALL
127  ${DUMMY_MAIN}
128  ClangObjectiveCFuzzer.cpp
129  )
130
131target_link_libraries(clang-objc-fuzzer
132  PRIVATE
133  ${LLVM_LIB_FUZZING_ENGINE}
134  clangHandleCXX
135  )
136