blob: 1f7cacded73e8118791426f732ac372b4cc5c305 [file] [log] [blame]
"""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"],
)