1"""Constants and macros for spirv-tools BUILD."""
2
3COMMON_COPTS = [
4    "-DSPIRV_CHECK_CONTEXT",
5    "-DSPIRV_COLOR_TERMINAL",
6] + select({
7    "@platforms//os:windows": [],
8    "//conditions:default": [
9        "-DSPIRV_LINUX",
10        "-DSPIRV_TIMER_ENABLED",
11        "-fvisibility=hidden",
12        "-fno-exceptions",
13        "-fno-rtti",
14        "-Wall",
15        "-Wextra",
16        "-Wnon-virtual-dtor",
17        "-Wno-missing-field-initializers",
18        "-Werror",
19        "-Wno-long-long",
20        "-Wshadow",
21        "-Wundef",
22        "-Wconversion",
23        "-Wno-sign-conversion",
24    ],
25})
26
27TEST_COPTS = COMMON_COPTS + [
28] + select({
29    "@platforms//os:windows": [
30        # Disable C4503 "decorated name length exceeded" warning,
31        # triggered by some heavily templated types.
32        # We don't care much about that in test code.
33        # Important to do since we have warnings-as-errors.
34        "/wd4503",
35    ],
36    "//conditions:default": [
37        "-Wno-undef",
38        "-Wno-self-assign",
39        "-Wno-shadow",
40        "-Wno-unused-parameter",
41    ],
42})
43
44def incompatible_with(incompatible_constraints):
45    return select(_merge_dicts([{"//conditions:default": []}, {
46        constraint: ["@platforms//:incompatible"]
47        for constraint in incompatible_constraints
48    }]))
49
50DEBUGINFO_GRAMMAR_JSON_FILE = "@spirv_headers//:spirv_ext_inst_debuginfo_grammar_unified1"
51CLDEBUGINFO100_GRAMMAR_JSON_FILE = "@spirv_headers//:spirv_ext_inst_opencl_debuginfo_100_grammar_unified1"
52SHDEBUGINFO100_GRAMMAR_JSON_FILE = "@spirv_headers//:spirv_ext_inst_nonsemantic_shader_debuginfo_100_grammar_unified1"
53
54def _merge_dicts(dicts):
55    merged = {}
56    for d in dicts:
57        merged.update(d)
58    return merged
59
60def generate_core_tables(version):
61    if not version:
62        fail("Must specify version", "version")
63
64    grammars = dict(
65        core_grammar = "@spirv_headers//:spirv_core_grammar_{}".format(version),
66        debuginfo_grammar = DEBUGINFO_GRAMMAR_JSON_FILE,
67        cldebuginfo_grammar = CLDEBUGINFO100_GRAMMAR_JSON_FILE,
68    )
69
70    outs = dict(
71        core_insts_output = "core.insts-{}.inc".format(version),
72        operand_kinds_output = "operand.kinds-{}.inc".format(version),
73    )
74
75    cmd = (
76        "$(location :generate_grammar_tables)" +
77        " --spirv-core-grammar=$(location {core_grammar})" +
78        " --extinst-debuginfo-grammar=$(location {debuginfo_grammar})" +
79        " --extinst-cldebuginfo100-grammar=$(location {cldebuginfo_grammar})" +
80        " --core-insts-output=$(location {core_insts_output})" +
81        " --operand-kinds-output=$(location {operand_kinds_output})" +
82        " --output-language=c++"
83    ).format(**_merge_dicts([grammars, outs]))
84
85    native.genrule(
86        name = "gen_core_tables_" + version,
87        srcs = grammars.values(),
88        outs = outs.values(),
89        cmd = cmd,
90        cmd_bat = cmd,
91        tools = [":generate_grammar_tables"],
92        visibility = ["//visibility:private"],
93    )
94
95def generate_enum_string_mapping(version):
96    if not version:
97        fail("Must specify version", "version")
98
99    grammars = dict(
100        core_grammar = "@spirv_headers//:spirv_core_grammar_{}".format(version),
101        debuginfo_grammar = DEBUGINFO_GRAMMAR_JSON_FILE,
102        cldebuginfo_grammar = CLDEBUGINFO100_GRAMMAR_JSON_FILE,
103    )
104
105    outs = dict(
106        extension_enum_ouput = "extension_enum.inc",
107        enum_string_mapping_output = "enum_string_mapping.inc",
108    )
109
110    cmd = (
111        "$(location :generate_grammar_tables)" +
112        " --spirv-core-grammar=$(location {core_grammar})" +
113        " --extinst-debuginfo-grammar=$(location {debuginfo_grammar})" +
114        " --extinst-cldebuginfo100-grammar=$(location {cldebuginfo_grammar})" +
115        " --extension-enum-output=$(location {extension_enum_ouput})" +
116        " --enum-string-mapping-output=$(location {enum_string_mapping_output})" +
117        " --output-language=c++"
118    ).format(**_merge_dicts([grammars, outs]))
119
120    native.genrule(
121        name = "gen_enum_string_mapping",
122        srcs = grammars.values(),
123        outs = outs.values(),
124        cmd = cmd,
125        cmd_bat = cmd,
126        tools = [":generate_grammar_tables"],
127        visibility = ["//visibility:private"],
128    )
129
130def generate_opencl_tables(version):
131    if not version:
132        fail("Must specify version", "version")
133
134    grammars = dict(
135        opencl_grammar = "@spirv_headers//:spirv_opencl_grammar_{}".format(version),
136    )
137
138    outs = dict(
139        opencl_insts_output = "opencl.std.insts.inc",
140    )
141
142    cmd = (
143        "$(location :generate_grammar_tables)" +
144        " --extinst-opencl-grammar=$(location {opencl_grammar})" +
145        " --opencl-insts-output=$(location {opencl_insts_output})"
146    ).format(**_merge_dicts([grammars, outs]))
147
148    native.genrule(
149        name = "gen_opencl_tables_" + version,
150        srcs = grammars.values(),
151        outs = outs.values(),
152        cmd = cmd,
153        cmd_bat = cmd,
154        tools = [":generate_grammar_tables"],
155        visibility = ["//visibility:private"],
156    )
157
158def generate_glsl_tables(version):
159    if not version:
160        fail("Must specify version", "version")
161
162    grammars = dict(
163        gsls_grammar = "@spirv_headers//:spirv_glsl_grammar_{}".format(version),
164    )
165    outs = dict(
166        gsls_insts_outs = "glsl.std.450.insts.inc",
167    )
168
169    cmd = (
170        "$(location :generate_grammar_tables)" +
171        " --extinst-glsl-grammar=$(location {gsls_grammar})" +
172        " --glsl-insts-output=$(location {gsls_insts_outs})" +
173        " --output-language=c++"
174    ).format(**_merge_dicts([grammars, outs]))
175
176    native.genrule(
177        name = "gen_glsl_tables_" + version,
178        srcs = grammars.values(),
179        outs = outs.values(),
180        cmd = cmd,
181        cmd_bat = cmd,
182        tools = [":generate_grammar_tables"],
183        visibility = ["//visibility:private"],
184    )
185
186def generate_vendor_tables(extension, operand_kind_prefix = ""):
187    if not extension:
188        fail("Must specify extension", "extension")
189
190    extension_rule = extension.replace("-", "_").replace(".", "_")
191    grammars = dict(
192        vendor_grammar = "@spirv_headers//:spirv_ext_inst_{}_grammar_unified1".format(extension_rule),
193    )
194    outs = dict(
195        vendor_insts_output = "{}.insts.inc".format(extension),
196    )
197    cmd = (
198        "$(location :generate_grammar_tables)" +
199        " --extinst-vendor-grammar=$(location {vendor_grammar})" +
200        " --vendor-insts-output=$(location {vendor_insts_output})" +
201        " --vendor-operand-kind-prefix={operand_kind_prefix}"
202    ).format(operand_kind_prefix = operand_kind_prefix, **_merge_dicts([grammars, outs]))
203
204    native.genrule(
205        name = "gen_vendor_tables_" + extension_rule,
206        srcs = grammars.values(),
207        outs = outs.values(),
208        cmd = cmd,
209        cmd_bat = cmd,
210        tools = [":generate_grammar_tables"],
211        visibility = ["//visibility:private"],
212    )
213
214def generate_extinst_lang_headers(name, grammar = None):
215    if not grammar:
216        fail("Must specify grammar", "grammar")
217    outs = dict(
218        extinst_output_path = name + ".h",
219    )
220    cmd = (
221        "$(location :generate_language_headers)" +
222        " --extinst-grammar=$<" +
223        " --extinst-output-path=$(location {extinst_output_path})"
224    ).format(**outs)
225
226    native.genrule(
227        name = "gen_extinst_lang_headers_{}".format(name),
228        srcs = [grammar],
229        outs = outs.values(),
230        cmd = cmd,
231        cmd_bat = cmd,
232        tools = [":generate_language_headers"],
233        visibility = ["//visibility:private"],
234    )
235