1*f6aab3d8Srobertif(CLANG_ENABLE_PROTO_FUZZER) 2*f6aab3d8Srobert set(LLVM_LINK_COMPONENTS 3*f6aab3d8Srobert Support 4*f6aab3d8Srobert ) 5*f6aab3d8Srobert 6*f6aab3d8Srobert add_llvm_fuzzer(lldb-expression-fuzzer 7*f6aab3d8Srobert EXCLUDE_FROM_ALL 8*f6aab3d8Srobert lldb-expression-fuzzer.cpp 9*f6aab3d8Srobert ) 10*f6aab3d8Srobert 11*f6aab3d8Srobert if(TARGET lldb-expression-fuzzer) 12*f6aab3d8Srobert target_include_directories(lldb-expression-fuzzer PRIVATE ..) 13*f6aab3d8Srobert find_package(Protobuf REQUIRED) 14*f6aab3d8Srobert add_definitions(-DGOOGLE_PROTOBUF_NO_RTTI) 15*f6aab3d8Srobert include_directories(${PROTOBUF_INCLUDE_DIRS}) 16*f6aab3d8Srobert include_directories(${CMAKE_CURRENT_BINARY_DIR}/../../../../clang/tools/clang-fuzzer PRIVATE ..) 17*f6aab3d8Srobert include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../../clang/tools/clang-fuzzer) 18*f6aab3d8Srobert 19*f6aab3d8Srobert set(CLANG_CMAKE_MODULE_PATH 20*f6aab3d8Srobert ${CMAKE_CURRENT_SOURCE_DIR}/../../../../clang/cmake/modules) 21*f6aab3d8Srobert 22*f6aab3d8Srobert set(CMAKE_MODULE_PATH 23*f6aab3d8Srobert ${CMAKE_MODULE_PATH} 24*f6aab3d8Srobert ${CLANG_CMAKE_MODULE_PATH}) 25*f6aab3d8Srobert 26*f6aab3d8Srobert 27*f6aab3d8Srobert set (PBM_PREFIX lldb_protobuf_mutator) 28*f6aab3d8Srobert include(ProtobufMutator) 29*f6aab3d8Srobert include_directories(${ProtobufMutator_INCLUDE_DIRS}) 30*f6aab3d8Srobert 31*f6aab3d8Srobert target_link_libraries(lldb-expression-fuzzer 32*f6aab3d8Srobert PRIVATE 33*f6aab3d8Srobert ${ProtobufMutator_LIBRARIES} 34*f6aab3d8Srobert ${LLVM_LIB_FUZZING_ENGINE} 35*f6aab3d8Srobert clangHandleCXX 36*f6aab3d8Srobert clangCXXProto 37*f6aab3d8Srobert clangProtoToCXX 38*f6aab3d8Srobert liblldb 39*f6aab3d8Srobert ) 40*f6aab3d8Srobert 41*f6aab3d8Srobert add_custom_command(TARGET lldb-expression-fuzzer PRE_BUILD 42*f6aab3d8Srobert COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/fuzzer-artifacts/expression-artifacts 43*f6aab3d8Srobert # Create and compile a simple C program using the command line. This is 44*f6aab3d8Srobert # needed because LLDB's expression evaluator needs a legitmate target 45*f6aab3d8Srobert # instead of a dummy target 46*f6aab3d8Srobert COMMAND echo 'int main (int argc, char** argv) { return 0\; }' | clang -o main.out -xc - 47*f6aab3d8Srobert ) 48*f6aab3d8Srobert 49*f6aab3d8Srobert # Create a directory for storing the fuzzer's artifacts and run the fuzzer with arguments that will 50*f6aab3d8Srobert # not attempt to reduce the size of the inputs being generated 51*f6aab3d8Srobert # Also set the executable that's created above as an environment variable for the 52*f6aab3d8Srobert # source code to use 53*f6aab3d8Srobert add_custom_target(fuzz-lldb-expression 54*f6aab3d8Srobert COMMENT "Running the LLDB expression evaluator fuzzer..." 55*f6aab3d8Srobert WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/fuzzer-artifacts/expression-artifacts 56*f6aab3d8Srobert COMMAND ${CMAKE_COMMAND} -E env LLDB_FUZZER_TARGET=${CMAKE_CURRENT_BINARY_DIR}/main.out $<TARGET_FILE:lldb-expression-fuzzer> -artifact_prefix=expression- -reduce_inputs=0 57*f6aab3d8Srobert USES_TERMINAL 58*f6aab3d8Srobert ) 59*f6aab3d8Srobert endif() 60*f6aab3d8Srobertendif() 61