"""Constants and macros for spirv-tools BUILD.""" COMMON_COPTS = [ "-DSPIRV_CHECK_CONTEXT", "-DSPIRV_COLOR_TERMINAL", ] + select({ "@platforms//os:windows": [], "//conditions:default": [ "-DSPIRV_LINUX", "-DSPIRV_TIMER_ENABLED", "-fvisibility=hidden", "-fno-exceptions", "-fno-rtti", "-Wall", "-Wextra", "-Wnon-virtual-dtor", "-Wno-missing-field-initializers", "-Werror", "-Wno-long-long", "-Wshadow", "-Wundef", "-Wconversion", "-Wno-sign-conversion", ], }) TEST_COPTS = COMMON_COPTS + [ ] + select({ "@platforms//os:windows": [ # Disable C4503 "decorated name length exceeded" warning, # triggered by some heavily templated types. # We don't care much about that in test code. # Important to do since we have warnings-as-errors. "/wd4503", ], "//conditions:default": [ "-Wno-undef", "-Wno-self-assign", "-Wno-shadow", "-Wno-unused-parameter", ], }) def incompatible_with(incompatible_constraints): return select(_merge_dicts([{"//conditions:default": []}, { constraint: ["@platforms//:incompatible"] for constraint in incompatible_constraints }])) SPIRV_CORE_GRAMMAR_JSON_FILE = "@spirv_headers//:spirv_core_grammar_unified1" DEBUGINFO_GRAMMAR_JSON_FILE = "@spirv_headers//:spirv_ext_inst_debuginfo_grammar_unified1" CLDEBUGINFO100_GRAMMAR_JSON_FILE = "@spirv_headers//:spirv_ext_inst_opencl_debuginfo_100_grammar_unified1" SHDEBUGINFO100_GRAMMAR_JSON_FILE = "@spirv_headers//:spirv_ext_inst_nonsemantic_shader_debuginfo_100_grammar_unified1" def _merge_dicts(dicts): merged = {} for d in dicts: merged.update(d) return merged def ExtInst(name, target = "", prefix =""): """ Returns a dictionary specifying the info needed to process an extended instruction set. Args: name: The extension name; forms part of the .json grammar file. target: if non-empty, the name of the bazel target in spirv-headers that names the JSON grammar file for the extended instrution set. If empty, the target name is derived from 'name'. prefix: The optional prefix for names of operand enums. Returns a dictionary with keys 'name', 'target', 'prefix' and the corresponding values. """ return {'name':name, 'target':target, 'prefix':prefix} def _extinst_grammar_target(e): """ Args: e, as returned from extinst Returns the SPIRV-Headers target for the given extended instruction set spec. """ target = e['target'] name = e['name'] if len(target) > 0: return "@spirv_headers//:{}".format(target) name_part = name.replace("-", "_").replace(".", "_") return "@spirv_headers//:spirv_ext_inst_{}_grammar_unified1".format(name_part) def create_grammar_tables_target(name, extinsts): """ Creates a ":gen_compressed_tables" target for SPIR-V instruction set grammar tables. Args: name: unused. Required by convention. extinsts: list of extended instruction specs. Each spec is a dictionary, as returned from 'extinst'. """ grammars = dict( core_grammar = SPIRV_CORE_GRAMMAR_JSON_FILE, ) outs = dict( core_tables_header_output = "core_tables_header.inc", core_tables_body_output = "core_tables_body.inc", ) extinst_args = [] for e in extinsts: extinst_args.append('--extinst={},$(location {})'.format(e['prefix'],_extinst_grammar_target(e))) cmd = ( "$(location :ggt)" + " --spirv-core-grammar=$(location {core_grammar})" + " --core-tables-body-output=$(location {core_tables_body_output})" + " --core-tables-header-output=$(location {core_tables_header_output})" + " " + " ".join(extinst_args) ).format(**_merge_dicts([grammars, outs])) native.genrule( name = "gen_compressed_tables", srcs = grammars.values() + [_extinst_grammar_target(e) for e in extinsts], outs = outs.values(), cmd = cmd, cmd_bat = cmd, tools = [":ggt"], visibility = ["//visibility:private"], ) def generate_extinst_lang_headers(name, grammar = None): """ Creates a :gen_extinst_lang_headers_* target for a C++ header the enums in a SPIR-V extended instruction set. Args: name: the basename of the emitted header file. grammar: the path to the JSON grammar file for the extended instruction set. """ if not grammar: fail("Must specify grammar", "grammar") outs = dict( extinst_output_path = name + ".h", ) cmd = ( "$(location :generate_language_headers)" + " --extinst-grammar=$<" + " --extinst-output-path=$(location {extinst_output_path})" ).format(**outs) native.genrule( name = "gen_extinst_lang_headers_{}".format(name), srcs = [grammar], outs = outs.values(), cmd = cmd, cmd_bat = cmd, tools = [":generate_language_headers"], visibility = ["//visibility:private"], )