[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
morehouse created this revision. Herald added a subscriber: mgorny. Build with DummyClangFuzzer.cpp as entry point when coverage instrumentation isn't present. https://reviews.llvm.org/D38642 Files: clang/tools/clang-fuzzer/CMakeLists.txt clang/tools/clang-fuzzer/ClangFuzzer.cpp clang/tools/clang-fuzzer/DummyClangFuzzer.cpp 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); +} 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/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) + includ
[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
kcc added a comment. It's not about coverage instrumentation (not) being present, but about libFuzzer's main() being present, right? Will we be able to reuse some of Justin's code instead of creating one more main() function? Or, why not link with libFuzzer (-fsanitize=fuzzer at link time) even if we don't us einstrumentation at compile time? https://reviews.llvm.org/D38642 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
morehouse added a comment. In https://reviews.llvm.org/D38642#890963, @kcc wrote: > It's not about coverage instrumentation (not) being present, but about > libFuzzer's main() being present, right? Yes. > Will we be able to reuse some of Justin's code instead of creating one more > main() function? This reuses the code that Justin moved to FuzzMutate/FuzzerCLI. That's why the main is so short. But perhaps we could move the main itself into FuzzerCLI? > Or, why not link with libFuzzer (-fsanitize=fuzzer at link time) even if we > don't us einstrumentation at compile time? When I tried this, I got undefined references to all kinds of `__sanitizer_cov_*` symbols. https://reviews.llvm.org/D38642 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
kcc added a comment. >> Will we be able to reuse some of Justin's code instead of creating one more >> main() function? > > This reuses the code that Justin moved to FuzzMutate/FuzzerCLI. That's why > the main is so short. But perhaps we could move the main itself into > FuzzerCLI? Yes, having one common main makes sense, but see below. >> Or, why not link with libFuzzer (-fsanitize=fuzzer at link time) even if we >> don't us einstrumentation at compile time? > > When I tried this, I got undefined references to all kinds of > `__sanitizer_cov_*` symbols. I'd like to know more. At least simple cases work fine: clang++ ~/llvm/projects/compiler-rt/test/fuzzer/SimpleTest.cpp -std=c++11 -c && clang++ SimpleTest.o -fsanitize=fuzzer https://reviews.llvm.org/D38642 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
morehouse added a comment. In https://reviews.llvm.org/D38642#890969, @kcc wrote: > I'd like to know more. > At least simple cases work fine: You're right. I was trying to add `-fsanitize=fuzzer` to `CMAKE_CXX_FLAGS` right before the link command, which was causing a later compilation to give the error. Setting `CMAKE_EXE_LINKER_FLAGS` seems to work though. This seems simpler and cleaner than the approach @bogner took. https://reviews.llvm.org/D38642 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
kcc added a comment. We often suggest to code owners to implement their own dummy main to run fuzz targets as regression tests. But for ourselves (LLVM) this recommendations makes less sense since libFuzzer is part of LLVM and we can use it's main directly. https://reviews.llvm.org/D38642 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
morehouse updated this revision to Diff 118087. morehouse added a comment. - Remove dummy main and link with -fsantize=fuzzer. https://reviews.llvm.org/D38642 Files: clang/tools/clang-fuzzer/CMakeLists.txt clang/tools/clang-fuzzer/proto-to-cxx/CMakeLists.txt Index: clang/tools/clang-fuzzer/proto-to-cxx/CMakeLists.txt === --- clang/tools/clang-fuzzer/proto-to-cxx/CMakeLists.txt +++ clang/tools/clang-fuzzer/proto-to-cxx/CMakeLists.txt @@ -1,5 +1,6 @@ set(LLVM_LINK_COMPONENTS ${LLVM_TARGETS_TO_BUILD}) set(CMAKE_CXX_FLAGS ${CXX_FLAGS_NOFUZZ}) +set(CMAKE_EXE_LINKER_FLAGS ${EXE_LINKER_FLAGS_NOFUZZ}) # Hack to bypass LLVM's CMake source checks so we can have both a library and # an executable built from this directory. Index: clang/tools/clang-fuzzer/CMakeLists.txt === --- clang/tools/clang-fuzzer/CMakeLists.txt +++ clang/tools/clang-fuzzer/CMakeLists.txt @@ -1,60 +1,56 @@ -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}) +set(CXX_FLAGS_NOFUZZ ${CMAKE_CXX_FLAGS}) +set(EXE_LINKER_FLAGS_NOFUZZ ${CMAKE_EXE_LINKER_FLAGS}) +if(LLVM_USE_SANITIZE_COVERAGE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer") - - 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 +endif() +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=fuzzer") + +# 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) + +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} ) - target_link_libraries(clang-fuzzer + # 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 ) endif() + +add_clang_subdirectory(handle-cxx) + +add_clang_executable(clang-fuzzer + EXCLUDE_FROM_ALL + ClangFuzzer.cpp + ) + +target_link_libraries(clang-fuzzer + clangHandleCXX + ) ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
kcc added a comment. grrr. I am sorry, I've just contradicted myself. :( The goal here is to build the fuzz targets always and use them as tests, which includes building with any toolchain, including toolchains that don't support -fsanitize=fuzzer your original change actually solved this. If you can *easily* share main() with the one in LLVM -- do it, otherwise don't bother. https://reviews.llvm.org/D38642 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
morehouse updated this revision to Diff 118097. morehouse added a comment. - Revert "Remove dummy main and link with -fsantize=fuzzer." https://reviews.llvm.org/D38642 Files: clang/tools/clang-fuzzer/CMakeLists.txt clang/tools/clang-fuzzer/ClangFuzzer.cpp clang/tools/clang-fuzzer/DummyClangFuzzer.cpp 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); +} 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/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(${Protobuf
[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
kcc added a reviewer: vitalybuka. kcc added a comment. conceptually ok, but please let Vitaly review the cmake part. https://reviews.llvm.org/D38642 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
morehouse added a comment. In https://reviews.llvm.org/D38642#891074, @kcc wrote: > If you can *easily* share main() with the one in LLVM -- do it, otherwise > don't bother. Does the fuzzer main come from LLVM or compiler-rt now? There's still FuzzerMain.cpp, but I'm not sure if we should be using that or not. https://reviews.llvm.org/D38642 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
kcc added a comment. In https://reviews.llvm.org/D38642#891125, @morehouse wrote: > In https://reviews.llvm.org/D38642#891074, @kcc wrote: > > > If you can *easily* share main() with the one in LLVM -- do it, otherwise > > don't bother. > > > Does the fuzzer main come from LLVM or compiler-rt now? There's still > FuzzerMain.cpp in LLVM, but I'm not sure if we should be using that or not. Don't reuse FuzzerMain.cpp. There is llvm/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp which your main() duplicates, but these are in different projects (llvm vs clang) so perhaps it's ok. https://reviews.llvm.org/D38642 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D38642: [clang-fuzzer] Allow building without coverage instrumentation.
This revision was automatically updated to reflect the committed changes. Closed by commit rL315336: [clang-fuzzer] Allow building without coverage instrumentation. (authored by morehouse). Changed prior to commit: https://reviews.llvm.org/D38642?vs=118097&id=118420#toc Repository: rL LLVM https://reviews.llvm.org/D38642 Files: cfe/trunk/tools/clang-fuzzer/CMakeLists.txt cfe/trunk/tools/clang-fuzzer/ClangFuzzer.cpp cfe/trunk/tools/clang-fuzzer/DummyClangFuzzer.cpp Index: cfe/trunk/tools/clang-fuzzer/CMakeLists.txt === --- cfe/trunk/tools/clang-fuzzer/CMakeLists.txt +++ cfe/trunk/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: cfe/trunk/tools/clang-fuzzer/ClangFuzzer.cpp === --- cfe/trunk/tools/clang-fuzzer/ClangFuzzer.cpp +++ cfe/trunk/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: cfe/trunk/tools/clang-fuzzer/DummyClangFuzzer.cpp === --- cfe/trunk/tools/clang-fuzzer/DummyClangFuzzer.cpp +++ cfe/trunk/tools