Index: clang/tools/clang-fuzzer/CMakeLists.txt =================================================================== --- clang/tools/clang-fuzzer/CMakeLists.txt +++ clang/tools/clang-fuzzer/CMakeLists.txt @@ -1,60 +1,65 @@ -if( LLVM_USE_SANITIZE_COVERAGE ) - set(LLVM_LINK_COMPONENTS ${LLVM_TARGETS_TO_BUILD}) - set(CXX_FLAGS_NOFUZZ ${CMAKE_CXX_FLAGS}) +set(LLVM_LINK_COMPONENTS ${LLVM_TARGETS_TO_BUILD} FuzzMutate) +set(CXX_FLAGS_NOFUZZ ${CMAKE_CXX_FLAGS}) +set(DUMMY_MAIN DummyClangFuzzer.cpp) +if(LLVM_USE_SANITIZE_COVERAGE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer") + unset(DUMMY_MAIN) +endif() + +# Hack to bypass LLVM's cmake sources check and allow multiple libraries and +# executables from this directory. +set(LLVM_OPTIONAL_SOURCES + ClangFuzzer.cpp + DummyClangFuzzer.cpp + ExampleClangProtoFuzzer.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) + set(LLVM_OPTIONAL_SOURCES ${LLVM_OPTIONAL_SOURCES} ${PROTO_SRCS}) + add_clang_library(clangCXXProto + ${PROTO_SRCS} + ${PROTO_HDRS} + + LINK_LIBS + ${PROTOBUF_LIBRARIES} + ) - 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) - # Hack to bypass LLVM's cmake sources check and allow multiple libraries and - # executables from this directory. - set(LLVM_OPTIONAL_SOURCES - ClangFuzzer.cpp - ExampleClangProtoFuzzer.cpp - ${PROTO_SRCS} - ) - add_clang_library(clangCXXProto - ${PROTO_SRCS} - ${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 fuzzer - add_clang_executable(clang-proto-fuzzer ExampleClangProtoFuzzer.cpp) - target_link_libraries(clang-proto-fuzzer - ${ProtobufMutator_LIBRARIES} - clangCXXProto - clangHandleCXX - clangProtoToCXX - ) - else() - # Hack to bypass LLVM's cmake sources check and allow multiple libraries and - # executables from this directory. - set(LLVM_OPTIONAL_SOURCES ClangFuzzer.cpp ExampleClangProtoFuzzer.cpp) - endif() - - add_clang_subdirectory(handle-cxx) - - add_clang_executable(clang-fuzzer - EXCLUDE_FROM_ALL - ClangFuzzer.cpp + # 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 fuzzer + add_clang_executable(clang-proto-fuzzer + ${DUMMY_MAIN} + ExampleClangProtoFuzzer.cpp ) - target_link_libraries(clang-fuzzer + target_link_libraries(clang-proto-fuzzer + ${ProtobufMutator_LIBRARIES} + clangCXXProto clangHandleCXX + clangProtoToCXX ) endif() + +add_clang_subdirectory(handle-cxx) + +add_clang_executable(clang-fuzzer + EXCLUDE_FROM_ALL + ${DUMMY_MAIN} + ClangFuzzer.cpp + ) + +target_link_libraries(clang-fuzzer + clangHandleCXX + ) Index: clang/tools/clang-fuzzer/ClangFuzzer.cpp =================================================================== --- clang/tools/clang-fuzzer/ClangFuzzer.cpp +++ clang/tools/clang-fuzzer/ClangFuzzer.cpp @@ -17,6 +17,8 @@ using namespace clang_fuzzer; +extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) { return 0; } + extern "C" int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) { std::string s((const char *)data, size); HandleCXX(s, {"-O2"}); Index: clang/tools/clang-fuzzer/DummyClangFuzzer.cpp =================================================================== --- /dev/null +++ clang/tools/clang-fuzzer/DummyClangFuzzer.cpp @@ -0,0 +1,21 @@ +//===-- DummyClangFuzzer.cpp - Entry point to sanity check fuzzers --------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Provides a main() to build without linking libFuzzer. +// +//===----------------------------------------------------------------------===// +#include "llvm/FuzzMutate/FuzzerCLI.h" + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); +extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv); + +int main(int argc, char *argv[]) { + return llvm::runFuzzerOnInputs(argc, argv, LLVMFuzzerTestOneInput, + LLVMFuzzerInitialize); +}