# Copyright (c) 2019 Google LLC # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. if(SPIRV_BUILD_FUZZER) file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/protobufs) set(PROTOBUF_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/protobufs/spvtoolsfuzz.proto) set( SPIRV_FUZZ_PROTOC_COMMAND "protobuf::protoc" CACHE STRING "The command to invoke the protobuf compiler (protoc). By default it is the protobufs::protoc CMake target. It should be overridden when cross-compiling, such as for Android.") add_custom_command( OUTPUT protobufs/spvtoolsfuzz.pb.cc protobufs/spvtoolsfuzz.pb.h COMMAND "${SPIRV_FUZZ_PROTOC_COMMAND}" -I=${CMAKE_CURRENT_SOURCE_DIR}/protobufs --cpp_out=protobufs ${PROTOBUF_SOURCE} DEPENDS ${PROTOBUF_SOURCE} COMMENT "Generate protobuf sources from proto definition file." ) set(SPIRV_TOOLS_FUZZ_SOURCES call_graph.h counter_overflow_id_source.h data_descriptor.h equivalence_relation.h fact_manager/constant_uniform_facts.h fact_manager/data_synonym_and_id_equation_facts.h fact_manager/dead_block_facts.h fact_manager/fact_manager.h fact_manager/irrelevant_value_facts.h fact_manager/livesafe_function_facts.h force_render_red.h fuzzer.h fuzzer_context.h fuzzer_pass.h fuzzer_pass_add_access_chains.h fuzzer_pass_add_composite_inserts.h fuzzer_pass_add_composite_types.h fuzzer_pass_add_copy_memory.h fuzzer_pass_add_dead_blocks.h fuzzer_pass_add_dead_breaks.h fuzzer_pass_add_dead_continues.h fuzzer_pass_add_equation_instructions.h fuzzer_pass_add_function_calls.h fuzzer_pass_add_global_variables.h fuzzer_pass_add_image_sample_unused_components.h fuzzer_pass_add_synonyms.h fuzzer_pass_add_loads.h fuzzer_pass_add_local_variables.h fuzzer_pass_add_loop_preheaders.h fuzzer_pass_add_no_contraction_decorations.h fuzzer_pass_add_opphi_synonyms.h fuzzer_pass_add_parameters.h fuzzer_pass_add_relaxed_decorations.h fuzzer_pass_add_stores.h fuzzer_pass_add_vector_shuffle_instructions.h fuzzer_pass_adjust_branch_weights.h fuzzer_pass_adjust_function_controls.h fuzzer_pass_adjust_loop_controls.h fuzzer_pass_adjust_memory_operands_masks.h fuzzer_pass_adjust_selection_controls.h fuzzer_pass_apply_id_synonyms.h fuzzer_pass_construct_composites.h fuzzer_pass_copy_objects.h fuzzer_pass_donate_modules.h fuzzer_pass_inline_functions.h fuzzer_pass_invert_comparison_operators.h fuzzer_pass_interchange_signedness_of_integer_operands.h fuzzer_pass_interchange_zero_like_constants.h fuzzer_pass_make_vector_operations_dynamic.h fuzzer_pass_merge_blocks.h fuzzer_pass_mutate_pointers.h fuzzer_pass_obfuscate_constants.h fuzzer_pass_outline_functions.h fuzzer_pass_permute_blocks.h fuzzer_pass_permute_function_parameters.h fuzzer_pass_permute_instructions.h fuzzer_pass_permute_phi_operands.h fuzzer_pass_propagate_instructions_up.h fuzzer_pass_push_ids_through_variables.h fuzzer_pass_replace_adds_subs_muls_with_carrying_extended.h fuzzer_pass_replace_copy_memories_with_loads_stores.h fuzzer_pass_replace_copy_objects_with_stores_loads.h fuzzer_pass_replace_irrelevant_ids.h fuzzer_pass_replace_linear_algebra_instructions.h fuzzer_pass_replace_loads_stores_with_copy_memories.h fuzzer_pass_replace_opphi_ids_from_dead_predecessors.h fuzzer_pass_replace_opselects_with_conditional_branches.h fuzzer_pass_replace_parameter_with_global.h fuzzer_pass_replace_params_with_struct.h fuzzer_pass_split_blocks.h fuzzer_pass_swap_commutable_operands.h fuzzer_pass_swap_conditional_branch_operands.h fuzzer_pass_toggle_access_chain_instruction.h fuzzer_util.h id_use_descriptor.h instruction_descriptor.h instruction_message.h overflow_id_source.h protobufs/spirvfuzz_protobufs.h pseudo_random_generator.h random_generator.h replayer.h shrinker.h transformation.h transformation_access_chain.h transformation_add_constant_boolean.h transformation_add_constant_composite.h transformation_add_constant_null.h transformation_add_constant_scalar.h transformation_add_copy_memory.h transformation_add_dead_block.h transformation_add_dead_break.h transformation_add_dead_continue.h transformation_add_function.h transformation_add_global_undef.h transformation_add_global_variable.h transformation_add_image_sample_unused_components.h transformation_add_local_variable.h transformation_add_loop_preheader.h transformation_add_no_contraction_decoration.h transformation_add_opphi_synonym.h transformation_add_parameter.h transformation_add_relaxed_decoration.h transformation_add_spec_constant_op.h transformation_add_synonym.h transformation_add_type_array.h transformation_add_type_boolean.h transformation_add_type_float.h transformation_add_type_function.h transformation_add_type_int.h transformation_add_type_matrix.h transformation_add_type_pointer.h transformation_add_type_struct.h transformation_add_type_vector.h transformation_adjust_branch_weights.h transformation_composite_construct.h transformation_composite_extract.h transformation_composite_insert.h transformation_compute_data_synonym_fact_closure.h transformation_context.h transformation_equation_instruction.h transformation_function_call.h transformation_inline_function.h transformation_invert_comparison_operator.h transformation_load.h transformation_make_vector_operation_dynamic.h transformation_merge_blocks.h transformation_move_block_down.h transformation_move_instruction_down.h transformation_mutate_pointer.h transformation_outline_function.h transformation_permute_function_parameters.h transformation_permute_phi_operands.h transformation_propagate_instruction_up.h transformation_push_id_through_variable.h transformation_record_synonymous_constants.h transformation_replace_add_sub_mul_with_carrying_extended.h transformation_replace_boolean_constant_with_constant_binary.h transformation_replace_constant_with_uniform.h transformation_replace_copy_memory_with_load_store.h transformation_replace_copy_object_with_store_load.h transformation_replace_id_with_synonym.h transformation_replace_irrelevant_id.h transformation_replace_linear_algebra_instruction.h transformation_replace_load_store_with_copy_memory.h transformation_replace_opphi_id_from_dead_predecessor.h transformation_replace_opselect_with_conditional_branch.h transformation_replace_parameter_with_global.h transformation_replace_params_with_struct.h transformation_set_function_control.h transformation_set_loop_control.h transformation_set_memory_operands_mask.h transformation_set_selection_control.h transformation_split_block.h transformation_store.h transformation_swap_commutable_operands.h transformation_swap_conditional_branch_operands.h transformation_toggle_access_chain_instruction.h transformation_vector_shuffle.h uniform_buffer_element_descriptor.h ${CMAKE_CURRENT_BINARY_DIR}/protobufs/spvtoolsfuzz.pb.h call_graph.cpp counter_overflow_id_source.cpp data_descriptor.cpp fact_manager/constant_uniform_facts.cpp fact_manager/data_synonym_and_id_equation_facts.cpp fact_manager/dead_block_facts.cpp fact_manager/fact_manager.cpp fact_manager/irrelevant_value_facts.cpp fact_manager/livesafe_function_facts.cpp force_render_red.cpp fuzzer.cpp fuzzer_context.cpp fuzzer_pass.cpp fuzzer_pass_add_access_chains.cpp fuzzer_pass_add_composite_inserts.cpp fuzzer_pass_add_composite_types.cpp fuzzer_pass_add_copy_memory.cpp fuzzer_pass_add_dead_blocks.cpp fuzzer_pass_add_dead_breaks.cpp fuzzer_pass_add_dead_continues.cpp fuzzer_pass_add_equation_instructions.cpp fuzzer_pass_add_function_calls.cpp fuzzer_pass_add_global_variables.cpp fuzzer_pass_add_image_sample_unused_components.cpp fuzzer_pass_add_synonyms.cpp fuzzer_pass_add_loads.cpp fuzzer_pass_add_local_variables.cpp fuzzer_pass_add_loop_preheaders.cpp fuzzer_pass_add_no_contraction_decorations.cpp fuzzer_pass_add_opphi_synonyms.cpp fuzzer_pass_add_parameters.cpp fuzzer_pass_add_relaxed_decorations.cpp fuzzer_pass_add_stores.cpp fuzzer_pass_add_vector_shuffle_instructions.cpp fuzzer_pass_adjust_branch_weights.cpp fuzzer_pass_adjust_function_controls.cpp fuzzer_pass_adjust_loop_controls.cpp fuzzer_pass_adjust_memory_operands_masks.cpp fuzzer_pass_adjust_selection_controls.cpp fuzzer_pass_apply_id_synonyms.cpp fuzzer_pass_construct_composites.cpp fuzzer_pass_copy_objects.cpp fuzzer_pass_donate_modules.cpp fuzzer_pass_inline_functions.cpp fuzzer_pass_invert_comparison_operators.cpp fuzzer_pass_interchange_signedness_of_integer_operands.cpp fuzzer_pass_interchange_zero_like_constants.cpp fuzzer_pass_make_vector_operations_dynamic.cpp fuzzer_pass_merge_blocks.cpp fuzzer_pass_mutate_pointers.cpp fuzzer_pass_obfuscate_constants.cpp fuzzer_pass_outline_functions.cpp fuzzer_pass_permute_blocks.cpp fuzzer_pass_permute_function_parameters.cpp fuzzer_pass_permute_instructions.cpp fuzzer_pass_permute_phi_operands.cpp fuzzer_pass_propagate_instructions_up.cpp fuzzer_pass_push_ids_through_variables.cpp fuzzer_pass_replace_adds_subs_muls_with_carrying_extended.cpp fuzzer_pass_replace_copy_memories_with_loads_stores.cpp fuzzer_pass_replace_copy_objects_with_stores_loads.cpp fuzzer_pass_replace_irrelevant_ids.cpp fuzzer_pass_replace_linear_algebra_instructions.cpp fuzzer_pass_replace_loads_stores_with_copy_memories.cpp fuzzer_pass_replace_opphi_ids_from_dead_predecessors.cpp fuzzer_pass_replace_opselects_with_conditional_branches.cpp fuzzer_pass_replace_parameter_with_global.cpp fuzzer_pass_replace_params_with_struct.cpp fuzzer_pass_split_blocks.cpp fuzzer_pass_swap_commutable_operands.cpp fuzzer_pass_swap_conditional_branch_operands.cpp fuzzer_pass_toggle_access_chain_instruction.cpp fuzzer_util.cpp id_use_descriptor.cpp instruction_descriptor.cpp instruction_message.cpp overflow_id_source.cpp pseudo_random_generator.cpp random_generator.cpp replayer.cpp shrinker.cpp transformation.cpp transformation_access_chain.cpp transformation_add_constant_boolean.cpp transformation_add_constant_composite.cpp transformation_add_constant_null.cpp transformation_add_constant_scalar.cpp transformation_add_copy_memory.cpp transformation_add_dead_block.cpp transformation_add_dead_break.cpp transformation_add_dead_continue.cpp transformation_add_function.cpp transformation_add_global_undef.cpp transformation_add_global_variable.cpp transformation_add_image_sample_unused_components.cpp transformation_add_local_variable.cpp transformation_add_loop_preheader.cpp transformation_add_no_contraction_decoration.cpp transformation_add_opphi_synonym.cpp transformation_add_parameter.cpp transformation_add_relaxed_decoration.cpp transformation_add_spec_constant_op.cpp transformation_add_synonym.cpp transformation_add_type_array.cpp transformation_add_type_boolean.cpp transformation_add_type_float.cpp transformation_add_type_function.cpp transformation_add_type_int.cpp transformation_add_type_matrix.cpp transformation_add_type_pointer.cpp transformation_add_type_struct.cpp transformation_add_type_vector.cpp transformation_adjust_branch_weights.cpp transformation_composite_construct.cpp transformation_composite_extract.cpp transformation_composite_insert.cpp transformation_compute_data_synonym_fact_closure.cpp transformation_context.cpp transformation_replace_opselect_with_conditional_branch.cpp transformation_equation_instruction.cpp transformation_function_call.cpp transformation_inline_function.cpp transformation_invert_comparison_operator.cpp transformation_load.cpp transformation_make_vector_operation_dynamic.cpp transformation_merge_blocks.cpp transformation_move_block_down.cpp transformation_move_instruction_down.cpp transformation_mutate_pointer.cpp transformation_outline_function.cpp transformation_permute_function_parameters.cpp transformation_permute_phi_operands.cpp transformation_propagate_instruction_up.cpp transformation_push_id_through_variable.cpp transformation_record_synonymous_constants.cpp transformation_replace_add_sub_mul_with_carrying_extended.cpp transformation_replace_boolean_constant_with_constant_binary.cpp transformation_replace_constant_with_uniform.cpp transformation_replace_copy_memory_with_load_store.cpp transformation_replace_copy_object_with_store_load.cpp transformation_replace_id_with_synonym.cpp transformation_replace_irrelevant_id.cpp transformation_replace_linear_algebra_instruction.cpp transformation_replace_load_store_with_copy_memory.cpp transformation_replace_opphi_id_from_dead_predecessor.cpp transformation_replace_parameter_with_global.cpp transformation_replace_params_with_struct.cpp transformation_set_function_control.cpp transformation_set_loop_control.cpp transformation_set_memory_operands_mask.cpp transformation_set_selection_control.cpp transformation_split_block.cpp transformation_store.cpp transformation_swap_commutable_operands.cpp transformation_swap_conditional_branch_operands.cpp transformation_toggle_access_chain_instruction.cpp transformation_vector_shuffle.cpp uniform_buffer_element_descriptor.cpp ${CMAKE_CURRENT_BINARY_DIR}/protobufs/spvtoolsfuzz.pb.cc ) if(MSVC AND (NOT ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang"))) # Enable parallel builds across four cores for this lib add_definitions(/MP4) endif() spvtools_pch(SPIRV_TOOLS_FUZZ_SOURCES pch_source_fuzz) add_library(SPIRV-Tools-fuzz ${SPIRV_TOOLS_FUZZ_SOURCES}) spvtools_default_compile_options(SPIRV-Tools-fuzz) # Compilation of the auto-generated protobuf source file will yield warnings, # which we have no control over and thus wish to ignore. if(${COMPILER_IS_LIKE_GNU}) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/protobufs/spvtoolsfuzz.pb.cc PROPERTIES COMPILE_FLAGS -w) endif() if(MSVC) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/protobufs/spvtoolsfuzz.pb.cc PROPERTIES COMPILE_FLAGS /w) endif() target_include_directories(SPIRV-Tools-fuzz PUBLIC $ $ $ PRIVATE ${spirv-tools_BINARY_DIR} PRIVATE ${CMAKE_BINARY_DIR}) # The fuzzer reuses a lot of functionality from the SPIRV-Tools library. target_link_libraries(SPIRV-Tools-fuzz PUBLIC ${SPIRV_TOOLS}-static PUBLIC SPIRV-Tools-opt PUBLIC protobuf::libprotobuf) set_property(TARGET SPIRV-Tools-fuzz PROPERTY FOLDER "SPIRV-Tools libraries") spvtools_check_symbol_exports(SPIRV-Tools-fuzz) if(ENABLE_SPIRV_TOOLS_INSTALL) install(TARGETS SPIRV-Tools-fuzz EXPORT SPIRV-Tools-fuzzTargets RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) export(EXPORT SPIRV-Tools-fuzzTargets FILE SPIRV-Tools-fuzzTarget.cmake) spvtools_config_package_dir(SPIRV-Tools-fuzz PACKAGE_DIR) install(EXPORT SPIRV-Tools-fuzzTargets FILE SPIRV-Tools-fuzzTarget.cmake DESTINATION ${PACKAGE_DIR}) spvtools_generate_config_file(SPIRV-Tools-fuzz) install(FILES ${CMAKE_BINARY_DIR}/SPIRV-Tools-fuzzConfig.cmake DESTINATION ${PACKAGE_DIR}) endif(ENABLE_SPIRV_TOOLS_INSTALL) endif(SPIRV_BUILD_FUZZER)