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