Index: lib/Fuzzer/test/CMakeLists.txt =================================================================== --- lib/Fuzzer/test/CMakeLists.txt +++ lib/Fuzzer/test/CMakeLists.txt @@ -27,13 +27,53 @@ # Enable the coverage instrumentation (it is disabled for the Fuzzer lib). set(CMAKE_CXX_FLAGS "${LIBFUZZER_FLAGS_BASE} -fsanitize-coverage=edge,indirect-calls") -set(DFSanTests - MemcmpTest - SimpleCmpTest - StrcmpTest - StrncmpTest - SwitchTest - ) +# add_libfuzzer_test( +# [NO_MAIN] +# SOURCES source0.cpp [source1.cpp ...] +# ) +# +# Declares a LibFuzzer test executable with target name LLVMFuzzer-. +# +# If NO_MAIN is specified the test is linked against the LibFuzzer +# library without a main() function, otherwise it is linked against +# the LibFuzzer library with a main() function. +# +# One or more source files to be compiled into the binary must be declared +# after the SOURCES keyword. +function(add_libfuzzer_test name) + set(options "NO_MAIN") + set(multi_arg_options "SOURCES") + cmake_parse_arguments( + "add_libfuzzer_test" "${options}" "" "${multi_arg_options}" ${ARGN}) + if ("${add_libfuzzer_test_SOURCES}" STREQUAL "") + message(FATAL_ERROR "Source files must be specified") + endif() + add_executable(LLVMFuzzer-${name} + ${add_libfuzzer_test_SOURCES} + ) + if (add_libfuzzer_test_NO_MAIN) + target_link_libraries(LLVMFuzzer-${name} + LLVMFuzzerNoMain + ) + else() + target_link_libraries(LLVMFuzzer-${name} + LLVMFuzzer + ) + endif() + # Place binary where llvm-lit expects to find it + set_target_properties(LLVMFuzzer-${name} + PROPERTIES RUNTIME_OUTPUT_DIRECTORY + "${CMAKE_BINARY_DIR}/lib/Fuzzer/test" + ) + set(TestBinaries ${TestBinaries} LLVMFuzzer-${name} PARENT_SCOPE) +endfunction() + +# Variable to keep track of all test targets +set(TestBinaries) + +############################################################################### +# Basic tests +############################################################################### set(Tests AccumulateAllocationsTest @@ -66,66 +106,29 @@ TimeoutTest ) -set(CustomMainTests - ) - -set(UninstrumentedTests - UninstrumentedTest - ) - -set(TraceBBTests - SimpleTest - ) - -set(TracePCTests - FourIndependentBranchesTest - FullCoverageSetTest - ) - -set(UbsanTests - SignedIntOverflowTest - ) - -set(TestBinaries) - foreach(Test ${Tests}) - add_executable(LLVMFuzzer-${Test} - ${Test}.cpp - ) - target_link_libraries(LLVMFuzzer-${Test} - LLVMFuzzer - ) - set(TestBinaries ${TestBinaries} LLVMFuzzer-${Test}) -endforeach() - -foreach(Test ${CustomMainTests}) - add_executable(LLVMFuzzer-${Test} - ${Test}.cpp - ) - target_link_libraries(LLVMFuzzer-${Test} - LLVMFuzzerNoMain - ) - set(TestBinaries ${TestBinaries} LLVMFuzzer-${Test}) + add_libfuzzer_test(${Test} SOURCES ${Test}.cpp) endforeach() +############################################################################### +# Basic custom main function tests +############################################################################### -configure_lit_site_cfg( - ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in - ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg +set(CustomMainTests ) -configure_lit_site_cfg( - ${CMAKE_CURRENT_SOURCE_DIR}/unit/lit.site.cfg.in - ${CMAKE_CURRENT_BINARY_DIR}/unit/lit.site.cfg - ) +foreach(Test ${CustomMainTests}) + add_libfuzzer_test(${Test} NO_MAIN SOURCES ${Test}.cpp) +endforeach() -include_directories(..) -include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include) +############################################################################### +# Unit tests +############################################################################### -add_executable(LLVMFuzzer-Unittest +add_libfuzzer_test(Unittest NO_MAIN + SOURCES FuzzerUnittest.cpp FuzzerFnAdapterUnittest.cpp - $ ) target_link_libraries(LLVMFuzzer-Unittest @@ -133,40 +136,36 @@ gtest_main ) -set(TestBinaries ${TestBinaries} LLVMFuzzer-Unittest) - -add_subdirectory(dfsan) +target_include_directories(LLVMFuzzer-Unittest PRIVATE + "${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include" + ) -foreach(Test ${DFSanTests}) - set(TestBinaries ${TestBinaries} LLVMFuzzer-${Test}-DFSan) -endforeach() +############################################################################### +# Additional tests +############################################################################### +include_directories(..) +add_subdirectory(dfsan) add_subdirectory(uninstrumented) - -foreach(Test ${UninstrumentedTests}) - set(TestBinaries ${TestBinaries} LLVMFuzzer-${Test}-Uninstrumented) -endforeach() - add_subdirectory(ubsan) - -foreach(Test ${UbsanTests}) - set(TestBinaries ${TestBinaries} LLVMFuzzer-${Test}-Ubsan) -endforeach() - add_subdirectory(trace-bb) - -foreach(Test ${TraceBBTests}) - set(TestBinaries ${TestBinaries} LLVMFuzzer-${Test}-TraceBB) -endforeach() - add_subdirectory(trace-pc) -foreach(Test ${TracePCTests}) - set(TestBinaries ${TestBinaries} LLVMFuzzer-${Test}-TracePC) -endforeach() +############################################################################### +# Configure lit to run the tests +# +# Note this is done after declaring all tests so we can inform lit if any tests +# need to be disabled. +############################################################################### -set_target_properties(${TestBinaries} - PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +configure_lit_site_cfg( + ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in + ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg + ) + +configure_lit_site_cfg( + ${CMAKE_CURRENT_SOURCE_DIR}/unit/lit.site.cfg.in + ${CMAKE_CURRENT_BINARY_DIR}/unit/lit.site.cfg ) add_lit_testsuite(check-fuzzer "Running Fuzzer tests" Index: lib/Fuzzer/test/dfsan/CMakeLists.txt =================================================================== --- lib/Fuzzer/test/dfsan/CMakeLists.txt +++ lib/Fuzzer/test/dfsan/CMakeLists.txt @@ -3,12 +3,17 @@ set(CMAKE_CXX_FLAGS "${LIBFUZZER_FLAGS_BASE} -fno-sanitize=all -fsanitize=dataflow") +set(DFSanTests + MemcmpTest + SimpleCmpTest + StrcmpTest + StrncmpTest + SwitchTest + ) + foreach(Test ${DFSanTests}) - add_executable(LLVMFuzzer-${Test}-DFSan - ../${Test}.cpp - ) - target_link_libraries(LLVMFuzzer-${Test}-DFSan - LLVMFuzzer - ) + add_libfuzzer_test(${Test}-DFSan SOURCES ../${Test}.cpp) endforeach() +# Propagate value into parent directory +set(TestBinaries ${TestBinaries} PARENT_SCOPE) Index: lib/Fuzzer/test/trace-bb/CMakeLists.txt =================================================================== --- lib/Fuzzer/test/trace-bb/CMakeLists.txt +++ lib/Fuzzer/test/trace-bb/CMakeLists.txt @@ -3,12 +3,13 @@ set(CMAKE_CXX_FLAGS "${LIBFUZZER_FLAGS_BASE} -fsanitize-coverage=edge,trace-bb") +set(TraceBBTests + SimpleTest + ) + foreach(Test ${TraceBBTests}) - add_executable(LLVMFuzzer-${Test}-TraceBB - ../${Test}.cpp - ) - target_link_libraries(LLVMFuzzer-${Test}-TraceBB - LLVMFuzzer - ) + add_libfuzzer_test(${Test}-TraceBB SOURCES ../${Test}.cpp) endforeach() +# Propagate value into parent directory +set(TestBinaries ${TestBinaries} PARENT_SCOPE) Index: lib/Fuzzer/test/trace-pc/CMakeLists.txt =================================================================== --- lib/Fuzzer/test/trace-pc/CMakeLists.txt +++ lib/Fuzzer/test/trace-pc/CMakeLists.txt @@ -3,12 +3,14 @@ set(CMAKE_CXX_FLAGS "${LIBFUZZER_FLAGS_BASE} -fno-sanitize-coverage=8bit-counters -fsanitize-coverage=trace-pc") +set(TracePCTests + FourIndependentBranchesTest + FullCoverageSetTest + ) + foreach(Test ${TracePCTests}) - add_executable(LLVMFuzzer-${Test}-TracePC - ../${Test}.cpp - ) - target_link_libraries(LLVMFuzzer-${Test}-TracePC - LLVMFuzzer - ) + add_libfuzzer_test(${Test}-TracePC SOURCES ../${Test}.cpp) endforeach() +# Propagate value into parent directory +set(TestBinaries ${TestBinaries} PARENT_SCOPE) Index: lib/Fuzzer/test/ubsan/CMakeLists.txt =================================================================== --- lib/Fuzzer/test/ubsan/CMakeLists.txt +++ lib/Fuzzer/test/ubsan/CMakeLists.txt @@ -3,12 +3,13 @@ set(CMAKE_CXX_FLAGS "${LIBFUZZER_FLAGS_BASE} -fsanitize=undefined -fno-sanitize-recover=all") +set(UbsanTests + SignedIntOverflowTest + ) + foreach(Test ${UbsanTests}) - add_executable(LLVMFuzzer-${Test}-Ubsan - ../${Test}.cpp - ) - target_link_libraries(LLVMFuzzer-${Test}-Ubsan - LLVMFuzzer - ) + add_libfuzzer_test(${Test}-Ubsan SOURCES ../${Test}.cpp) endforeach() +# Propagate value into parent directory +set(TestBinaries ${TestBinaries} PARENT_SCOPE) Index: lib/Fuzzer/test/uninstrumented/CMakeLists.txt =================================================================== --- lib/Fuzzer/test/uninstrumented/CMakeLists.txt +++ lib/Fuzzer/test/uninstrumented/CMakeLists.txt @@ -3,12 +3,13 @@ set(CMAKE_CXX_FLAGS "${LIBFUZZER_FLAGS_BASE} -fno-sanitize=all -fno-sanitize-coverage=edge,trace-cmp,indirect-calls,8bit-counters") +set(UninstrumentedTests + UninstrumentedTest + ) + foreach(Test ${UninstrumentedTests}) - add_executable(LLVMFuzzer-${Test}-Uninstrumented - ../${Test}.cpp - ) - target_link_libraries(LLVMFuzzer-${Test}-Uninstrumented - LLVMFuzzer - ) + add_libfuzzer_test(${Test}-Uninstrumented SOURCES ../${Test}.cpp) endforeach() +# Propagate value into parent directory +set(TestBinaries ${TestBinaries} PARENT_SCOPE)