--- /dev/null
--- /dev/null
++LOCAL_PATH := $(call my-dir)
++SPVTOOLS_OUT_PATH=$(if $(call host-path-is-absolute,$(TARGET_OUT)),$(TARGET_OUT),$(abspath $(TARGET_OUT)))
++
++ifeq ($(SPVHEADERS_LOCAL_PATH),)
++ SPVHEADERS_LOCAL_PATH := $(LOCAL_PATH)/external/spirv-headers
++endif
++
++SPVTOOLS_SRC_FILES := \
++ source/assembly_grammar.cpp \
++ source/binary.cpp \
++ source/diagnostic.cpp \
++ source/disassemble.cpp \
++ source/ext_inst.cpp \
++ source/enum_string_mapping.cpp \
++ source/extensions.cpp \
++ source/id_descriptor.cpp \
++ source/libspirv.cpp \
++ source/name_mapper.cpp \
++ source/opcode.cpp \
++ source/operand.cpp \
++ source/parsed_operand.cpp \
++ source/print.cpp \
++ source/software_version.cpp \
++ source/spirv_endian.cpp \
++ source/spirv_optimizer_options.cpp \
++ source/spirv_target_env.cpp \
++ source/spirv_validator_options.cpp \
++ source/table.cpp \
++ source/text.cpp \
++ source/text_handler.cpp \
++ source/util/bit_vector.cpp \
++ source/util/parse_number.cpp \
++ source/util/string_utils.cpp \
++ source/util/timer.cpp \
++ source/val/basic_block.cpp \
++ source/val/construct.cpp \
++ source/val/function.cpp \
++ source/val/instruction.cpp \
++ source/val/validation_state.cpp \
++ source/val/validate.cpp \
++ source/val/validate_adjacency.cpp \
++ source/val/validate_annotation.cpp \
++ source/val/validate_arithmetics.cpp \
++ source/val/validate_atomics.cpp \
++ source/val/validate_barriers.cpp \
++ source/val/validate_bitwise.cpp \
++ source/val/validate_builtins.cpp \
++ source/val/validate_capability.cpp \
++ source/val/validate_cfg.cpp \
++ source/val/validate_composites.cpp \
++ source/val/validate_constants.cpp \
++ source/val/validate_conversion.cpp \
++ source/val/validate_datarules.cpp \
++ source/val/validate_debug.cpp \
++ source/val/validate_decorations.cpp \
++ source/val/validate_derivatives.cpp \
++ source/val/validate_extensions.cpp \
++ source/val/validate_execution_limitations.cpp \
++ source/val/validate_function.cpp \
++ source/val/validate_id.cpp \
++ source/val/validate_image.cpp \
++ source/val/validate_interfaces.cpp \
++ source/val/validate_instruction.cpp \
++ source/val/validate_memory.cpp \
++ source/val/validate_memory_semantics.cpp \
++ source/val/validate_mode_setting.cpp \
++ source/val/validate_layout.cpp \
++ source/val/validate_literals.cpp \
++ source/val/validate_logicals.cpp \
++ source/val/validate_non_uniform.cpp \
++ source/val/validate_primitives.cpp \
++ source/val/validate_scopes.cpp \
++ source/val/validate_type.cpp
++
++SPVTOOLS_OPT_SRC_FILES := \
++ source/opt/aggressive_dead_code_elim_pass.cpp \
++ source/opt/basic_block.cpp \
++ source/opt/block_merge_pass.cpp \
++ source/opt/build_module.cpp \
++ source/opt/cfg.cpp \
++ source/opt/cfg_cleanup_pass.cpp \
++ source/opt/ccp_pass.cpp \
++ source/opt/code_sink.cpp \
++ source/opt/combine_access_chains.cpp \
++ source/opt/common_uniform_elim_pass.cpp \
++ source/opt/compact_ids_pass.cpp \
++ source/opt/composite.cpp \
++ source/opt/const_folding_rules.cpp \
++ source/opt/constants.cpp \
++ source/opt/copy_prop_arrays.cpp \
++ source/opt/dead_branch_elim_pass.cpp \
++ source/opt/dead_insert_elim_pass.cpp \
++ source/opt/dead_variable_elimination.cpp \
++ source/opt/decoration_manager.cpp \
++ source/opt/def_use_manager.cpp \
++ source/opt/dominator_analysis.cpp \
++ source/opt/dominator_tree.cpp \
++ source/opt/eliminate_dead_constant_pass.cpp \
++ source/opt/eliminate_dead_functions_pass.cpp \
++ source/opt/feature_manager.cpp \
++ source/opt/flatten_decoration_pass.cpp \
++ source/opt/fold.cpp \
++ source/opt/folding_rules.cpp \
++ source/opt/fold_spec_constant_op_and_composite_pass.cpp \
++ source/opt/freeze_spec_constant_value_pass.cpp \
++ source/opt/function.cpp \
++ source/opt/if_conversion.cpp \
++ source/opt/inline_pass.cpp \
++ source/opt/inline_exhaustive_pass.cpp \
++ source/opt/inline_opaque_pass.cpp \
++ source/opt/inst_bindless_check_pass.cpp \
++ source/opt/instruction.cpp \
++ source/opt/instruction_list.cpp \
++ source/opt/instrument_pass.cpp \
++ source/opt/ir_context.cpp \
++ source/opt/ir_loader.cpp \
++ source/opt/licm_pass.cpp \
++ source/opt/local_access_chain_convert_pass.cpp \
++ source/opt/local_redundancy_elimination.cpp \
++ source/opt/local_single_block_elim_pass.cpp \
++ source/opt/local_single_store_elim_pass.cpp \
++ source/opt/local_ssa_elim_pass.cpp \
++ source/opt/loop_dependence.cpp \
++ source/opt/loop_dependence_helpers.cpp \
++ source/opt/loop_descriptor.cpp \
++ source/opt/loop_fission.cpp \
++ source/opt/loop_fusion.cpp \
++ source/opt/loop_fusion_pass.cpp \
++ source/opt/loop_peeling.cpp \
++ source/opt/loop_unroller.cpp \
++ source/opt/loop_unswitch_pass.cpp \
++ source/opt/loop_utils.cpp \
++ source/opt/mem_pass.cpp \
++ source/opt/merge_return_pass.cpp \
++ source/opt/module.cpp \
++ source/opt/optimizer.cpp \
++ source/opt/pass.cpp \
++ source/opt/pass_manager.cpp \
++ source/opt/private_to_local_pass.cpp \
++ source/opt/process_lines_pass.cpp \
++ source/opt/propagator.cpp \
++ source/opt/reduce_load_size.cpp \
++ source/opt/redundancy_elimination.cpp \
++ source/opt/register_pressure.cpp \
++ source/opt/remove_duplicates_pass.cpp \
++ source/opt/replace_invalid_opc.cpp \
++ source/opt/scalar_analysis.cpp \
++ source/opt/scalar_analysis_simplification.cpp \
++ source/opt/scalar_replacement_pass.cpp \
++ source/opt/set_spec_constant_default_value_pass.cpp \
++ source/opt/simplification_pass.cpp \
++ source/opt/ssa_rewrite_pass.cpp \
++ source/opt/strength_reduction_pass.cpp \
++ source/opt/strip_debug_info_pass.cpp \
++ source/opt/strip_reflect_info_pass.cpp \
++ source/opt/struct_cfg_analysis.cpp \
++ source/opt/type_manager.cpp \
++ source/opt/types.cpp \
++ source/opt/unify_const_pass.cpp \
++ source/opt/upgrade_memory_model.cpp \
++ source/opt/value_number_table.cpp \
++ source/opt/vector_dce.cpp \
++ source/opt/workaround1209.cpp
++
++# Locations of grammar files.
++#
++# TODO(dneto): Build a single set of tables that embeds versioning differences on
++# a per-item basis. That must happen before SPIR-V 1.4, etc.
++# https://github.com/KhronosGroup/SPIRV-Tools/issues/1195
++SPV_CORE10_GRAMMAR=$(SPVHEADERS_LOCAL_PATH)/include/spirv/1.0/spirv.core.grammar.json
++SPV_CORE11_GRAMMAR=$(SPVHEADERS_LOCAL_PATH)/include/spirv/1.1/spirv.core.grammar.json
++SPV_CORE12_GRAMMAR=$(SPVHEADERS_LOCAL_PATH)/include/spirv/1.2/spirv.core.grammar.json
++SPV_COREUNIFIED1_GRAMMAR=$(SPVHEADERS_LOCAL_PATH)/include/spirv/unified1/spirv.core.grammar.json
++SPV_CORELATEST_GRAMMAR=$(SPV_COREUNIFIED1_GRAMMAR)
++SPV_GLSL_GRAMMAR=$(SPVHEADERS_LOCAL_PATH)/include/spirv/1.2/extinst.glsl.std.450.grammar.json
++SPV_OPENCL_GRAMMAR=$(SPVHEADERS_LOCAL_PATH)/include/spirv/1.2/extinst.opencl.std.100.grammar.json
++# TODO(dneto): I expect the DebugInfo grammar file to eventually migrate to SPIRV-Headers
++SPV_DEBUGINFO_GRAMMAR=$(LOCAL_PATH)/source/extinst.debuginfo.grammar.json
++
++define gen_spvtools_grammar_tables
++$(call generate-file-dir,$(1)/core.insts-1.0.inc)
++$(1)/core.insts-1.0.inc $(1)/operand.kinds-1.0.inc $(1)/glsl.std.450.insts.inc $(1)/opencl.std.insts.inc: \
++ $(LOCAL_PATH)/utils/generate_grammar_tables.py \
++ $(SPV_CORE10_GRAMMAR) \
++ $(SPV_GLSL_GRAMMAR) \
++ $(SPV_OPENCL_GRAMMAR) \
++ $(SPV_DEBUGINFO_GRAMMAR)
++ @$(HOST_PYTHON) $(LOCAL_PATH)/utils/generate_grammar_tables.py \
++ --spirv-core-grammar=$(SPV_CORE10_GRAMMAR) \
++ --extinst-glsl-grammar=$(SPV_GLSL_GRAMMAR) \
++ --extinst-opencl-grammar=$(SPV_OPENCL_GRAMMAR) \
++ --extinst-debuginfo-grammar=$(SPV_DEBUGINFO_GRAMMAR) \
++ --core-insts-output=$(1)/core.insts-1.0.inc \
++ --glsl-insts-output=$(1)/glsl.std.450.insts.inc \
++ --opencl-insts-output=$(1)/opencl.std.insts.inc \
++ --operand-kinds-output=$(1)/operand.kinds-1.0.inc
++ @echo "[$(TARGET_ARCH_ABI)] Grammar v1.0 : instructions & operands <= grammar JSON files"
++$(1)/core.insts-1.1.inc $(1)/operand.kinds-1.1.inc: \
++ $(LOCAL_PATH)/utils/generate_grammar_tables.py \
++ $(SPV_CORE11_GRAMMAR) \
++ $(SPV_DEBUGINFO_GRAMMAR)
++ @$(HOST_PYTHON) $(LOCAL_PATH)/utils/generate_grammar_tables.py \
++ --spirv-core-grammar=$(SPV_CORE11_GRAMMAR) \
++ --extinst-debuginfo-grammar=$(SPV_DEBUGINFO_GRAMMAR) \
++ --core-insts-output=$(1)/core.insts-1.1.inc \
++ --operand-kinds-output=$(1)/operand.kinds-1.1.inc
++ @echo "[$(TARGET_ARCH_ABI)] Grammar v1.1 : instructions & operands <= grammar JSON files"
++$(1)/core.insts-1.2.inc $(1)/operand.kinds-1.2.inc: \
++ $(LOCAL_PATH)/utils/generate_grammar_tables.py \
++ $(SPV_CORE12_GRAMMAR) \
++ $(SPV_DEBUGINFO_GRAMMAR)
++ @$(HOST_PYTHON) $(LOCAL_PATH)/utils/generate_grammar_tables.py \
++ --spirv-core-grammar=$(SPV_CORE12_GRAMMAR) \
++ --extinst-debuginfo-grammar=$(SPV_DEBUGINFO_GRAMMAR) \
++ --core-insts-output=$(1)/core.insts-1.2.inc \
++ --operand-kinds-output=$(1)/operand.kinds-1.2.inc
++ @echo "[$(TARGET_ARCH_ABI)] Grammar v1.2 : instructions & operands <= grammar JSON files"
++$(1)/core.insts-unified1.inc $(1)/operand.kinds-unified1.inc: \
++ $(LOCAL_PATH)/utils/generate_grammar_tables.py \
++ $(SPV_COREUNIFIED1_GRAMMAR) \
++ $(SPV_DEBUGINFO_GRAMMAR)
++ @$(HOST_PYTHON) $(LOCAL_PATH)/utils/generate_grammar_tables.py \
++ --spirv-core-grammar=$(SPV_COREUNIFIED1_GRAMMAR) \
++ --extinst-debuginfo-grammar=$(SPV_DEBUGINFO_GRAMMAR) \
++ --core-insts-output=$(1)/core.insts-unified1.inc \
++ --operand-kinds-output=$(1)/operand.kinds-unified1.inc
++ @echo "[$(TARGET_ARCH_ABI)] Grammar v1.3 (from unified1) : instructions & operands <= grammar JSON files"
++$(LOCAL_PATH)/source/opcode.cpp: $(1)/core.insts-1.0.inc $(1)/core.insts-1.1.inc $(1)/core.insts-1.2.inc $(1)/core.insts-unified1.inc
++$(LOCAL_PATH)/source/operand.cpp: $(1)/operand.kinds-1.0.inc $(1)/operand.kinds-1.1.inc $(1)/operand.kinds-1.2.inc $(1)/operand.kinds-unified1.inc
++$(LOCAL_PATH)/source/ext_inst.cpp: \
++ $(1)/glsl.std.450.insts.inc \
++ $(1)/opencl.std.insts.inc \
++ $(1)/debuginfo.insts.inc \
++ $(1)/spv-amd-gcn-shader.insts.inc \
++ $(1)/spv-amd-shader-ballot.insts.inc \
++ $(1)/spv-amd-shader-explicit-vertex-parameter.insts.inc \
++ $(1)/spv-amd-shader-trinary-minmax.insts.inc
++endef
++$(eval $(call gen_spvtools_grammar_tables,$(SPVTOOLS_OUT_PATH)))
++
++
++define gen_spvtools_lang_headers
++# Generate language-specific headers. So far we only generate C headers
++# $1 is the output directory.
++# $2 is the base name of the header file, e.g. "DebugInfo".
++# $3 is the grammar file containing token definitions.
++$(call generate-file-dir,$(1)/$(2).h)
++$(1)/$(2).h : \
++ $(LOCAL_PATH)/utils/generate_language_headers.py \
++ $(3)
++ @$(HOST_PYTHON) $(LOCAL_PATH)/utils/generate_language_headers.py \
++ --extinst-name=$(2) \
++ --extinst-grammar=$(3) \
++ --extinst-output-base=$(1)/$(2)
++ @echo "[$(TARGET_ARCH_ABI)] Generate language specific header for $(2): headers <= grammar"
++$(LOCAL_PATH)/source/ext_inst.cpp: $(1)/$(2).h
++endef
++# We generate language-specific headers for DebugInfo
++$(eval $(call gen_spvtools_lang_headers,$(SPVTOOLS_OUT_PATH),DebugInfo,$(SPV_DEBUGINFO_GRAMMAR)))
++
++
++define gen_spvtools_vendor_tables
++$(call generate-file-dir,$(1)/$(2).insts.inc)
++$(1)/$(2).insts.inc : \
++ $(LOCAL_PATH)/utils/generate_grammar_tables.py \
++ $(LOCAL_PATH)/source/extinst.$(2).grammar.json
++ @$(HOST_PYTHON) $(LOCAL_PATH)/utils/generate_grammar_tables.py \
++ --extinst-vendor-grammar=$(LOCAL_PATH)/source/extinst.$(2).grammar.json \
++ --vendor-insts-output=$(1)/$(2).insts.inc
++ @echo "[$(TARGET_ARCH_ABI)] Vendor extended instruction set: $(2) tables <= grammar"
++$(LOCAL_PATH)/source/ext_inst.cpp: $(1)/$(2).insts.inc
++endef
++# Vendor extended instruction sets, with grammars from SPIRV-Tools source tree.
++SPV_NONSTANDARD_EXTINST_GRAMMARS=$(foreach F,$(wildcard $(LOCAL_PATH)/source/extinst.*.grammar.json),$(patsubst extinst.%.grammar.json,%,$(notdir $F)))
++$(foreach E,$(SPV_NONSTANDARD_EXTINST_GRAMMARS),$(eval $(call gen_spvtools_vendor_tables,$(SPVTOOLS_OUT_PATH),$E)))
++
++define gen_spvtools_enum_string_mapping
++$(call generate-file-dir,$(1)/extension_enum.inc.inc)
++$(1)/extension_enum.inc $(1)/enum_string_mapping.inc: \
++ $(LOCAL_PATH)/utils/generate_grammar_tables.py \
++ $(SPV_CORELATEST_GRAMMAR)
++ @$(HOST_PYTHON) $(LOCAL_PATH)/utils/generate_grammar_tables.py \
++ --spirv-core-grammar=$(SPV_CORELATEST_GRAMMAR) \
++ --extinst-debuginfo-grammar=$(SPV_DEBUGINFO_GRAMMAR) \
++ --extension-enum-output=$(1)/extension_enum.inc \
++ --enum-string-mapping-output=$(1)/enum_string_mapping.inc
++ @echo "[$(TARGET_ARCH_ABI)] Generate enum<->string mapping <= grammar JSON files"
++# Generated header extension_enum.inc is transitively included by table.h, which is
++# used pervasively. Capture the pervasive dependency.
++$(foreach F,$(SPVTOOLS_SRC_FILES) $(SPVTOOLS_OPT_SRC_FILES),$(LOCAL_PATH)/$F ) \
++ : $(1)/extension_enum.inc
++$(LOCAL_PATH)/source/enum_string_mapping.cpp: $(1)/enum_string_mapping.inc
++endef
++$(eval $(call gen_spvtools_enum_string_mapping,$(SPVTOOLS_OUT_PATH)))
++
++define gen_spvtools_build_version_inc
++$(call generate-file-dir,$(1)/dummy_filename)
++$(1)/build-version.inc: \
++ $(LOCAL_PATH)/utils/update_build_version.py \
++ $(LOCAL_PATH)/CHANGES
++ @$(HOST_PYTHON) $(LOCAL_PATH)/utils/update_build_version.py \
++ $(LOCAL_PATH) $(1)/build-version.inc
++ @echo "[$(TARGET_ARCH_ABI)] Generate : build-version.inc <= CHANGES"
++$(LOCAL_PATH)/source/software_version.cpp: $(1)/build-version.inc
++endef
++$(eval $(call gen_spvtools_build_version_inc,$(SPVTOOLS_OUT_PATH)))
++
++define gen_spvtools_generators_inc
++$(call generate-file-dir,$(1)/dummy_filename)
++$(1)/generators.inc: \
++ $(LOCAL_PATH)/utils/generate_registry_tables.py \
++ $(SPVHEADERS_LOCAL_PATH)/include/spirv/spir-v.xml
++ @$(HOST_PYTHON) $(LOCAL_PATH)/utils/generate_registry_tables.py \
++ --xml=$(SPVHEADERS_LOCAL_PATH)/include/spirv/spir-v.xml \
++ --generator-output=$(1)/generators.inc
++ @echo "[$(TARGET_ARCH_ABI)] Generate : generators.inc <= spir-v.xml"
++$(LOCAL_PATH)/source/opcode.cpp: $(1)/generators.inc
++endef
++$(eval $(call gen_spvtools_generators_inc,$(SPVTOOLS_OUT_PATH)))
++
++include $(CLEAR_VARS)
++LOCAL_MODULE := SPIRV-Tools
++LOCAL_C_INCLUDES := \
++ $(LOCAL_PATH)/include \
++ $(SPVHEADERS_LOCAL_PATH)/include \
++ $(SPVTOOLS_OUT_PATH)
++LOCAL_EXPORT_C_INCLUDES := \
++ $(LOCAL_PATH)/include
++LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti -Werror
++LOCAL_SRC_FILES:= $(SPVTOOLS_SRC_FILES)
++include $(BUILD_STATIC_LIBRARY)
++
++include $(CLEAR_VARS)
++LOCAL_MODULE := SPIRV-Tools-opt
++LOCAL_C_INCLUDES := \
++ $(LOCAL_PATH)/include \
++ $(LOCAL_PATH)/source \
++ $(SPVHEADERS_LOCAL_PATH)/include \
++ $(SPVTOOLS_OUT_PATH)
++LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti -Werror
++LOCAL_STATIC_LIBRARIES:=SPIRV-Tools
++LOCAL_SRC_FILES:= $(SPVTOOLS_OPT_SRC_FILES)
++include $(BUILD_STATIC_LIBRARY)
--- /dev/null
--- /dev/null
++# Copyright 2018 Google Inc. All rights reserved.
++#
++# 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.
++
++import("//build_overrides/spirv_tools.gni")
++
++import("//testing/test.gni")
++import("//build_overrides/build.gni")
++
++spirv_headers = spirv_tools_spirv_headers_dir
++
++template("spvtools_core_tables") {
++ assert(defined(invoker.version), "Need version in $target_name generation.")
++
++ action("spvtools_core_tables_" + target_name) {
++ script = "utils/generate_grammar_tables.py"
++
++ version = invoker.version
++
++ core_json_file =
++ "${spirv_headers}/include/spirv/$version/spirv.core.grammar.json"
++ core_insts_file = "${target_gen_dir}/core.insts-$version.inc"
++ operand_kinds_file = "${target_gen_dir}/operand.kinds-$version.inc"
++ extinst_file = "source/extinst.debuginfo.grammar.json"
++
++ sources = [
++ core_json_file,
++ ]
++ outputs = [
++ core_insts_file,
++ operand_kinds_file,
++ ]
++ args = [
++ "--spirv-core-grammar",
++ rebase_path(core_json_file, root_build_dir),
++ "--core-insts-output",
++ rebase_path(core_insts_file, root_build_dir),
++ "--extinst-debuginfo-grammar",
++ rebase_path(extinst_file, root_build_dir),
++ "--operand-kinds-output",
++ rebase_path(operand_kinds_file, root_build_dir),
++ ]
++ }
++}
++
++template("spvtools_core_enums") {
++ assert(defined(invoker.version), "Need version in $target_name generation.")
++
++ action("spvtools_core_enums_" + target_name) {
++ script = "utils/generate_grammar_tables.py"
++
++ version = invoker.version
++
++ core_json_file =
++ "${spirv_headers}/include/spirv/$version/spirv.core.grammar.json"
++ debug_insts_file = "source/extinst.debuginfo.grammar.json"
++ extension_enum_file = "${target_gen_dir}/extension_enum.inc"
++ extension_map_file = "${target_gen_dir}/enum_string_mapping.inc"
++
++ args = [
++ "--spirv-core-grammar",
++ rebase_path(core_json_file, root_build_dir),
++ "--extinst-debuginfo-grammar",
++ rebase_path(debug_insts_file, root_build_dir),
++ "--extension-enum-output",
++ rebase_path(extension_enum_file, root_build_dir),
++ "--enum-string-mapping-output",
++ rebase_path(extension_map_file, root_build_dir),
++ ]
++ inputs = [
++ core_json_file,
++ ]
++ outputs = [
++ extension_enum_file,
++ extension_map_file,
++ ]
++ }
++}
++
++template("spvtools_glsl_tables") {
++ assert(defined(invoker.version), "Need version in $target_name generation.")
++
++ action("spvtools_glsl_tables_" + target_name) {
++ script = "utils/generate_grammar_tables.py"
++
++ version = invoker.version
++
++ core_json_file =
++ "${spirv_headers}/include/spirv/$version/spirv.core.grammar.json"
++ glsl_json_file = "${spirv_headers}/include/spirv/${version}/extinst.glsl.std.450.grammar.json"
++ glsl_insts_file = "${target_gen_dir}/glsl.std.450.insts.inc"
++ debug_insts_file = "source/extinst.debuginfo.grammar.json"
++
++ args = [
++ "--spirv-core-grammar",
++ rebase_path(core_json_file, root_build_dir),
++ "--extinst-glsl-grammar",
++ rebase_path(glsl_json_file, root_build_dir),
++ "--glsl-insts-output",
++ rebase_path(glsl_insts_file, root_build_dir),
++ "--extinst-debuginfo-grammar",
++ rebase_path(debug_insts_file, root_build_dir),
++ ]
++ inputs = [
++ core_json_file,
++ glsl_json_file,
++ ]
++ outputs = [
++ glsl_insts_file,
++ ]
++ }
++}
++
++template("spvtools_opencl_tables") {
++ assert(defined(invoker.version), "Need version in $target_name generation.")
++
++ action("spvtools_opencl_tables_" + target_name) {
++ script = "utils/generate_grammar_tables.py"
++
++ version = invoker.version
++
++ core_json_file =
++ "${spirv_headers}/include/spirv/$version/spirv.core.grammar.json"
++ opengl_json_file = "${spirv_headers}/include/spirv/${version}/extinst.opencl.std.100.grammar.json"
++ opencl_insts_file = "${target_gen_dir}/opencl.std.insts.inc"
++ debug_insts_file = "source/extinst.debuginfo.grammar.json"
++
++ args = [
++ "--spirv-core-grammar",
++ rebase_path(core_json_file, root_build_dir),
++ "--extinst-opencl-grammar",
++ rebase_path(opengl_json_file, root_build_dir),
++ "--opencl-insts-output",
++ rebase_path(opencl_insts_file, root_build_dir),
++ "--extinst-debuginfo-grammar",
++ rebase_path(debug_insts_file, root_build_dir),
++ ]
++ inputs = [
++ core_json_file,
++ opengl_json_file,
++ ]
++ outputs = [
++ opencl_insts_file,
++ ]
++ }
++}
++
++template("spvtools_language_header") {
++ assert(defined(invoker.name), "Need name in $target_name generation.")
++
++ action("spvtools_language_header_" + target_name) {
++ script = "utils/generate_language_headers.py"
++
++ name = invoker.name
++ extinst_output_base = "${target_gen_dir}/${name}"
++ debug_insts_file = "source/extinst.debuginfo.grammar.json"
++
++ args = [
++ "--extinst-name",
++ "${name}",
++ "--extinst-grammar",
++ rebase_path(debug_insts_file, root_build_dir),
++ "--extinst-output-base",
++ rebase_path(extinst_output_base, root_build_dir),
++ ]
++ inputs = [
++ debug_insts_file,
++ ]
++ outputs = [
++ "${extinst_output_base}.h",
++ ]
++ }
++}
++
++template("spvtools_vendor_table") {
++ assert(defined(invoker.name), "Need name in $target_name generation.")
++
++ action("spvtools_vendor_tables_" + target_name) {
++ script = "utils/generate_grammar_tables.py"
++
++ name = invoker.name
++ extinst_vendor_grammar = "source/extinst.${name}.grammar.json"
++ extinst_file = "${target_gen_dir}/${name}.insts.inc"
++
++ args = [
++ "--extinst-vendor-grammar",
++ rebase_path(extinst_vendor_grammar, root_build_dir),
++ "--vendor-insts-output",
++ rebase_path(extinst_file, root_build_dir),
++ ]
++ inputs = [
++ extinst_vendor_grammar,
++ ]
++ outputs = [
++ extinst_file,
++ ]
++ }
++}
++
++action("spvtools_generators_inc") {
++ script = "utils/generate_registry_tables.py"
++
++ # TODO(dsinclair): Make work for chrome
++ xml_file = "${spirv_headers}/include/spirv/spir-v.xml"
++ inc_file = "${target_gen_dir}/generators.inc"
++
++ sources = [
++ xml_file,
++ ]
++ outputs = [
++ inc_file,
++ ]
++ args = [
++ "--xml",
++ rebase_path(xml_file, root_build_dir),
++ "--generator",
++ rebase_path(inc_file, root_build_dir),
++ ]
++}
++
++action("spvtools_build_version") {
++ script = "utils/update_build_version.py"
++
++ src_dir = "."
++ inc_file = "${target_gen_dir}/build-version.inc"
++
++ outputs = [
++ inc_file,
++ ]
++ args = [
++ rebase_path(src_dir, root_build_dir),
++ rebase_path(inc_file, root_build_dir),
++ ]
++}
++
++spvtools_core_tables("unified1") {
++ version = "unified1"
++}
++spvtools_core_enums("unified1") {
++ version = "unified1"
++}
++spvtools_glsl_tables("glsl1-0") {
++ version = "1.0"
++}
++spvtools_opencl_tables("opencl1-0") {
++ version = "1.0"
++}
++spvtools_language_header("unified1") {
++ name = "DebugInfo"
++}
++
++spvtools_vendor_tables = [
++ "spv-amd-shader-explicit-vertex-parameter",
++ "spv-amd-shader-trinary-minmax",
++ "spv-amd-gcn-shader",
++ "spv-amd-shader-ballot",
++ "debuginfo",
++]
++
++foreach(table, spvtools_vendor_tables) {
++ spvtools_vendor_table(table) {
++ name = table
++ }
++}
++
++config("spvtools_public_config") {
++ include_dirs = [ "include" ]
++}
++
++config("spvtools_internal_config") {
++ include_dirs = [
++ ".",
++ "$target_gen_dir",
++ "${spirv_headers}/include",
++ ]
++
++ configs = [ ":spvtools_public_config" ]
++
++ if (is_clang) {
++ cflags = [ "-Wno-implicit-fallthrough" ]
++ }
++}
++
++source_set("spvtools_headers") {
++ sources = [
++ "include/spirv-tools/libspirv.h",
++ "include/spirv-tools/libspirv.hpp",
++ "include/spirv-tools/linker.hpp",
++ "include/spirv-tools/optimizer.hpp",
++ "include/spirv-tools/instrument.hpp",
++ ]
++
++ public_configs = [ ":spvtools_public_config" ]
++}
++
++static_library("spvtools") {
++ deps = [
++ ":spvtools_core_enums_unified1",
++ ":spvtools_core_tables_unified1",
++ ":spvtools_generators_inc",
++ ":spvtools_glsl_tables_glsl1-0",
++ ":spvtools_language_header_unified1",
++ ":spvtools_opencl_tables_opencl1-0",
++ ]
++ foreach(target_name, spvtools_vendor_tables) {
++ deps += [ ":spvtools_vendor_tables_$target_name" ]
++ }
++
++ sources = [
++ "source/assembly_grammar.cpp",
++ "source/assembly_grammar.h",
++ "source/binary.cpp",
++ "source/binary.h",
++ "source/diagnostic.cpp",
++ "source/diagnostic.h",
++ "source/disassemble.cpp",
++ "source/enum_set.h",
++ "source/enum_string_mapping.cpp",
++ "source/ext_inst.cpp",
++ "source/ext_inst.h",
++ "source/extensions.cpp",
++ "source/extensions.h",
++ "source/instruction.h",
++ "source/libspirv.cpp",
++ "source/macro.h",
++ "source/name_mapper.cpp",
++ "source/name_mapper.h",
++ "source/opcode.cpp",
++ "source/opcode.h",
++ "source/operand.cpp",
++ "source/operand.h",
++ "source/parsed_operand.cpp",
++ "source/parsed_operand.h",
++ "source/print.cpp",
++ "source/print.h",
++ "source/spirv_constant.h",
++ "source/spirv_definition.h",
++ "source/spirv_endian.cpp",
++ "source/spirv_endian.h",
++ "source/spirv_optimizer_options.cpp",
++ "source/spirv_optimizer_options.h",
++ "source/spirv_target_env.cpp",
++ "source/spirv_target_env.h",
++ "source/spirv_validator_options.cpp",
++ "source/spirv_validator_options.h",
++ "source/table.cpp",
++ "source/table.h",
++ "source/text.cpp",
++ "source/text.h",
++ "source/text_handler.cpp",
++ "source/text_handler.h",
++ "source/util/bit_vector.cpp",
++ "source/util/bit_vector.h",
++ "source/util/bitutils.h",
++ "source/util/hex_float.h",
++ "source/util/ilist.h",
++ "source/util/ilist_node.h",
++ "source/util/make_unique.h",
++ "source/util/parse_number.cpp",
++ "source/util/parse_number.h",
++ "source/util/small_vector.h",
++ "source/util/string_utils.cpp",
++ "source/util/string_utils.h",
++ "source/util/timer.cpp",
++ "source/util/timer.h",
++ ]
++
++ public_deps = [
++ ":spvtools_headers",
++ ]
++
++ configs -= [ "//build/config/compiler:chromium_code" ]
++ configs += [
++ "//build/config/compiler:no_chromium_code",
++ ":spvtools_internal_config",
++ ]
++}
++
++static_library("spvtools_val") {
++ sources = [
++ "source/val/basic_block.cpp",
++ "source/val/construct.cpp",
++ "source/val/function.cpp",
++ "source/val/instruction.cpp",
++ "source/val/validate.cpp",
++ "source/val/validate.h",
++ "source/val/validate_adjacency.cpp",
++ "source/val/validate_annotation.cpp",
++ "source/val/validate_arithmetics.cpp",
++ "source/val/validate_atomics.cpp",
++ "source/val/validate_barriers.cpp",
++ "source/val/validate_bitwise.cpp",
++ "source/val/validate_builtins.cpp",
++ "source/val/validate_capability.cpp",
++ "source/val/validate_cfg.cpp",
++ "source/val/validate_composites.cpp",
++ "source/val/validate_constants.cpp",
++ "source/val/validate_conversion.cpp",
++ "source/val/validate_datarules.cpp",
++ "source/val/validate_debug.cpp",
++ "source/val/validate_decorations.cpp",
++ "source/val/validate_derivatives.cpp",
++ "source/val/validate_execution_limitations.cpp",
++ "source/val/validate_extensions.cpp",
++ "source/val/validate_function.cpp",
++ "source/val/validate_id.cpp",
++ "source/val/validate_image.cpp",
++ "source/val/validate_instruction.cpp",
++ "source/val/validate_interfaces.cpp",
++ "source/val/validate_layout.cpp",
++ "source/val/validate_literals.cpp",
++ "source/val/validate_logicals.cpp",
++ "source/val/validate_memory.cpp",
++ "source/val/validate_memory_semantics.cpp",
++ "source/val/validate_mode_setting.cpp",
++ "source/val/validate_non_uniform.cpp",
++ "source/val/validate_primitives.cpp",
++ "source/val/validate_scopes.cpp",
++ "source/val/validate_type.cpp",
++ "source/val/validation_state.cpp",
++ ]
++
++ deps = [
++ ":spvtools",
++ ]
++ public_deps = [
++ ":spvtools_headers",
++ ]
++
++ configs -= [ "//build/config/compiler:chromium_code" ]
++ configs += [
++ "//build/config/compiler:no_chromium_code",
++ ":spvtools_internal_config",
++ ]
++}
++
++static_library("spvtools_opt") {
++ sources = [
++ "source/opt/aggressive_dead_code_elim_pass.cpp",
++ "source/opt/aggressive_dead_code_elim_pass.h",
++ "source/opt/basic_block.cpp",
++ "source/opt/basic_block.h",
++ "source/opt/block_merge_pass.cpp",
++ "source/opt/block_merge_pass.h",
++ "source/opt/build_module.cpp",
++ "source/opt/build_module.h",
++ "source/opt/ccp_pass.cpp",
++ "source/opt/ccp_pass.h",
++ "source/opt/cfg.cpp",
++ "source/opt/cfg.h",
++ "source/opt/cfg_cleanup_pass.cpp",
++ "source/opt/cfg_cleanup_pass.h",
++ "source/opt/code_sink.cpp",
++ "source/opt/code_sink.h",
++ "source/opt/combine_access_chains.cpp",
++ "source/opt/combine_access_chains.h",
++ "source/opt/common_uniform_elim_pass.cpp",
++ "source/opt/common_uniform_elim_pass.h",
++ "source/opt/compact_ids_pass.cpp",
++ "source/opt/compact_ids_pass.h",
++ "source/opt/composite.cpp",
++ "source/opt/composite.h",
++ "source/opt/const_folding_rules.cpp",
++ "source/opt/const_folding_rules.h",
++ "source/opt/constants.cpp",
++ "source/opt/constants.h",
++ "source/opt/copy_prop_arrays.cpp",
++ "source/opt/copy_prop_arrays.h",
++ "source/opt/dead_branch_elim_pass.cpp",
++ "source/opt/dead_branch_elim_pass.h",
++ "source/opt/dead_insert_elim_pass.cpp",
++ "source/opt/dead_insert_elim_pass.h",
++ "source/opt/dead_variable_elimination.cpp",
++ "source/opt/dead_variable_elimination.h",
++ "source/opt/decoration_manager.cpp",
++ "source/opt/decoration_manager.h",
++ "source/opt/def_use_manager.cpp",
++ "source/opt/def_use_manager.h",
++ "source/opt/dominator_analysis.cpp",
++ "source/opt/dominator_analysis.h",
++ "source/opt/dominator_tree.cpp",
++ "source/opt/dominator_tree.h",
++ "source/opt/eliminate_dead_constant_pass.cpp",
++ "source/opt/eliminate_dead_constant_pass.h",
++ "source/opt/eliminate_dead_functions_pass.cpp",
++ "source/opt/eliminate_dead_functions_pass.h",
++ "source/opt/feature_manager.cpp",
++ "source/opt/feature_manager.h",
++ "source/opt/flatten_decoration_pass.cpp",
++ "source/opt/flatten_decoration_pass.h",
++ "source/opt/fold.cpp",
++ "source/opt/fold.h",
++ "source/opt/fold_spec_constant_op_and_composite_pass.cpp",
++ "source/opt/fold_spec_constant_op_and_composite_pass.h",
++ "source/opt/folding_rules.cpp",
++ "source/opt/folding_rules.h",
++ "source/opt/freeze_spec_constant_value_pass.cpp",
++ "source/opt/freeze_spec_constant_value_pass.h",
++ "source/opt/function.cpp",
++ "source/opt/function.h",
++ "source/opt/if_conversion.cpp",
++ "source/opt/if_conversion.h",
++ "source/opt/inline_exhaustive_pass.cpp",
++ "source/opt/inline_exhaustive_pass.h",
++ "source/opt/inline_opaque_pass.cpp",
++ "source/opt/inline_opaque_pass.h",
++ "source/opt/inline_pass.cpp",
++ "source/opt/inline_pass.h",
++ "source/opt/inst_bindless_check_pass.cpp",
++ "source/opt/inst_bindless_check_pass.h",
++ "source/opt/instruction.cpp",
++ "source/opt/instruction.h",
++ "source/opt/instruction_list.cpp",
++ "source/opt/instruction_list.h",
++ "source/opt/instrument_pass.cpp",
++ "source/opt/instrument_pass.h",
++ "source/opt/ir_builder.h",
++ "source/opt/ir_context.cpp",
++ "source/opt/ir_context.h",
++ "source/opt/ir_loader.cpp",
++ "source/opt/ir_loader.h",
++ "source/opt/iterator.h",
++ "source/opt/licm_pass.cpp",
++ "source/opt/licm_pass.h",
++ "source/opt/local_access_chain_convert_pass.cpp",
++ "source/opt/local_access_chain_convert_pass.h",
++ "source/opt/local_redundancy_elimination.cpp",
++ "source/opt/local_redundancy_elimination.h",
++ "source/opt/local_single_block_elim_pass.cpp",
++ "source/opt/local_single_block_elim_pass.h",
++ "source/opt/local_single_store_elim_pass.cpp",
++ "source/opt/local_single_store_elim_pass.h",
++ "source/opt/local_ssa_elim_pass.cpp",
++ "source/opt/local_ssa_elim_pass.h",
++ "source/opt/log.h",
++ "source/opt/loop_dependence.cpp",
++ "source/opt/loop_dependence.h",
++ "source/opt/loop_dependence_helpers.cpp",
++ "source/opt/loop_descriptor.cpp",
++ "source/opt/loop_descriptor.h",
++ "source/opt/loop_fission.cpp",
++ "source/opt/loop_fission.h",
++ "source/opt/loop_fusion.cpp",
++ "source/opt/loop_fusion.h",
++ "source/opt/loop_fusion_pass.cpp",
++ "source/opt/loop_fusion_pass.h",
++ "source/opt/loop_peeling.cpp",
++ "source/opt/loop_peeling.h",
++ "source/opt/loop_unroller.cpp",
++ "source/opt/loop_unroller.h",
++ "source/opt/loop_unswitch_pass.cpp",
++ "source/opt/loop_unswitch_pass.h",
++ "source/opt/loop_utils.cpp",
++ "source/opt/loop_utils.h",
++ "source/opt/mem_pass.cpp",
++ "source/opt/mem_pass.h",
++ "source/opt/merge_return_pass.cpp",
++ "source/opt/merge_return_pass.h",
++ "source/opt/module.cpp",
++ "source/opt/module.h",
++ "source/opt/null_pass.h",
++ "source/opt/optimizer.cpp",
++ "source/opt/pass.cpp",
++ "source/opt/pass.h",
++ "source/opt/pass_manager.cpp",
++ "source/opt/pass_manager.h",
++ "source/opt/passes.h",
++ "source/opt/private_to_local_pass.cpp",
++ "source/opt/private_to_local_pass.h",
++ "source/opt/process_lines_pass.cpp",
++ "source/opt/process_lines_pass.h",
++ "source/opt/propagator.cpp",
++ "source/opt/propagator.h",
++ "source/opt/reduce_load_size.cpp",
++ "source/opt/reduce_load_size.h",
++ "source/opt/redundancy_elimination.cpp",
++ "source/opt/redundancy_elimination.h",
++ "source/opt/reflect.h",
++ "source/opt/register_pressure.cpp",
++ "source/opt/register_pressure.h",
++ "source/opt/remove_duplicates_pass.cpp",
++ "source/opt/remove_duplicates_pass.h",
++ "source/opt/replace_invalid_opc.cpp",
++ "source/opt/replace_invalid_opc.h",
++ "source/opt/scalar_analysis.cpp",
++ "source/opt/scalar_analysis.h",
++ "source/opt/scalar_analysis_nodes.h",
++ "source/opt/scalar_analysis_simplification.cpp",
++ "source/opt/scalar_replacement_pass.cpp",
++ "source/opt/scalar_replacement_pass.h",
++ "source/opt/set_spec_constant_default_value_pass.cpp",
++ "source/opt/set_spec_constant_default_value_pass.h",
++ "source/opt/simplification_pass.cpp",
++ "source/opt/simplification_pass.h",
++ "source/opt/ssa_rewrite_pass.cpp",
++ "source/opt/ssa_rewrite_pass.h",
++ "source/opt/strength_reduction_pass.cpp",
++ "source/opt/strength_reduction_pass.h",
++ "source/opt/strip_debug_info_pass.cpp",
++ "source/opt/strip_debug_info_pass.h",
++ "source/opt/strip_reflect_info_pass.cpp",
++ "source/opt/strip_reflect_info_pass.h",
++ "source/opt/struct_cfg_analysis.cpp",
++ "source/opt/struct_cfg_analysis.h",
++ "source/opt/tree_iterator.h",
++ "source/opt/type_manager.cpp",
++ "source/opt/type_manager.h",
++ "source/opt/types.cpp",
++ "source/opt/types.h",
++ "source/opt/unify_const_pass.cpp",
++ "source/opt/unify_const_pass.h",
++ "source/opt/upgrade_memory_model.cpp",
++ "source/opt/upgrade_memory_model.h",
++ "source/opt/value_number_table.cpp",
++ "source/opt/value_number_table.h",
++ "source/opt/vector_dce.cpp",
++ "source/opt/vector_dce.h",
++ "source/opt/workaround1209.cpp",
++ "source/opt/workaround1209.h",
++ ]
++
++ deps = [
++ ":spvtools",
++ ]
++ public_deps = [
++ ":spvtools_headers",
++ ]
++
++ configs -= [ "//build/config/compiler:chromium_code" ]
++ configs += [
++ "//build/config/compiler:no_chromium_code",
++ ":spvtools_internal_config",
++ ]
++}
++
++group("SPIRV-Tools") {
++ deps = [
++ ":spvtools",
++ ":spvtools_opt",
++ ":spvtools_val",
++ ]
++}
++
++if (!build_with_chromium) {
++ googletest_dir = spirv_tools_googletest_dir
++
++ config("gtest_config") {
++ include_dirs = [
++ "${googletest_dir}/googletest",
++ "${googletest_dir}/googletest/include",
++ ]
++ }
++
++ static_library("gtest") {
++ testonly = true
++ sources = [
++ "${googletest_dir}/googletest/src/gtest-all.cc",
++ ]
++ public_configs = [ ":gtest_config" ]
++ }
++
++ config("gmock_config") {
++ include_dirs = [
++ "${googletest_dir}/googlemock",
++ "${googletest_dir}/googlemock/include",
++ "${googletest_dir}/googletest/include",
++ ]
++ if (is_clang) {
++ # TODO: Can remove this if/when the issue is fixed.
++ # https://github.com/google/googletest/issues/533
++ cflags = [ "-Wno-inconsistent-missing-override" ]
++ }
++ }
++
++ static_library("gmock") {
++ testonly = true
++ sources = [
++ "${googletest_dir}/googlemock/src/gmock-all.cc",
++ ]
++ public_configs = [ ":gmock_config" ]
++ }
++}
++
++test("spvtools_test") {
++ sources = [
++ "test/assembly_context_test.cpp",
++ "test/assembly_format_test.cpp",
++ "test/binary_destroy_test.cpp",
++ "test/binary_endianness_test.cpp",
++ "test/binary_header_get_test.cpp",
++ "test/binary_parse_test.cpp",
++ "test/binary_strnlen_s_test.cpp",
++ "test/binary_to_text.literal_test.cpp",
++ "test/binary_to_text_test.cpp",
++ "test/comment_test.cpp",
++ "test/enum_set_test.cpp",
++ "test/enum_string_mapping_test.cpp",
++ "test/ext_inst.debuginfo_test.cpp",
++ "test/ext_inst.glsl_test.cpp",
++ "test/ext_inst.opencl_test.cpp",
++ "test/fix_word_test.cpp",
++ "test/generator_magic_number_test.cpp",
++ "test/hex_float_test.cpp",
++ "test/immediate_int_test.cpp",
++ "test/libspirv_macros_test.cpp",
++ "test/name_mapper_test.cpp",
++ "test/named_id_test.cpp",
++ "test/opcode_make_test.cpp",
++ "test/opcode_require_capabilities_test.cpp",
++ "test/opcode_split_test.cpp",
++ "test/opcode_table_get_test.cpp",
++ "test/operand_capabilities_test.cpp",
++ "test/operand_pattern_test.cpp",
++ "test/operand_test.cpp",
++ "test/target_env_test.cpp",
++ "test/test_fixture.h",
++ "test/text_advance_test.cpp",
++ "test/text_destroy_test.cpp",
++ "test/text_literal_test.cpp",
++ "test/text_start_new_inst_test.cpp",
++ "test/text_to_binary.annotation_test.cpp",
++ "test/text_to_binary.barrier_test.cpp",
++ "test/text_to_binary.constant_test.cpp",
++ "test/text_to_binary.control_flow_test.cpp",
++ "test/text_to_binary.debug_test.cpp",
++ "test/text_to_binary.device_side_enqueue_test.cpp",
++ "test/text_to_binary.extension_test.cpp",
++ "test/text_to_binary.function_test.cpp",
++ "test/text_to_binary.group_test.cpp",
++ "test/text_to_binary.image_test.cpp",
++ "test/text_to_binary.literal_test.cpp",
++ "test/text_to_binary.memory_test.cpp",
++ "test/text_to_binary.misc_test.cpp",
++ "test/text_to_binary.mode_setting_test.cpp",
++ "test/text_to_binary.pipe_storage_test.cpp",
++ "test/text_to_binary.reserved_sampling_test.cpp",
++ "test/text_to_binary.subgroup_dispatch_test.cpp",
++ "test/text_to_binary.type_declaration_test.cpp",
++ "test/text_to_binary_test.cpp",
++ "test/text_word_get_test.cpp",
++ "test/unit_spirv.cpp",
++ "test/unit_spirv.h",
++ ]
++
++ deps = [
++ ":spvtools",
++ ":spvtools_language_header_unified1",
++ ":spvtools_val",
++ ]
++
++ if (build_with_chromium) {
++ deps += [
++ "//testing/gmock",
++ "//testing/gtest",
++ "//testing/gtest:gtest_main",
++ ]
++ } else {
++ deps += [
++ ":gmock",
++ ":gtest",
++ ]
++ sources += [ "${googletest_dir}/googletest/src/gtest_main.cc" ]
++ }
++
++ if (is_clang) {
++ cflags_cc = [ "-Wno-self-assign" ]
++ }
++
++ configs += [ ":spvtools_internal_config" ]
++}
++
++if (spirv_tools_standalone) {
++ group("fuzzers") {
++ testonly = true
++ deps = [
++ "test/fuzzers",
++ ]
++ }
++}
++
++executable("spirv-as") {
++ sources = [
++ "source/software_version.cpp",
++ "tools/as/as.cpp",
++ ]
++ deps = [
++ ":spvtools",
++ ":spvtools_build_version",
++ ]
++ configs += [ ":spvtools_internal_config" ]
++}
--- /dev/null
--- /dev/null
++# Copyright (c) 2015-2016 The Khronos Group Inc.
++#
++# 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.
++
++cmake_minimum_required(VERSION 2.8.12)
++if (POLICY CMP0048)
++ cmake_policy(SET CMP0048 NEW)
++endif()
++if (POLICY CMP0054)
++ # Avoid dereferencing variables or interpret keywords that have been
++ # quoted or bracketed.
++ # https://cmake.org/cmake/help/v3.1/policy/CMP0054.html
++ cmake_policy(SET CMP0054 NEW)
++endif()
++set_property(GLOBAL PROPERTY USE_FOLDERS ON)
++
++project(spirv-tools)
++enable_testing()
++set(SPIRV_TOOLS "SPIRV-Tools")
++
++include(GNUInstallDirs)
++include(cmake/setup_build.cmake)
++
++set(CMAKE_POSITION_INDEPENDENT_CODE ON)
++set(CMAKE_CXX_STANDARD 11)
++
++option(SPIRV_ALLOW_TIMERS "Allow timers via clock_gettime on supported platforms" ON)
++
++if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
++ add_definitions(-DSPIRV_LINUX)
++ set(SPIRV_TIMER_ENABLED ${SPIRV_ALLOW_TIMERS})
++elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
++ add_definitions(-DSPIRV_WINDOWS)
++elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN")
++ add_definitions(-DSPIRV_WINDOWS)
++elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
++ add_definitions(-DSPIRV_MAC)
++elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Android")
++ add_definitions(-DSPIRV_ANDROID)
++ set(SPIRV_TIMER_ENABLED ${SPIRV_ALLOW_TIMERS})
++elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
++ add_definitions(-DSPIRV_FREEBSD)
++else()
++ message(FATAL_ERROR "Your platform '${CMAKE_SYSTEM_NAME}' is not supported!")
++endif()
++
++if (${SPIRV_TIMER_ENABLED})
++ add_definitions(-DSPIRV_TIMER_ENABLED)
++endif()
++
++if ("${CMAKE_BUILD_TYPE}" STREQUAL "")
++ message(STATUS "No build type selected, default to Debug")
++ set(CMAKE_BUILD_TYPE "Debug")
++endif()
++
++option(SKIP_SPIRV_TOOLS_INSTALL "Skip installation" ${SKIP_SPIRV_TOOLS_INSTALL})
++if(NOT ${SKIP_SPIRV_TOOLS_INSTALL})
++ set(ENABLE_SPIRV_TOOLS_INSTALL ON)
++endif()
++
++option(SPIRV_BUILD_COMPRESSION "Build SPIR-V compressing codec" OFF)
++
++option(SPIRV_WERROR "Enable error on warning" ON)
++if(("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") OR (("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") AND (NOT CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")))
++ set(COMPILER_IS_LIKE_GNU TRUE)
++endif()
++if(${COMPILER_IS_LIKE_GNU})
++ set(SPIRV_WARNINGS -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers)
++
++ if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
++ set(SPIRV_WARNINGS ${SPIRV_WARNINGS} -Wno-self-assign)
++ endif()
++
++ option(SPIRV_WARN_EVERYTHING "Enable -Weverything" ${SPIRV_WARN_EVERYTHING})
++ if(${SPIRV_WARN_EVERYTHING})
++ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
++ set(SPIRV_WARNINGS ${SPIRV_WARNINGS}
++ -Weverything -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-padded)
++ elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
++ set(SPIRV_WARNINGS ${SPIRV_WARNINGS} -Wpedantic -pedantic-errors)
++ else()
++ message(STATUS "Unknown compiler ${CMAKE_CXX_COMPILER_ID}, "
++ "so SPIRV_WARN_EVERYTHING has no effect")
++ endif()
++ endif()
++
++ if(${SPIRV_WERROR})
++ set(SPIRV_WARNINGS ${SPIRV_WARNINGS} -Werror)
++ endif()
++elseif(MSVC)
++ set(SPIRV_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS /wd4800)
++
++ if(${SPIRV_WERROR})
++ set(SPIRV_WARNINGS ${SPIRV_WARNINGS} /WX)
++ endif()
++endif()
++
++include_directories(${CMAKE_CURRENT_SOURCE_DIR}/)
++
++option(SPIRV_COLOR_TERMINAL "Enable color terminal output" ON)
++if(${SPIRV_COLOR_TERMINAL})
++ add_definitions(-DSPIRV_COLOR_TERMINAL)
++endif()
++
++option(SPIRV_LOG_DEBUG "Enable excessive debug output" OFF)
++if(${SPIRV_LOG_DEBUG})
++ add_definitions(-DSPIRV_LOG_DEBUG)
++endif()
++
++if (DEFINED SPIRV_TOOLS_EXTRA_DEFINITIONS)
++ add_definitions(${SPIRV_TOOLS_EXTRA_DEFINITIONS})
++endif()
++
++function(spvtools_default_compile_options TARGET)
++ target_compile_options(${TARGET} PRIVATE ${SPIRV_WARNINGS})
++
++ if (${COMPILER_IS_LIKE_GNU})
++ target_compile_options(${TARGET} PRIVATE
++ -std=c++11 -fno-exceptions -fno-rtti)
++ target_compile_options(${TARGET} PRIVATE
++ -Wall -Wextra -Wno-long-long -Wshadow -Wundef -Wconversion
++ -Wno-sign-conversion)
++ # For good call stacks in profiles, keep the frame pointers.
++ if(NOT "${SPIRV_PERF}" STREQUAL "")
++ target_compile_options(${TARGET} PRIVATE -fno-omit-frame-pointer)
++ endif()
++ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
++ set(SPIRV_USE_SANITIZER "" CACHE STRING
++ "Use the clang sanitizer [address|memory|thread|...]")
++ if(NOT "${SPIRV_USE_SANITIZER}" STREQUAL "")
++ target_compile_options(${TARGET} PRIVATE
++ -fsanitize=${SPIRV_USE_SANITIZER})
++ endif()
++ target_compile_options(${TARGET} PRIVATE
++ -ftemplate-depth=1024)
++ else()
++ target_compile_options(${TARGET} PRIVATE
++ -Wno-missing-field-initializers)
++ endif()
++ endif()
++
++ if (MSVC)
++ # Specify /EHs for exception handling. This makes using SPIRV-Tools as
++ # dependencies in other projects easier.
++ target_compile_options(${TARGET} PRIVATE /EHs)
++ endif()
++
++ # For MinGW cross compile, statically link to the C++ runtime.
++ # But it still depends on MSVCRT.dll.
++ if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
++ if (${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
++ set_target_properties(${TARGET} PROPERTIES
++ LINK_FLAGS -static -static-libgcc -static-libstdc++)
++ endif()
++ endif()
++endfunction()
++
++if(NOT COMMAND find_host_package)
++ macro(find_host_package)
++ find_package(${ARGN})
++ endmacro()
++endif()
++if(NOT COMMAND find_host_program)
++ macro(find_host_program)
++ find_program(${ARGN})
++ endmacro()
++endif()
++
++find_host_package(PythonInterp)
++
++# Check for symbol exports on Linux.
++# At the moment, this check will fail on the OSX build machines for the Android NDK.
++# It appears they don't have objdump.
++if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
++ macro(spvtools_check_symbol_exports TARGET)
++ if (NOT "${SPIRV_SKIP_TESTS}")
++ add_test(NAME spirv-tools-symbol-exports-${TARGET}
++ COMMAND ${PYTHON_EXECUTABLE}
++ ${spirv-tools_SOURCE_DIR}/utils/check_symbol_exports.py "$<TARGET_FILE:${TARGET}>")
++ endif()
++ endmacro()
++else()
++ macro(spvtools_check_symbol_exports TARGET)
++ if (NOT "${SPIRV_SKIP_TESTS}")
++ message("Skipping symbol exports test for ${TARGET}")
++ endif()
++ endmacro()
++endif()
++
++# Defaults to OFF if the user didn't set it.
++option(SPIRV_SKIP_EXECUTABLES
++ "Skip building the executable and tests along with the library"
++ ${SPIRV_SKIP_EXECUTABLES})
++option(SPIRV_SKIP_TESTS
++ "Skip building tests along with the library" ${SPIRV_SKIP_TESTS})
++if ("${SPIRV_SKIP_EXECUTABLES}")
++ set(SPIRV_SKIP_TESTS ON)
++endif()
++
++# Defaults to ON. The checks can be time consuming.
++# Turn off if they take too long.
++option(SPIRV_CHECK_CONTEXT "In a debug build, check if the IR context is in a valid state." ON)
++if (${SPIRV_CHECK_CONTEXT})
++ add_definitions(-DSPIRV_CHECK_CONTEXT)
++endif()
++
++# Precompiled header macro. Parameters are source file list and filename for pch cpp file.
++macro(spvtools_pch SRCS PCHPREFIX)
++ if(MSVC AND CMAKE_GENERATOR MATCHES "^Visual Studio")
++ set(PCH_NAME "$(IntDir)\\${PCHPREFIX}.pch")
++ # make source files use/depend on PCH_NAME
++ set_source_files_properties(${${SRCS}} PROPERTIES COMPILE_FLAGS "/Yu${PCHPREFIX}.h /FI${PCHPREFIX}.h /Fp${PCH_NAME} /Zm300" OBJECT_DEPENDS "${PCH_NAME}")
++ # make PCHPREFIX.cpp file compile and generate PCH_NAME
++ set_source_files_properties("${PCHPREFIX}.cpp" PROPERTIES COMPILE_FLAGS "/Yc${PCHPREFIX}.h /Fp${PCH_NAME} /Zm300" OBJECT_OUTPUTS "${PCH_NAME}")
++ list(APPEND ${SRCS} "${PCHPREFIX}.cpp")
++ endif()
++endmacro(spvtools_pch)
++
++add_subdirectory(external)
++
++add_subdirectory(source)
++add_subdirectory(tools)
++
++add_subdirectory(test)
++add_subdirectory(examples)
++
++if(ENABLE_SPIRV_TOOLS_INSTALL)
++ install(
++ FILES
++ ${CMAKE_CURRENT_SOURCE_DIR}/include/spirv-tools/libspirv.h
++ ${CMAKE_CURRENT_SOURCE_DIR}/include/spirv-tools/libspirv.hpp
++ ${CMAKE_CURRENT_SOURCE_DIR}/include/spirv-tools/optimizer.hpp
++ ${CMAKE_CURRENT_SOURCE_DIR}/include/spirv-tools/linker.hpp
++ ${CMAKE_CURRENT_SOURCE_DIR}/include/spirv-tools/instrument.hpp
++ DESTINATION
++ ${CMAKE_INSTALL_INCLUDEDIR}/spirv-tools/)
++endif(ENABLE_SPIRV_TOOLS_INSTALL)
++
++if (NOT "${SPIRV_SKIP_TESTS}")
++ add_test(NAME spirv-tools-copyrights
++ COMMAND ${PYTHON_EXECUTABLE} utils/check_copyright.py
++ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
++endif()
++
++set(SPIRV_LIBRARIES "-lSPIRV-Tools -lSPIRV-Tools-link -lSPIRV-Tools-opt")
++set(SPIRV_SHARED_LIBRARIES "-lSPIRV-Tools-shared")
++if(SPIRV_BUILD_COMPRESSION)
++ set(SPIRV_LIBRARIES "${SPIRV_LIBRARIES} -lSPIRV-Tools-comp")
++endif(SPIRV_BUILD_COMPRESSION)
++
++# Build pkg-config file
++# Use a first-class target so it's regenerated when relevant files are updated.
++add_custom_target(spirv-tools-pkg-config ALL
++ COMMAND ${CMAKE_COMMAND}
++ -DCHANGES_FILE=${CMAKE_CURRENT_SOURCE_DIR}/CHANGES
++ -DTEMPLATE_FILE=${CMAKE_CURRENT_SOURCE_DIR}/cmake/SPIRV-Tools.pc.in
++ -DOUT_FILE=${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools.pc
++ -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
++ -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR}
++ -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR}
++ -DSPIRV_LIBRARIES=${SPIRV_LIBRARIES}
++ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/write_pkg_config.cmake
++ DEPENDS "CHANGES" "cmake/SPIRV-Tools.pc.in" "cmake/write_pkg_config.cmake")
++add_custom_target(spirv-tools-shared-pkg-config ALL
++ COMMAND ${CMAKE_COMMAND}
++ -DCHANGES_FILE=${CMAKE_CURRENT_SOURCE_DIR}/CHANGES
++ -DTEMPLATE_FILE=${CMAKE_CURRENT_SOURCE_DIR}/cmake/SPIRV-Tools-shared.pc.in
++ -DOUT_FILE=${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools-shared.pc
++ -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
++ -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR}
++ -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR}
++ -DSPIRV_SHARED_LIBRARIES=${SPIRV_SHARED_LIBRARIES}
++ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/write_pkg_config.cmake
++ DEPENDS "CHANGES" "cmake/SPIRV-Tools-shared.pc.in" "cmake/write_pkg_config.cmake")
++
++# Install pkg-config file
++if (ENABLE_SPIRV_TOOLS_INSTALL)
++ install(
++ FILES
++ ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools.pc
++ ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools-shared.pc
++ DESTINATION
++ ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
++endif()
--- /dev/null
--- /dev/null
++# SPIR-V Tools
++
++[![Build status](https://ci.appveyor.com/api/projects/status/gpue87cesrx3pi0d/branch/master?svg=true)](https://ci.appveyor.com/project/Khronoswebmaster/spirv-tools/branch/master)
++<img alt="Linux" src="kokoro/img/linux.png" width="20px" height="20px" hspace="2px"/>![Linux Build Status](https://storage.googleapis.com/spirv-tools/badges/build_status_linux_release.svg)
++<img alt="MacOS" src="kokoro/img/macos.png" width="20px" height="20px" hspace="2px"/>![MacOS Build Status](https://storage.googleapis.com/spirv-tools/badges/build_status_macos_release.svg)
++<img alt="Windows" src="kokoro/img/windows.png" width="20px" height="20px" hspace="2px"/>![Windows Build Status](https://storage.googleapis.com/spirv-tools/badges/build_status_windows_release.svg)
++
++## Overview
++
++The SPIR-V Tools project provides an API and commands for processing SPIR-V
++modules.
++
++The project includes an assembler, binary module parser, disassembler,
++validator, and optimizer for SPIR-V. Except for the optimizer, all are based
++on a common static library. The library contains all of the implementation
++details, and is used in the standalone tools whilst also enabling integration
++into other code bases directly. The optimizer implementation resides in its
++own library, which depends on the core library.
++
++The interfaces have stabilized:
++We don't anticipate making a breaking change for existing features.
++
++SPIR-V is defined by the Khronos Group Inc.
++See the [SPIR-V Registry][spirv-registry] for the SPIR-V specification,
++headers, and XML registry.
++
++## Versioning SPIRV-Tools
++
++See [`CHANGES`](CHANGES) for a high level summary of recent changes, by version.
++
++SPIRV-Tools project version numbers are of the form `v`*year*`.`*index* and with
++an optional `-dev` suffix to indicate work in progress. For exampe, the
++following versions are ordered from oldest to newest:
++
++* `v2016.0`
++* `v2016.1-dev`
++* `v2016.1`
++* `v2016.2-dev`
++* `v2016.2`
++
++Use the `--version` option on each command line tool to see the software
++version. An API call reports the software version as a C-style string.
++
++## Supported features
++
++### Assembler, binary parser, and disassembler
++
++* Support for SPIR-V 1.0, 1.1, 1.2, and 1.3
++ * Based on SPIR-V syntax described by JSON grammar files in the
++ [SPIRV-Headers](spirv-headers) repository.
++* Support for extended instruction sets:
++ * GLSL std450 version 1.0 Rev 3
++ * OpenCL version 1.0 Rev 2
++* Assembler only does basic syntax checking. No cross validation of
++ IDs or types is performed, except to check literal arguments to
++ `OpConstant`, `OpSpecConstant`, and `OpSwitch`.
++
++See [`syntax.md`](syntax.md) for the assembly language syntax.
++
++### Validator
++
++The validator checks validation rules described by the SPIR-V specification.
++
++Khronos recommends that tools that create or transform SPIR-V modules use the
++validator to ensure their outputs are valid, and that tools that consume SPIR-V
++modules optionally use the validator to protect themselves from bad inputs.
++This is especially encouraged for debug and development scenarios.
++
++The validator has one-sided error: it will only return an error when it has
++implemented a rule check and the module violates that rule.
++
++The validator is incomplete.
++See the [CHANGES](CHANGES) file for reports on completed work, and
++the [Validator
++sub-project](https://github.com/KhronosGroup/SPIRV-Tools/projects/1) for planned
++and in-progress work.
++
++*Note*: The validator checks some Universal Limits, from section 2.17 of the SPIR-V spec.
++The validator will fail on a module that exceeds those minimum upper bound limits.
++It is [future work](https://github.com/KhronosGroup/SPIRV-Tools/projects/1#card-1052403)
++to parameterize the validator to allow larger
++limits accepted by a more than minimally capable SPIR-V consumer.
++
++
++### Optimizer
++
++*Note:* The optimizer is still under development.
++
++Currently supported optimizations:
++* General
++ * Strip debug info
++* Specialization Constants
++ * Set spec constant default value
++ * Freeze spec constant
++ * Fold `OpSpecConstantOp` and `OpSpecConstantComposite`
++ * Unify constants
++ * Eliminate dead constant
++* Code Reduction
++ * Inline all function calls exhaustively
++ * Convert local access chains to inserts/extracts
++ * Eliminate local load/store in single block
++ * Eliminate local load/store with single store
++ * Eliminate local load/store with multiple stores
++ * Eliminate local extract from insert
++ * Eliminate dead instructions (aggressive)
++ * Eliminate dead branches
++ * Merge single successor / single predecessor block pairs
++ * Eliminate common uniform loads
++ * Remove duplicates: Capabilities, extended instruction imports, types, and
++ decorations.
++
++For the latest list with detailed documentation, please refer to
++[`include/spirv-tools/optimizer.hpp`](include/spirv-tools/optimizer.hpp).
++
++For suggestions on using the code reduction options, please refer to this [white paper](https://www.lunarg.com/shader-compiler-technologies/white-paper-spirv-opt/).
++
++
++### Linker
++
++*Note:* The linker is still under development.
++
++Current features:
++* Combine multiple SPIR-V binary modules together.
++* Combine into a library (exports are retained) or an executable (no symbols
++ are exported).
++
++See the [CHANGES](CHANGES) file for reports on completed work, and the [General
++sub-project](https://github.com/KhronosGroup/SPIRV-Tools/projects/2) for
++planned and in-progress work.
++
++### Extras
++
++* [Utility filters](#utility-filters)
++* Build target `spirv-tools-vimsyntax` generates file `spvasm.vim`.
++ Copy that file into your `$HOME/.vim/syntax` directory to get SPIR-V assembly syntax
++ highlighting in Vim. This build target is not built by default.
++
++## Contributing
++
++The SPIR-V Tools project is maintained by members of the The Khronos Group Inc.,
++and is hosted at https://github.com/KhronosGroup/SPIRV-Tools.
++
++Consider joining the `public_spirv_tools_dev@khronos.org` mailing list, via
++[https://www.khronos.org/spir/spirv-tools-mailing-list/](https://www.khronos.org/spir/spirv-tools-mailing-list/).
++The mailing list is used to discuss development plans for the SPIRV-Tools as an open source project.
++Once discussion is resolved,
++specific work is tracked via issues and sometimes in one of the
++[projects][spirv-tools-projects].
++
++(To provide feedback on the SPIR-V _specification_, file an issue on the
++[SPIRV-Headers][spirv-headers] GitHub repository.)
++
++See [`projects.md`](projects.md) to see how we use the
++[GitHub Project
++feature](https://help.github.com/articles/tracking-the-progress-of-your-work-with-projects/)
++to organize planned and in-progress work.
++
++Contributions via merge request are welcome. Changes should:
++* Be provided under the [Apache 2.0](#license).
++* You'll be prompted with a one-time "click-through"
++ [Khronos Open Source Contributor License Agreement][spirv-tools-cla]
++ (CLA) dialog as part of submitting your pull request or
++ other contribution to GitHub.
++* Include tests to cover updated functionality.
++* C++ code should follow the [Google C++ Style Guide][cpp-style-guide].
++* Code should be formatted with `clang-format`.
++ [kokoro/check-format/build.sh](kokoro/check-format/build.sh)
++ shows how to download it. Note that we currently use
++ `clang-format version 5.0.0` for SPIRV-Tools. Settings are defined by
++ the included [.clang-format](.clang-format) file.
++
++We intend to maintain a linear history on the GitHub `master` branch.
++
++### Source code organization
++
++* `example`: demo code of using SPIRV-Tools APIs
++* `external/googletest`: Intended location for the
++ [googletest][googletest] sources, not provided
++* `external/effcee`: Location of [Effcee][effcee] sources, if the `effcee` library
++ is not already configured by an enclosing project.
++* `external/re2`: Location of [RE2][re2] sources, if the `re2` library is not already
++ configured by an enclosing project.
++ (The Effcee project already requires RE2.)
++* `include/`: API clients should add this directory to the include search path
++* `external/spirv-headers`: Intended location for
++ [SPIR-V headers][spirv-headers], not provided
++* `include/spirv-tools/libspirv.h`: C API public interface
++* `source/`: API implementation
++* `test/`: Tests, using the [googletest][googletest] framework
++* `tools/`: Command line executables
++
++Example of getting sources, assuming SPIRV-Tools is configured as a standalone project:
++
++ git clone https://github.com/KhronosGroup/SPIRV-Tools.git spirv-tools
++ git clone https://github.com/KhronosGroup/SPIRV-Headers.git spirv-tools/external/spirv-headers
++ git clone https://github.com/google/googletest.git spirv-tools/external/googletest
++ git clone https://github.com/google/effcee.git spirv-tools/external/effcee
++ git clone https://github.com/google/re2.git spirv-tools/external/re2
++
++### Tests
++
++The project contains a number of tests, used to drive development
++and ensure correctness. The tests are written using the
++[googletest][googletest] framework. The `googletest`
++source is not provided with this project. There are two ways to enable
++tests:
++* If SPIR-V Tools is configured as part of an enclosing project, then the
++ enclosing project should configure `googletest` before configuring SPIR-V Tools.
++* If SPIR-V Tools is configured as a standalone project, then download the
++ `googletest` source into the `<spirv-dir>/external/googletest` directory before
++ configuring and building the project.
++
++*Note*: You must use a version of googletest that includes
++[a fix][googletest-pull-612] for [googletest issue 610][googletest-issue-610].
++The fix is included on the googletest master branch any time after 2015-11-10.
++In particular, googletest must be newer than version 1.7.0.
++
++### Dependency on Effcee
++
++Some tests depend on the [Effcee][effcee] library for stateful matching.
++Effcee itself depends on [RE2][re2].
++
++* If SPIRV-Tools is configured as part of a larger project that already uses
++ Effcee, then that project should include Effcee before SPIRV-Tools.
++* Otherwise, SPIRV-Tools expects Effcee sources to appear in `external/effcee`
++ and RE2 sources to appear in `external/re2`.
++
++
++## Build
++
++Instead of building manually, you can also download the binaries for your
++platform directly from the [master-tot release][master-tot-release] on GitHub.
++Those binaries are automatically uploaded by the buildbots after successful
++testing and they always reflect the current top of the tree of the master
++branch.
++
++The project uses [CMake][cmake] to generate platform-specific build
++configurations. Assume that `<spirv-dir>` is the root directory of the checked
++out code:
++
++```sh
++cd <spirv-dir>
++git clone https://github.com/KhronosGroup/SPIRV-Headers.git external/spirv-headers
++git clone https://github.com/google/effcee.git external/effcee
++git clone https://github.com/google/re2.git external/re2
++git clone https://github.com/google/googletest.git external/googletest # optional
++
++mkdir build && cd build
++cmake [-G <platform-generator>] <spirv-dir>
++```
++
++Once the build files have been generated, build using your preferred
++development environment.
++
++### CMake options
++
++The following CMake options are supported:
++
++* `SPIRV_COLOR_TERMINAL={ON|OFF}`, default `ON` - Enables color console output.
++* `SPIRV_SKIP_TESTS={ON|OFF}`, default `OFF`- Build only the library and
++ the command line tools. This will prevent the tests from being built.
++* `SPIRV_SKIP_EXECUTABLES={ON|OFF}`, default `OFF`- Build only the library, not
++ the command line tools and tests.
++* `SPIRV_BUILD_COMPRESSION={ON|OFF}`, default `OFF`- Build SPIR-V compressing
++ codec.
++* `SPIRV_USE_SANITIZER=<sanitizer>`, default is no sanitizing - On UNIX
++ platforms with an appropriate version of `clang` this option enables the use
++ of the sanitizers documented [here][clang-sanitizers].
++ This should only be used with a debug build.
++* `SPIRV_WARN_EVERYTHING={ON|OFF}`, default `OFF` - On UNIX platforms enable
++ more strict warnings. The code might not compile with this option enabled.
++ For Clang, enables `-Weverything`. For GCC, enables `-Wpedantic`.
++ See [`CMakeLists.txt`](CMakeLists.txt) for details.
++* `SPIRV_WERROR={ON|OFF}`, default `ON` - Forces a compilation error on any
++ warnings encountered by enabling the compiler-specific compiler front-end
++ option. No compiler front-end options are enabled when this option is OFF.
++
++Additionally, you can pass additional C preprocessor definitions to SPIRV-Tools
++via setting `SPIRV_TOOLS_EXTRA_DEFINITIONS`. For example, by setting it to
++`/D_ITERATOR_DEBUG_LEVEL=0` on Windows, you can disable checked iterators and
++iterator debugging.
++
++### Android
++
++SPIR-V Tools supports building static libraries `libSPIRV-Tools.a` and
++`libSPIRV-Tools-opt.a` for Android:
++
++```
++cd <spirv-dir>
++
++export ANDROID_NDK=/path/to/your/ndk
++
++mkdir build && cd build
++mkdir libs
++mkdir app
++
++$ANDROID_NDK/ndk-build -C ../android_test \
++ NDK_PROJECT_PATH=. \
++ NDK_LIBS_OUT=`pwd`/libs \
++ NDK_APP_OUT=`pwd`/app
++```
++
++## Library
++
++### Usage
++
++The internals of the library use C++11 features, and are exposed via both a C
++and C++ API.
++
++In order to use the library from an application, the include path should point
++to `<spirv-dir>/include`, which will enable the application to include the
++header `<spirv-dir>/include/spirv-tools/libspirv.h{|pp}` then linking against
++the static library in `<spirv-build-dir>/source/libSPIRV-Tools.a` or
++`<spirv-build-dir>/source/SPIRV-Tools.lib`.
++For optimization, the header file is
++`<spirv-dir>/include/spirv-tools/optimizer.hpp`, and the static library is
++`<spirv-build-dir>/source/libSPIRV-Tools-opt.a` or
++`<spirv-build-dir>/source/SPIRV-Tools-opt.lib`.
++
++* `SPIRV-Tools` CMake target: Creates the static library:
++ * `<spirv-build-dir>/source/libSPIRV-Tools.a` on Linux and OS X.
++ * `<spirv-build-dir>/source/libSPIRV-Tools.lib` on Windows.
++* `SPIRV-Tools-opt` CMake target: Creates the static library:
++ * `<spirv-build-dir>/source/libSPIRV-Tools-opt.a` on Linux and OS X.
++ * `<spirv-build-dir>/source/libSPIRV-Tools-opt.lib` on Windows.
++
++#### Entry points
++
++The interfaces are still under development, and are expected to change.
++
++There are five main entry points into the library in the C interface:
++
++* `spvTextToBinary`: An assembler, translating text to a binary SPIR-V module.
++* `spvBinaryToText`: A disassembler, translating a binary SPIR-V module to
++ text.
++* `spvBinaryParse`: The entry point to a binary parser API. It issues callbacks
++ for the header and each parsed instruction. The disassembler is implemented
++ as a client of `spvBinaryParse`.
++* `spvValidate` implements the validator functionality. *Incomplete*
++* `spvValidateBinary` implements the validator functionality. *Incomplete*
++
++The C++ interface is comprised of three classes, `SpirvTools`, `Optimizer` and
++`Linker`, all in the `spvtools` namespace.
++* `SpirvTools` provides `Assemble`, `Disassemble`, and `Validate` methods.
++* `Optimizer` provides methods for registering and running optimization passes.
++* `Linker` provides methods for combining together multiple binaries.
++
++## Command line tools
++
++Command line tools, which wrap the above library functions, are provided to
++assemble or disassemble shader files. It's a convention to name SPIR-V
++assembly and binary files with suffix `.spvasm` and `.spv`, respectively.
++
++### Assembler tool
++
++The assembler reads the assembly language text, and emits the binary form.
++
++The standalone assembler is the exectuable called `spirv-as`, and is located in
++`<spirv-build-dir>/tools/spirv-as`. The functionality of the assembler is implemented
++by the `spvTextToBinary` library function.
++
++* `spirv-as` - the standalone assembler
++ * `<spirv-dir>/tools/as`
++
++Use option `-h` to print help.
++
++### Disassembler tool
++
++The disassembler reads the binary form, and emits assembly language text.
++
++The standalone disassembler is the executable called `spirv-dis`, and is located in
++`<spirv-build-dir>/tools/spirv-dis`. The functionality of the disassembler is implemented
++by the `spvBinaryToText` library function.
++
++* `spirv-dis` - the standalone disassembler
++ * `<spirv-dir>/tools/dis`
++
++Use option `-h` to print help.
++
++The output includes syntax colouring when printing to the standard output stream,
++on Linux, Windows, and OS X.
++
++### Linker tool
++
++The linker combines multiple SPIR-V binary modules together, resulting in a single
++binary module as output.
++
++This is a work in progress.
++The linker does not support OpenCL program linking options related to math
++flags. (See section 5.6.5.2 in OpenCL 1.2)
++
++* `spirv-link` - the standalone linker
++ * `<spirv-dir>/tools/link`
++
++### Optimizer tool
++
++The optimizer processes a SPIR-V binary module, applying transformations
++in the specified order.
++
++This is a work in progress, with initially only few available transformations.
++
++* `spirv-opt` - the standalone optimizer
++ * `<spirv-dir>/tools/opt`
++
++### Validator tool
++
++*Warning:* This functionality is under development, and is incomplete.
++
++The standalone validator is the executable called `spirv-val`, and is located in
++`<spirv-build-dir>/tools/spirv-val`. The functionality of the validator is implemented
++by the `spvValidate` library function.
++
++The validator operates on the binary form.
++
++* `spirv-val` - the standalone validator
++ * `<spirv-dir>/tools/val`
++
++### Control flow dumper tool
++
++The control flow dumper prints the control flow graph for a SPIR-V module as a
++[GraphViz](http://www.graphviz.org/) graph.
++
++This is experimental.
++
++* `spirv-cfg` - the control flow graph dumper
++ * `<spirv-dir>/tools/cfg`
++
++### Utility filters
++
++* `spirv-lesspipe.sh` - Automatically disassembles `.spv` binary files for the
++ `less` program, on compatible systems. For example, set the `LESSOPEN`
++ environment variable as follows, assuming both `spirv-lesspipe.sh` and
++ `spirv-dis` are on your executable search path:
++ ```
++ export LESSOPEN='| spirv-lesspipe.sh "%s"'
++ ```
++ Then you page through a disassembled module as follows:
++ ```
++ less foo.spv
++ ```
++ * The `spirv-lesspipe.sh` script will pass through any extra arguments to
++ `spirv-dis`. So, for example, you can turn off colours and friendly ID
++ naming as follows:
++ ```
++ export LESSOPEN='| spirv-lesspipe.sh "%s" --no-color --raw-id'
++ ```
++
++* [vim-spirv](https://github.com/kbenzie/vim-spirv) - A vim plugin which
++ supports automatic disassembly of `.spv` files using the `:edit` command and
++ assembly using the `:write` command. The plugin also provides additional
++ features which include; syntax highlighting; highlighting of all ID's matching
++ the ID under the cursor; and highlighting errors where the `Instruction`
++ operand of `OpExtInst` is used without an appropriate `OpExtInstImport`.
++
++* `50spirv-tools.el` - Automatically disassembles '.spv' binary files when
++ loaded into the emacs text editor, and re-assembles them when saved,
++ provided any modifications to the file are valid. This functionality
++ must be explicitly requested by defining the symbol
++ SPIRV_TOOLS_INSTALL_EMACS_HELPERS as follows:
++ ```
++ cmake -DSPIRV_TOOLS_INSTALL_EMACS_HELPERS=true ...
++ ```
++
++ In addition, this helper is only installed if the directory /etc/emacs/site-start.d
++ exists, which is typically true if emacs is installed on the system.
++
++ Note that symbol IDs are not currently preserved through a load/edit/save operation.
++ This may change if the ability is added to spirv-as.
++
++
++### Tests
++
++Tests are only built when googletest is found. Use `ctest` to run all the
++tests.
++
++## Future Work
++<a name="future"></a>
++
++_See the [projects pages](https://github.com/KhronosGroup/SPIRV-Tools/projects)
++for more information._
++
++### Assembler and disassembler
++
++* The disassembler could emit helpful annotations in comments. For example:
++ * Use variable name information from debug instructions to annotate
++ key operations on variables.
++ * Show control flow information by annotating `OpLabel` instructions with
++ that basic block's predecessors.
++* Error messages could be improved.
++
++### Validator
++
++This is a work in progress.
++
++### Linker
++
++* The linker could accept math transformations such as allowing MADs, or other
++ math flags passed at linking-time in OpenCL.
++* Linkage attributes can not be applied through a group.
++* Check decorations of linked functions attributes.
++* Remove dead instructions, such as OpName targeting imported symbols.
++
++## Licence
++<a name="license"></a>
++Full license terms are in [LICENSE](LICENSE)
++```
++Copyright (c) 2015-2016 The Khronos Group Inc.
++
++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.
++```
++
++[spirv-tools-cla]: https://cla-assistant.io/KhronosGroup/SPIRV-Tools
++[spirv-tools-projects]: https://github.com/KhronosGroup/SPIRV-Tools/projects
++[spirv-tools-mailing-list]: https://www.khronos.org/spir/spirv-tools-mailing-list
++[spirv-registry]: https://www.khronos.org/registry/spir-v/
++[spirv-headers]: https://github.com/KhronosGroup/SPIRV-Headers
++[googletest]: https://github.com/google/googletest
++[googletest-pull-612]: https://github.com/google/googletest/pull/612
++[googletest-issue-610]: https://github.com/google/googletest/issues/610
++[effcee]: https://github.com/google/effcee
++[re2]: https://github.com/google/re2
++[CMake]: https://cmake.org/
++[cpp-style-guide]: https://google.github.io/styleguide/cppguide.html
++[clang-sanitizers]: http://clang.llvm.org/docs/UsersManual.html#controlling-code-generation
++[master-tot-release]: https://github.com/KhronosGroup/SPIRV-Tools/releases/tag/master-tot