1fd4e5da5Sopenharmony_ci# Copyright (c) 2021 Google LLC
2fd4e5da5Sopenharmony_ci#
3fd4e5da5Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
4fd4e5da5Sopenharmony_ci# you may not use this file except in compliance with the License.
5fd4e5da5Sopenharmony_ci# You may obtain a copy of the License at
6fd4e5da5Sopenharmony_ci#
7fd4e5da5Sopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
8fd4e5da5Sopenharmony_ci#
9fd4e5da5Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
10fd4e5da5Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
11fd4e5da5Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fd4e5da5Sopenharmony_ci# See the License for the specific language governing permissions and
13fd4e5da5Sopenharmony_ci# limitations under the License.
14fd4e5da5Sopenharmony_ci
15fd4e5da5Sopenharmony_cifunction(add_spvtools_libfuzzer_target)
16fd4e5da5Sopenharmony_ci  set(one_value_args TARGET)
17fd4e5da5Sopenharmony_ci  set(multi_value_args SRCS LIBS)
18fd4e5da5Sopenharmony_ci  cmake_parse_arguments(
19fd4e5da5Sopenharmony_ci    ARG "" "${one_value_args}" "${multi_value_args}" ${ARGN})
20fd4e5da5Sopenharmony_ci
21fd4e5da5Sopenharmony_ci  add_executable(${ARG_TARGET} ${ARG_SRCS})
22fd4e5da5Sopenharmony_ci  spvtools_default_compile_options(${ARG_TARGET})
23fd4e5da5Sopenharmony_ci  target_link_libraries(${ARG_TARGET} PRIVATE ${ARG_LIBS})
24fd4e5da5Sopenharmony_ci  target_include_directories(${ARG_TARGET} PRIVATE
25fd4e5da5Sopenharmony_ci    ${spirv-tools_SOURCE_DIR}
26fd4e5da5Sopenharmony_ci    ${spirv-tools_BINARY_DIR}
27fd4e5da5Sopenharmony_ci  )
28fd4e5da5Sopenharmony_ci  set_property(TARGET ${ARG_TARGET} PROPERTY FOLDER "SPIRV-Tools libFuzzer targets")
29fd4e5da5Sopenharmony_ci  if(NOT ${SPIRV_LIB_FUZZING_ENGINE_LINK_OPTIONS} STREQUAL "")
30fd4e5da5Sopenharmony_ci    # This is set when the fuzzers are being built by OSS-Fuzz. In this case the
31fd4e5da5Sopenharmony_ci    # variable provides the necessary linker flags, and OSS-Fuzz will take care
32fd4e5da5Sopenharmony_ci    # of passing suitable compiler flags.
33fd4e5da5Sopenharmony_ci    target_link_options(${ARG_TARGET} PRIVATE ${SPIRV_LIB_FUZZING_ENGINE_LINK_OPTIONS})
34fd4e5da5Sopenharmony_ci  else()
35fd4e5da5Sopenharmony_ci    # When the fuzzers are being built outside of OSS-Fuzz, standard libFuzzer
36fd4e5da5Sopenharmony_ci    # arguments to enable fuzzing are used.
37fd4e5da5Sopenharmony_ci    target_compile_options(${ARG_TARGET} PRIVATE "-fsanitize=fuzzer")
38fd4e5da5Sopenharmony_ci    target_link_options(${ARG_TARGET} PRIVATE "-fsanitize=fuzzer")    
39fd4e5da5Sopenharmony_ci  endif()
40fd4e5da5Sopenharmony_ciendfunction()
41fd4e5da5Sopenharmony_ci
42fd4e5da5Sopenharmony_ciif (${SPIRV_BUILD_LIBFUZZER_TARGETS})
43fd4e5da5Sopenharmony_ci  if(NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
44fd4e5da5Sopenharmony_ci    message(FATAL_ERROR "The libFuzzer targets are only supported with the Clang compiler. Compiler '${CMAKE_CXX_COMPILER_ID}' is not supported!")
45fd4e5da5Sopenharmony_ci  endif()
46fd4e5da5Sopenharmony_ci  add_spvtools_libfuzzer_target(TARGET spvtools_as_fuzzer SRCS spvtools_as_fuzzer.cpp random_generator.cpp LIBS ${SPIRV_TOOLS_FULL_VISIBILITY})
47fd4e5da5Sopenharmony_ci  add_spvtools_libfuzzer_target(TARGET spvtools_binary_parser_fuzzer SRCS spvtools_binary_parser_fuzzer.cpp random_generator.cpp LIBS ${SPIRV_TOOLS_FULL_VISIBILITY})
48fd4e5da5Sopenharmony_ci  add_spvtools_libfuzzer_target(TARGET spvtools_dis_fuzzer SRCS spvtools_dis_fuzzer.cpp random_generator.cpp LIBS ${SPIRV_TOOLS_FULL_VISIBILITY})
49fd4e5da5Sopenharmony_ci  add_spvtools_libfuzzer_target(TARGET spvtools_opt_legalization_fuzzer SRCS spvtools_opt_legalization_fuzzer.cpp spvtools_opt_fuzzer_common.cpp random_generator.cpp LIBS SPIRV-Tools-opt ${SPIRV_TOOLS_FULL_VISIBILITY})
50fd4e5da5Sopenharmony_ci  add_spvtools_libfuzzer_target(TARGET spvtools_opt_performance_fuzzer SRCS spvtools_opt_performance_fuzzer.cpp spvtools_opt_fuzzer_common.cpp random_generator.cpp LIBS SPIRV-Tools-opt ${SPIRV_TOOLS_FULL_VISIBILITY})
51fd4e5da5Sopenharmony_ci  add_spvtools_libfuzzer_target(TARGET spvtools_opt_size_fuzzer SRCS spvtools_opt_size_fuzzer.cpp spvtools_opt_fuzzer_common.cpp random_generator.cpp LIBS SPIRV-Tools-opt ${SPIRV_TOOLS_FULL_VISIBILITY})
52fd4e5da5Sopenharmony_ci  add_spvtools_libfuzzer_target(TARGET spvtools_val_fuzzer SRCS spvtools_val_fuzzer.cpp random_generator.cpp LIBS ${SPIRV_TOOLS_FULL_VISIBILITY})
53fd4e5da5Sopenharmony_ci  if (${SPIRV_BUILD_FUZZER})
54fd4e5da5Sopenharmony_ci    add_spvtools_libfuzzer_target(TARGET spvtools_fuzz_fuzzer SRCS spvtools_fuzz_fuzzer.cpp random_generator.cpp LIBS SPIRV-Tools-fuzz ${SPIRV_TOOLS_FULL_VISIBILITY})
55fd4e5da5Sopenharmony_ci  endif()
56fd4e5da5Sopenharmony_ciendif()
57