1load(
2    ":build_defs.bzl",
3    "CLDEBUGINFO100_GRAMMAR_JSON_FILE",
4    "COMMON_COPTS",
5    "DEBUGINFO_GRAMMAR_JSON_FILE",
6    "SHDEBUGINFO100_GRAMMAR_JSON_FILE",
7    "TEST_COPTS",
8    "generate_core_tables",
9    "generate_enum_string_mapping",
10    "generate_extinst_lang_headers",
11    "generate_glsl_tables",
12    "generate_opencl_tables",
13    "generate_vendor_tables",
14    "incompatible_with",
15)
16
17package(
18    default_visibility = ["//visibility:private"],
19    features = [
20        "layering_check",
21    ],
22)
23
24licenses(["notice"])
25
26exports_files([
27    "CHANGES",
28    "LICENSE",
29])
30
31py_binary(
32    name = "generate_grammar_tables",
33    srcs = ["utils/generate_grammar_tables.py"],
34)
35
36py_binary(
37    name = "generate_language_headers",
38    srcs = ["utils/generate_language_headers.py"],
39)
40
41generate_core_tables(version = "unified1")
42
43generate_enum_string_mapping(version = "unified1")
44
45generate_opencl_tables(version = "unified1")
46
47generate_glsl_tables(version = "unified1")
48
49generate_vendor_tables(extension = "spv-amd-shader-explicit-vertex-parameter")
50
51generate_vendor_tables(extension = "spv-amd-shader-trinary-minmax")
52
53generate_vendor_tables(extension = "spv-amd-gcn-shader")
54
55generate_vendor_tables(extension = "spv-amd-shader-ballot")
56
57generate_vendor_tables(extension = "debuginfo")
58
59generate_vendor_tables(extension = "nonsemantic.clspvreflection")
60
61generate_vendor_tables(
62    extension = "opencl.debuginfo.100",
63    operand_kind_prefix = "CLDEBUG100_",
64)
65
66generate_vendor_tables(
67    extension = "nonsemantic.shader.debuginfo.100",
68    operand_kind_prefix = "SHDEBUG100_",
69)
70
71generate_extinst_lang_headers(
72    name = "DebugInfo",
73    grammar = DEBUGINFO_GRAMMAR_JSON_FILE,
74)
75
76generate_extinst_lang_headers(
77    name = "OpenCLDebugInfo100",
78    grammar = CLDEBUGINFO100_GRAMMAR_JSON_FILE,
79)
80
81generate_extinst_lang_headers(
82    name = "NonSemanticShaderDebugInfo100",
83    grammar = SHDEBUGINFO100_GRAMMAR_JSON_FILE,
84)
85
86py_binary(
87    name = "generate_registry_tables",
88    srcs = ["utils/generate_registry_tables.py"],
89)
90
91genrule(
92    name = "generators_inc",
93    srcs = ["@spirv_headers//:spirv_xml_registry"],
94    outs = ["generators.inc"],
95    cmd = "$(location :generate_registry_tables) --xml=$(location @spirv_headers//:spirv_xml_registry) --generator-output=$(location generators.inc)",
96    cmd_bat = "$(location :generate_registry_tables) --xml=$(location @spirv_headers//:spirv_xml_registry) --generator-output=$(location generators.inc)",
97    tools = [":generate_registry_tables"],
98)
99
100py_binary(
101    name = "update_build_version",
102    srcs = ["utils/update_build_version.py"],
103)
104
105genrule(
106    name = "build_version_inc",
107    srcs = ["CHANGES"],
108    outs = ["build-version.inc"],
109    cmd = "SOURCE_DATE_EPOCH=0 $(location :update_build_version) $(location CHANGES) $(location build-version.inc)",
110    cmd_bat = "set SOURCE_DATE_EPOCH=0  && $(location :update_build_version) $(location CHANGES) $(location build-version.inc)",
111    local = True,
112    tools = [":update_build_version"],
113)
114
115# Libraries
116
117cc_library(
118    name = "spirv_tools",
119    hdrs = [
120        "include/spirv-tools/libspirv.h",
121        "include/spirv-tools/libspirv.hpp",
122    ],
123    copts = COMMON_COPTS,
124    includes = ["include"],
125    linkstatic = 1,
126    visibility = ["//visibility:public"],
127    deps = [
128        ":spirv_tools_internal",
129    ],
130)
131
132cc_library(
133    name = "spirv_tools_internal",
134    srcs = glob([
135        "source/*.cpp",
136        "source/util/*.cpp",
137        "source/val/*.cpp",
138    ]) + [
139        ":build_version_inc",
140        ":gen_core_tables_unified1",
141        ":gen_enum_string_mapping",
142        ":gen_extinst_lang_headers_DebugInfo",
143        ":gen_extinst_lang_headers_NonSemanticShaderDebugInfo100",
144        ":gen_extinst_lang_headers_OpenCLDebugInfo100",
145        ":gen_glsl_tables_unified1",
146        ":gen_opencl_tables_unified1",
147        ":gen_vendor_tables_debuginfo",
148        ":gen_vendor_tables_nonsemantic_clspvreflection",
149        ":gen_vendor_tables_nonsemantic_shader_debuginfo_100",
150        ":gen_vendor_tables_opencl_debuginfo_100",
151        ":gen_vendor_tables_spv_amd_gcn_shader",
152        ":gen_vendor_tables_spv_amd_shader_ballot",
153        ":gen_vendor_tables_spv_amd_shader_explicit_vertex_parameter",
154        ":gen_vendor_tables_spv_amd_shader_trinary_minmax",
155        ":generators_inc",
156    ],
157    hdrs = [
158        "include/spirv-tools/libspirv.h",
159        "include/spirv-tools/libspirv.hpp",
160        ":gen_extinst_lang_headers_DebugInfo",
161        ":gen_extinst_lang_headers_NonSemanticShaderDebugInfo100",
162        ":gen_extinst_lang_headers_OpenCLDebugInfo100",
163    ] + glob([
164        "source/*.h",
165        "source/util/*.h",
166        "source/val/*.h",
167    ]),
168    copts = COMMON_COPTS,
169    includes = ["include"],
170    deps = [
171        "@spirv_headers//:spirv_common_headers",
172        "@spirv_headers//:spirv_cpp11_headers",
173    ],
174)
175
176cc_library(
177    name = "spirv_tools_opt",
178    hdrs = [
179        "include/spirv-tools/instrument.hpp",
180        "include/spirv-tools/optimizer.hpp",
181    ],
182    copts = COMMON_COPTS,
183    linkstatic = 1,
184    visibility = ["//visibility:public"],
185    deps = [
186        ":spirv_tools",
187        ":spirv_tools_opt_internal",
188    ],
189)
190
191cc_library(
192    name = "spirv_tools_opt_internal",
193    srcs = glob(["source/opt/*.cpp"]) + [
194        ":gen_vendor_tables_spv_amd_shader_ballot",
195    ],
196    hdrs = glob(["source/opt/*.h"]) + [
197        "include/spirv-tools/instrument.hpp",
198        "include/spirv-tools/optimizer.hpp",
199    ],
200    copts = COMMON_COPTS,
201    deps = [
202        ":spirv_tools_internal",
203        "@spirv_headers//:spirv_common_headers",
204    ],
205)
206
207cc_library(
208    name = "spirv_tools_reduce",
209    srcs = glob(["source/reduce/*.cpp"]),
210    hdrs = glob(["source/reduce/*.h"]),
211    copts = COMMON_COPTS,
212    deps = [
213        ":spirv_tools_internal",
214        ":spirv_tools_opt_internal",
215    ],
216)
217
218cc_library(
219    name = "spirv_tools_link",
220    srcs = glob(["source/link/*.cpp"]),
221    hdrs = ["include/spirv-tools/linker.hpp"],
222    copts = COMMON_COPTS,
223    linkstatic = 1,
224    visibility = ["//visibility:public"],
225    deps = [
226        ":spirv_tools_internal",
227        ":spirv_tools_opt_internal",
228    ],
229)
230
231cc_library(
232    name = "spirv_tools_lint_internal",
233    srcs = glob([
234        "source/lint/*.cpp",
235        "source/lint/*.h",
236    ]),
237    hdrs = ["include/spirv-tools/linter.hpp"] + glob([
238        "source/lint/*.h",
239    ]),
240    copts = COMMON_COPTS,
241    includes = ["include"],
242    deps = [
243        ":spirv_tools_internal",
244        ":spirv_tools_opt_internal",
245    ],
246)
247
248cc_library(
249    name = "spirv_tools_lint",
250    hdrs = ["include/spirv-tools/linter.hpp"],
251    copts = COMMON_COPTS,
252    includes = ["include"],
253    linkstatic = 1,
254    visibility = ["//visibility:public"],
255    deps = [
256        ":spirv_tools",
257        ":spirv_tools_lint_internal",
258    ],
259)
260
261cc_library(
262    name = "tools_util",
263    srcs = glob(["tools/util/*.cpp"]),
264    hdrs = glob(["tools/util/*.h"]),
265    copts = COMMON_COPTS,
266    deps = [":spirv_tools"],
267)
268
269cc_library(
270    name = "tools_io",
271    hdrs = ["tools/io.h"],
272    copts = COMMON_COPTS,
273)
274
275# Tools
276
277cc_binary(
278    name = "spirv-as",
279    srcs = [
280        "tools/as/as.cpp",
281    ],
282    copts = COMMON_COPTS,
283    visibility = ["//visibility:public"],
284    deps = [
285        ":spirv_tools_internal",
286        ":tools_io",
287        ":tools_util",
288    ],
289)
290
291cc_binary(
292    name = "spirv-dis",
293    srcs = [
294        "tools/dis/dis.cpp",
295    ],
296    copts = COMMON_COPTS,
297    visibility = ["//visibility:public"],
298    deps = [
299        ":spirv_tools",
300        ":tools_io",
301        ":tools_util",
302    ],
303)
304
305cc_binary(
306    name = "spirv-objdump",
307    srcs = [
308        "tools/objdump/extract_source.cpp",
309        "tools/objdump/extract_source.h",
310        "tools/objdump/objdump.cpp",
311    ],
312    copts = COMMON_COPTS,
313    visibility = ["//visibility:public"],
314    deps = [
315        ":spirv_tools_internal",
316        ":spirv_tools_opt_internal",
317        ":tools_io",
318        ":tools_util",
319        "@spirv_headers//:spirv_cpp_headers",
320    ],
321)
322
323cc_binary(
324    name = "spirv-val",
325    srcs = [
326        "tools/val/val.cpp",
327    ],
328    copts = COMMON_COPTS,
329    visibility = ["//visibility:public"],
330    deps = [
331        ":spirv_tools_internal",
332        ":tools_io",
333        ":tools_util",
334    ],
335)
336
337cc_binary(
338    name = "spirv-opt",
339    srcs = [
340        "tools/opt/opt.cpp",
341    ],
342    copts = COMMON_COPTS,
343    visibility = ["//visibility:public"],
344    deps = [
345        ":spirv_tools_internal",
346        ":spirv_tools_opt_internal",
347        ":tools_io",
348        ":tools_util",
349    ],
350)
351
352cc_binary(
353    name = "spirv-reduce",
354    srcs = [
355        "tools/reduce/reduce.cpp",
356    ],
357    copts = COMMON_COPTS,
358    visibility = ["//visibility:public"],
359    deps = [
360        ":spirv_tools_internal",
361        ":spirv_tools_opt_internal",
362        ":spirv_tools_reduce",
363        ":tools_io",
364        ":tools_util",
365    ],
366)
367
368cc_binary(
369    name = "spirv-link",
370    srcs = [
371        "tools/link/linker.cpp",
372    ],
373    copts = COMMON_COPTS,
374    visibility = ["//visibility:public"],
375    deps = [
376        ":spirv_tools_internal",
377        ":spirv_tools_link",
378        ":tools_io",
379        ":tools_util",
380    ],
381)
382
383cc_binary(
384    name = "spirv-lint",
385    srcs = [
386        "tools/lint/lint.cpp",
387    ],
388    copts = COMMON_COPTS,
389    visibility = ["//visibility:public"],
390    deps = [
391        ":spirv_tools_lint",
392        ":spirv_tools_opt_internal",
393        ":tools_io",
394        ":tools_util",
395    ],
396)
397
398cc_binary(
399    name = "spirv-cfg",
400    srcs = [
401        "tools/cfg/bin_to_dot.cpp",
402        "tools/cfg/bin_to_dot.h",
403        "tools/cfg/cfg.cpp",
404    ],
405    copts = COMMON_COPTS,
406    visibility = ["//visibility:public"],
407    deps = [
408        ":spirv_tools_internal",
409        ":tools_io",
410        ":tools_util",
411    ],
412)
413
414# Unit tests
415
416cc_library(
417    name = "test_lib",
418    testonly = 1,
419    srcs = [
420        "test/unit_spirv.cpp",
421    ],
422    hdrs = [
423        "test/test_fixture.h",
424        "test/unit_spirv.h",
425    ],
426    copts = TEST_COPTS,
427    deps = [
428        ":spirv_tools_internal",
429        "@com_google_googletest//:gtest",
430    ],
431)
432
433# PCH (precompiled header) tests only work when using CMake and MSVC on Windows,
434# so they will be skipped in the Bazel builds.
435
436[cc_test(
437    name = "base_{testcase}_test".format(testcase = f[len("test/"):-len("_test.cpp")]),
438    size = "small",
439    srcs = [f],
440    copts = TEST_COPTS + ["-DTESTING"],
441    linkstatic = 1,
442    target_compatible_with = {
443        "test/timer_test.cpp": incompatible_with(["@bazel_tools//src/conditions:windows"]),
444    }.get(f, []),
445    deps = [
446        "tools_util",
447        ":spirv_tools_internal",
448        ":test_lib",
449        "@com_google_googletest//:gtest",
450        "@com_google_googletest//:gtest_main",
451    ],
452) for f in glob(
453    [
454        "test/*_test.cpp",
455        "test/tools/*_test.cpp",
456    ],
457    exclude = [
458        "test/cpp_interface_test.cpp",
459        "test/pch_test.cpp",
460    ],
461)]
462
463cc_test(
464    name = "base_cpp_interface_test",
465    size = "small",
466    srcs = ["test/cpp_interface_test.cpp"],
467    linkstatic = 1,
468    deps = [
469        ":spirv_tools_opt_internal",
470        "@com_google_googletest//:gtest",
471        "@com_google_googletest//:gtest_main",
472        "@spirv_headers//:spirv_cpp11_headers",
473    ],
474)
475
476cc_test(
477    name = "base_ilist_test",
478    size = "small",
479    srcs = ["test/util/ilist_test.cpp"],
480    copts = TEST_COPTS,
481    linkstatic = 1,
482    deps = [
483        ":spirv_tools_internal",
484        "@com_google_googletest//:gtest",
485        "@com_google_googletest//:gtest_main",
486    ],
487)
488
489cc_library(
490    name = "link_test_lib",
491    testonly = 1,
492    hdrs = ["test/link/linker_fixture.h"],
493    copts = TEST_COPTS,
494    deps = [
495        ":spirv_tools_internal",
496        ":spirv_tools_link",
497        ":test_lib",
498        "@com_google_effcee//:effcee",
499        "@com_googlesource_code_re2//:re2",
500    ],
501)
502
503[cc_test(
504    name = "link_{testcase}_test".format(testcase = f[len("test/link/"):-len("_test.cpp")]),
505    size = "small",
506    srcs = [f],
507    copts = TEST_COPTS,
508    linkstatic = 1,
509    deps = [
510        ":link_test_lib",
511        "@com_google_googletest//:gtest",
512        "@com_google_googletest//:gtest_main",
513    ],
514) for f in glob(
515    ["test/link/*_test.cpp"],
516)]
517
518[cc_test(
519    name = "lint_{testcase}_test".format(testcase = f[len("test/lint/"):-len("_test.cpp")]),
520    size = "small",
521    srcs = [f],
522    copts = TEST_COPTS,
523    linkstatic = 1,
524    deps = [
525        ":spirv_tools",
526        ":spirv_tools_lint_internal",
527        ":spirv_tools_opt_internal",
528        "@com_google_googletest//:gtest",
529        "@com_google_googletest//:gtest_main",
530    ],
531) for f in glob(
532    ["test/lint/*_test.cpp"],
533)]
534
535cc_library(
536    name = "opt_test_lib",
537    testonly = 1,
538    srcs = [
539        "test/opt/pass_utils.cpp",
540    ],
541    hdrs = [
542        "test/opt/assembly_builder.h",
543        "test/opt/function_utils.h",
544        "test/opt/module_utils.h",
545        "test/opt/pass_fixture.h",
546        "test/opt/pass_utils.h",
547    ],
548    copts = TEST_COPTS,
549    deps = [
550        ":spirv_tools_internal",
551        ":spirv_tools_opt_internal",
552        "@com_google_effcee//:effcee",
553        "@com_google_googletest//:gtest",
554    ],
555)
556
557[cc_test(
558    name = "opt_{testcase}_test".format(testcase = f[len("test/opt/"):-len("_test.cpp")]),
559    size = "small",
560    srcs = [f],
561    copts = TEST_COPTS,
562    linkstatic = 1,
563    deps = [
564        ":opt_test_lib",
565        ":spirv_tools_internal",
566        ":spirv_tools_opt_internal",
567        ":test_lib",
568        "@com_google_effcee//:effcee",
569        "@com_google_googletest//:gtest",
570        "@com_google_googletest//:gtest_main",
571    ],
572) for f in glob(["test/opt/*_test.cpp"])]
573
574[cc_test(
575    name = "opt_dom_tree_{testcase}_test".format(testcase = f[len("test/opt/dominator_tree/"):-len(".cpp")]),
576    size = "small",
577    srcs = [f],
578    copts = TEST_COPTS,
579    linkstatic = 1,
580    deps = [
581        ":opt_test_lib",
582        ":spirv_tools_opt_internal",
583        "@com_google_googletest//:gtest",
584        "@com_google_googletest//:gtest_main",
585    ],
586) for f in glob(
587    ["test/opt/dominator_tree/*.cpp"],
588    exclude = ["test/opt/dominator_tree/pch_test_opt_dom.cpp"],
589)]
590
591[cc_test(
592    name = "opt_loop_{testcase}_test".format(testcase = f[len("test/opt/loop_optimizations/"):-len(".cpp")]),
593    size = "small",
594    srcs = [f],
595    copts = TEST_COPTS,
596    linkstatic = 1,
597    deps = [
598        ":opt_test_lib",
599        ":spirv_tools",
600        ":spirv_tools_opt_internal",
601        "@com_google_effcee//:effcee",
602        "@com_google_googletest//:gtest",
603        "@com_google_googletest//:gtest_main",
604    ],
605) for f in glob(
606    ["test/opt/loop_optimizations/*.cpp"],
607    exclude = ["test/opt/loop_optimizations/pch_test_opt_loop.cpp"],
608)]
609
610cc_library(
611    name = "reduce_test_lib",
612    testonly = 1,
613    srcs = [
614        "test/reduce/reduce_test_util.cpp",
615    ],
616    hdrs = ["test/reduce/reduce_test_util.h"],
617    copts = TEST_COPTS,
618    deps = [
619        ":spirv_tools",
620        ":spirv_tools_opt_internal",
621        ":spirv_tools_reduce",
622        ":test_lib",
623        ":tools_io",
624        "@com_google_googletest//:gtest",
625    ],
626)
627
628[cc_test(
629    name = "reduce_{testcase}_test".format(testcase = f[len("test/reduce/"):-len("_test.cpp")]),
630    size = "small",
631    srcs = [f],
632    copts = TEST_COPTS,
633    linkstatic = 1,
634    deps = [
635        ":reduce_test_lib",
636        ":spirv_tools_internal",
637        ":spirv_tools_opt_internal",
638        ":spirv_tools_reduce",
639        "@com_google_googletest//:gtest_main",
640    ],
641) for f in glob(["test/reduce/*_test.cpp"])]
642
643[cc_test(
644    name = "util_{testcase}_test".format(testcase = f[len("test/util/"):-len("_test.cpp")]),
645    size = "small",
646    srcs = [f],
647    copts = TEST_COPTS,
648    linkstatic = 1,
649    deps = [
650        ":spirv_tools_internal",
651        "@com_google_googletest//:gtest",
652        "@com_google_googletest//:gtest_main",
653    ],
654) for f in glob(["test/util/*_test.cpp"])]
655
656cc_library(
657    name = "val_test_lib",
658    testonly = 1,
659    srcs = [
660        "test/val/val_code_generator.cpp",
661    ],
662    hdrs = [
663        "test/val/val_code_generator.h",
664        "test/val/val_fixtures.h",
665    ],
666    copts = TEST_COPTS,
667    deps = [
668        ":spirv_tools_internal",
669        ":test_lib",
670    ],
671)
672
673[cc_test(
674    name = "val_{testcase}_test".format(testcase = f[len("test/val/val_"):-len("_test.cpp")]),
675    size = "small",
676    srcs = [f],
677    copts = TEST_COPTS,
678    linkstatic = 1,
679    deps = [
680        ":spirv_tools_internal",
681        ":test_lib",
682        ":val_test_lib",
683        "@com_google_googletest//:gtest",
684        "@com_google_googletest//:gtest_main",
685    ],
686) for f in glob(
687    ["test/val/val_*_test.cpp"],
688    exclude = [
689        "test/val/val_capability_test.cpp",
690        "test/val/val_limits_test.cpp",
691    ],
692)]
693
694cc_test(
695    name = "val_capability_test",
696    size = "large",
697    timeout = "long",
698    srcs = ["test/val/val_capability_test.cpp"],
699    copts = TEST_COPTS + ["-O3"],
700    linkstatic = 1,
701    deps = [
702        ":spirv_tools_internal",
703        ":test_lib",
704        ":val_test_lib",
705        "@com_google_googletest//:gtest",
706        "@com_google_googletest//:gtest_main",
707    ],
708)
709
710cc_test(
711    name = "val_limits_test",
712    size = "large",
713    timeout = "long",
714    srcs = ["test/val/val_limits_test.cpp"],
715    copts = TEST_COPTS + [
716        "-O3",
717    ],
718    linkstatic = 1,
719    deps = [
720        ":test_lib",
721        ":val_test_lib",
722        "@com_google_googletest//:gtest",
723        "@com_google_googletest//:gtest_main",
724    ],
725)
726