mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-10-18 19:20:05 +00:00
f62357e7b8
This transformation, given the header of a selection construct with branching instruction OpBranchConditional, flattens it. Side-effecting operations such as OpLoad, OpStore and OpFunctionCall are enclosed within smaller conditionals. It is applicable if the construct does not contain inner selection constructs or loops, or atomic or barrier instructions. The corresponding fuzzer pass looks for selection headers and tries to flatten them. Needed for the issue #3544, but it does not fix it completely.
424 lines
18 KiB
CMake
424 lines
18 KiB
CMake
# 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
|
|
comparator_deep_blocks_first.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_duplicate_regions_with_selections.h
|
|
fuzzer_pass_flatten_conditional_branches.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_duplicate_region_with_selection.h
|
|
transformation_equation_instruction.h
|
|
transformation_flatten_conditional_branch.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_duplicate_regions_with_selections.cpp
|
|
fuzzer_pass_flatten_conditional_branches.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_duplicate_region_with_selection.cpp
|
|
transformation_equation_instruction.cpp
|
|
transformation_flatten_conditional_branch.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_opselect_with_conditional_branch.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
|
|
$<BUILD_INTERFACE:${spirv-tools_SOURCE_DIR}/include>
|
|
$<BUILD_INTERFACE:${SPIRV_HEADER_INCLUDE_DIR}>
|
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
|
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)
|