SPIRV-Tools/BUILD.bazel

728 lines
17 KiB
Python
Raw Normal View History

load(
":build_defs.bzl",
"CLDEBUGINFO100_GRAMMAR_JSON_FILE",
"COMMON_COPTS",
"DEBUGINFO_GRAMMAR_JSON_FILE",
"SHDEBUGINFO100_GRAMMAR_JSON_FILE",
"TEST_COPTS",
"generate_core_tables",
"generate_enum_string_mapping",
"generate_extinst_lang_headers",
"generate_glsl_tables",
"generate_opencl_tables",
"generate_vendor_tables",
"incompatible_with",
)
package(
default_visibility = ["//visibility:private"],
features = [
"layering_check",
],
)
licenses(["notice"])
exports_files([
"CHANGES",
"LICENSE",
])
py_binary(
name = "generate_grammar_tables",
srcs = ["utils/generate_grammar_tables.py"],
)
py_binary(
name = "generate_language_headers",
srcs = ["utils/generate_language_headers.py"],
)
generate_core_tables(version = "unified1")
generate_enum_string_mapping(version = "unified1")
generate_opencl_tables(version = "unified1")
generate_glsl_tables(version = "unified1")
generate_vendor_tables(extension = "spv-amd-shader-explicit-vertex-parameter")
generate_vendor_tables(extension = "spv-amd-shader-trinary-minmax")
generate_vendor_tables(extension = "spv-amd-gcn-shader")
generate_vendor_tables(extension = "spv-amd-shader-ballot")
generate_vendor_tables(extension = "debuginfo")
generate_vendor_tables(extension = "nonsemantic.clspvreflection")
generate_vendor_tables(extension = "nonsemantic.vkspreflection")
generate_vendor_tables(
extension = "opencl.debuginfo.100",
operand_kind_prefix = "CLDEBUG100_",
)
generate_vendor_tables(
extension = "nonsemantic.shader.debuginfo.100",
operand_kind_prefix = "SHDEBUG100_",
)
generate_extinst_lang_headers(
name = "DebugInfo",
grammar = DEBUGINFO_GRAMMAR_JSON_FILE,
)
generate_extinst_lang_headers(
name = "OpenCLDebugInfo100",
grammar = CLDEBUGINFO100_GRAMMAR_JSON_FILE,
)
generate_extinst_lang_headers(
name = "NonSemanticShaderDebugInfo100",
grammar = SHDEBUGINFO100_GRAMMAR_JSON_FILE,
)
py_binary(
name = "generate_registry_tables",
srcs = ["utils/generate_registry_tables.py"],
)
genrule(
name = "generators_inc",
srcs = ["@spirv_headers//:spirv_xml_registry"],
outs = ["generators.inc"],
cmd = "$(location :generate_registry_tables) --xml=$(location @spirv_headers//:spirv_xml_registry) --generator-output=$(location generators.inc)",
cmd_bat = "$(location :generate_registry_tables) --xml=$(location @spirv_headers//:spirv_xml_registry) --generator-output=$(location generators.inc)",
tools = [":generate_registry_tables"],
)
py_binary(
name = "update_build_version",
srcs = ["utils/update_build_version.py"],
)
genrule(
name = "build_version_inc",
srcs = ["CHANGES"],
outs = ["build-version.inc"],
cmd = "SOURCE_DATE_EPOCH=0 $(location :update_build_version) $(location CHANGES) $(location build-version.inc)",
cmd_bat = "set SOURCE_DATE_EPOCH=0 && $(location :update_build_version) $(location CHANGES) $(location build-version.inc)",
tools = [":update_build_version"],
)
# Libraries
cc_library(
name = "spirv_tools",
hdrs = [
"include/spirv-tools/libspirv.h",
"include/spirv-tools/libspirv.hpp",
],
copts = COMMON_COPTS,
includes = ["include"],
linkstatic = 1,
visibility = ["//visibility:public"],
deps = [
":spirv_tools_internal",
],
)
cc_library(
name = "spirv_tools_internal",
srcs = glob([
"source/*.cpp",
"source/util/*.cpp",
"source/val/*.cpp",
]) + [
":build_version_inc",
":gen_core_tables_unified1",
":gen_enum_string_mapping",
":gen_extinst_lang_headers_DebugInfo",
":gen_extinst_lang_headers_NonSemanticShaderDebugInfo100",
":gen_extinst_lang_headers_OpenCLDebugInfo100",
":gen_glsl_tables_unified1",
":gen_opencl_tables_unified1",
":gen_vendor_tables_debuginfo",
":gen_vendor_tables_nonsemantic_clspvreflection",
":gen_vendor_tables_nonsemantic_vkspreflection",
":gen_vendor_tables_nonsemantic_shader_debuginfo_100",
":gen_vendor_tables_opencl_debuginfo_100",
":gen_vendor_tables_spv_amd_gcn_shader",
":gen_vendor_tables_spv_amd_shader_ballot",
":gen_vendor_tables_spv_amd_shader_explicit_vertex_parameter",
":gen_vendor_tables_spv_amd_shader_trinary_minmax",
":generators_inc",
],
hdrs = [
"include/spirv-tools/libspirv.h",
"include/spirv-tools/libspirv.hpp",
":gen_extinst_lang_headers_DebugInfo",
":gen_extinst_lang_headers_NonSemanticShaderDebugInfo100",
":gen_extinst_lang_headers_OpenCLDebugInfo100",
] + glob([
"source/*.h",
"source/util/*.h",
"source/val/*.h",
]),
copts = COMMON_COPTS,
includes = ["include"],
deps = [
"@spirv_headers//:spirv_common_headers",
"@spirv_headers//:spirv_cpp11_headers",
],
)
cc_library(
name = "spirv_tools_opt",
hdrs = [
"include/spirv-tools/optimizer.hpp",
],
copts = COMMON_COPTS,
linkstatic = 1,
visibility = ["//visibility:public"],
deps = [
":spirv_tools",
":spirv_tools_opt_internal",
],
)
cc_library(
name = "spirv_tools_opt_internal",
srcs = glob(["source/opt/*.cpp"]) + [
":gen_vendor_tables_spv_amd_shader_ballot",
],
hdrs = glob(["source/opt/*.h"]) + [
"include/spirv-tools/optimizer.hpp",
],
copts = COMMON_COPTS,
deps = [
":spirv_tools_internal",
"@spirv_headers//:spirv_common_headers",
],
)
cc_library(
name = "spirv_tools_reduce",
srcs = glob(["source/reduce/*.cpp"]),
hdrs = glob(["source/reduce/*.h"]),
copts = COMMON_COPTS,
deps = [
":spirv_tools_internal",
":spirv_tools_opt_internal",
],
)
cc_library(
name = "spirv_tools_link",
srcs = glob(["source/link/*.cpp"]),
hdrs = ["include/spirv-tools/linker.hpp"],
copts = COMMON_COPTS,
linkstatic = 1,
visibility = ["//visibility:public"],
deps = [
":spirv_tools_internal",
":spirv_tools_opt_internal",
],
)
cc_library(
name = "spirv_tools_lint_internal",
srcs = glob([
"source/lint/*.cpp",
"source/lint/*.h",
]),
hdrs = ["include/spirv-tools/linter.hpp"] + glob([
"source/lint/*.h",
]),
copts = COMMON_COPTS,
includes = ["include"],
deps = [
":spirv_tools_internal",
":spirv_tools_opt_internal",
],
)
cc_library(
name = "spirv_tools_lint",
hdrs = ["include/spirv-tools/linter.hpp"],
copts = COMMON_COPTS,
includes = ["include"],
linkstatic = 1,
visibility = ["//visibility:public"],
deps = [
":spirv_tools",
":spirv_tools_lint_internal",
],
)
cc_library(
name = "tools_util",
srcs = glob(["tools/util/*.cpp"]),
hdrs = glob(["tools/util/*.h"]),
copts = COMMON_COPTS,
deps = [":spirv_tools"],
)
cc_library(
name = "tools_io",
hdrs = ["tools/io.h"],
srcs = ["tools/io.cpp"],
copts = COMMON_COPTS,
)
# Tools
cc_binary(
name = "spirv-as",
srcs = [
"tools/as/as.cpp",
],
copts = COMMON_COPTS,
visibility = ["//visibility:public"],
deps = [
":spirv_tools_internal",
":tools_io",
":tools_util",
],
)
cc_binary(
name = "spirv-dis",
srcs = [
"tools/dis/dis.cpp",
],
copts = COMMON_COPTS,
visibility = ["//visibility:public"],
deps = [
":spirv_tools",
":tools_io",
":tools_util",
],
)
cc_binary(
name = "spirv-objdump",
srcs = [
"tools/objdump/extract_source.cpp",
"tools/objdump/extract_source.h",
"tools/objdump/objdump.cpp",
],
copts = COMMON_COPTS,
visibility = ["//visibility:public"],
deps = [
":spirv_tools_internal",
":spirv_tools_opt_internal",
":tools_io",
":tools_util",
"@spirv_headers//:spirv_cpp_headers",
],
)
cc_binary(
name = "spirv-val",
srcs = [
"tools/val/val.cpp",
],
copts = COMMON_COPTS,
visibility = ["//visibility:public"],
deps = [
":spirv_tools_internal",
":tools_io",
":tools_util",
],
)
cc_binary(
name = "spirv-opt",
srcs = [
"tools/opt/opt.cpp",
],
copts = COMMON_COPTS,
visibility = ["//visibility:public"],
deps = [
":spirv_tools_internal",
":spirv_tools_opt_internal",
":tools_io",
":tools_util",
],
)
cc_binary(
name = "spirv-reduce",
srcs = [
"tools/reduce/reduce.cpp",
],
copts = COMMON_COPTS,
visibility = ["//visibility:public"],
deps = [
":spirv_tools_internal",
":spirv_tools_opt_internal",
":spirv_tools_reduce",
":tools_io",
":tools_util",
],
)
cc_binary(
name = "spirv-link",
srcs = [
"tools/link/linker.cpp",
],
copts = COMMON_COPTS,
visibility = ["//visibility:public"],
deps = [
":spirv_tools_internal",
":spirv_tools_link",
":tools_io",
":tools_util",
],
)
cc_binary(
name = "spirv-lint",
srcs = [
"tools/lint/lint.cpp",
],
copts = COMMON_COPTS,
visibility = ["//visibility:public"],
deps = [
":spirv_tools_lint",
":spirv_tools_opt_internal",
":tools_io",
":tools_util",
],
)
cc_binary(
name = "spirv-cfg",
srcs = [
"tools/cfg/bin_to_dot.cpp",
"tools/cfg/bin_to_dot.h",
"tools/cfg/cfg.cpp",
],
copts = COMMON_COPTS,
visibility = ["//visibility:public"],
deps = [
":spirv_tools_internal",
":tools_io",
":tools_util",
],
)
# Unit tests
cc_library(
name = "test_lib",
testonly = 1,
srcs = [
"test/unit_spirv.cpp",
],
hdrs = [
"test/test_fixture.h",
"test/unit_spirv.h",
],
copts = TEST_COPTS,
deps = [
":spirv_tools_internal",
"@googletest//:gtest",
],
)
# PCH (precompiled header) tests only work when using CMake and MSVC on Windows,
# so they will be skipped in the Bazel builds.
[cc_test(
name = "base_{testcase}_test".format(testcase = f[len("test/"):-len("_test.cpp")]),
size = "small",
srcs = [f],
copts = TEST_COPTS + ["-DTESTING"],
linkstatic = 1,
target_compatible_with = {
"test/timer_test.cpp": incompatible_with(["@bazel_tools//src/conditions:windows"]),
}.get(f, []),
deps = [
"tools_util",
":spirv_tools_internal",
":test_lib",
tools: Accept hex representation as binary input (#5870) Sometimes when debugging or logging, SPIR-V may be dumped as a stream of hex values. There are tools to convert such a stream to binary (such as [1]) but they create an inconvenient extra step when for example the disassembly of that hex stream is needed. [1]: https://www.khronos.org/spir/visualizer/hexdump.html In this change, the binary reader used by the tools is enhanced to detect when the binary is actually a hex stream, and parse that instead. The following formats are accepted, detected based on how the SPIR-V magic number is output: === Words If the first token of the hex stream is one of 0x07230203, 0x7230203, x07230203, or x7230203, the hex stream is expected to consist of 32-bit hex words prefixed with 0x or x. For example: 0x7230203, 0x10400, 0x180001, 0x79, 0x0 is parsed as: 0x07230203 0x00010400 0x00180001 0x00000079 0x00000000 Note that `,` is optional in the stream, but the hex values are expected to be delimited by either `,` or whitespace. === Bytes With Prefix If the first token of the hex stream is one of 0x07, 0x7, x07, x7, 0x03, 0x3, x03, or x3, the hex stream is expected to consist of 8-bit hex bytes prefixed with 0x or x. If the first token has a value of 7, the stream is big-endian. Otherwise it's little-endian. For example: 0x3, 0x2, 0x23, 0x7, 0x0, 0x4, 0x1, 0x0, 0x1, 0x0, 0x18, 0x0, 0x79, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 is parsed as: 0x07230203 0x00010400 0x00180001 0x00000079 0x00000000 Similar to "Words", `,` is optional in the stream, but the hex values are expected to be delimited by either `,` or whitespace. === Bytes Without Prefix If the first two characters of the hex stream is 07, or 03, the hex stream is expected to consist of 8-bit hex bytes of 2 characters each. If the first token is 07, the stream is big-endian. Otherwise it's little-endian. Unlike the other modes, delimiter is optional (which automatically handles 32-bit word streams), but no 0-padding is done. For example, all of the following: 03, 02, 23, 07, 00, 04, 01, 00, 01, 00, 18, 00, 79, 00, 00, 00, 00, 00, 00, 00 03 02 23 07 00 04 01 00 01 00 18 00 79 00 00 00 00 00 00 00 03022307 00040100 01001800 79000000 00000000 07,23,02,03,00,01,04,00,00,18,00,01,00,00,00,79,00,00,00,00 07230203, 00010400, 00180001, 00000079, 00000000 are parsed as: 0x07230203 0x00010400 0x00180001 0x00000079 0x00000000
2024-11-04 14:57:37 +00:00
":tools_io",
"@googletest//:gtest",
"@googletest//:gtest_main",
],
) for f in glob(
[
"test/*_test.cpp",
"test/tools/*_test.cpp",
],
exclude = [
"test/cpp_interface_test.cpp",
"test/pch_test.cpp",
],
)]
cc_test(
name = "base_cpp_interface_test",
size = "small",
srcs = ["test/cpp_interface_test.cpp"],
linkstatic = 1,
deps = [
":spirv_tools_opt_internal",
"@googletest//:gtest",
"@googletest//:gtest_main",
"@spirv_headers//:spirv_cpp11_headers",
],
)
cc_test(
name = "base_ilist_test",
size = "small",
srcs = ["test/util/ilist_test.cpp"],
copts = TEST_COPTS,
linkstatic = 1,
deps = [
":spirv_tools_internal",
"@googletest//:gtest",
"@googletest//:gtest_main",
],
)
cc_library(
name = "link_test_lib",
testonly = 1,
hdrs = ["test/link/linker_fixture.h"],
copts = TEST_COPTS,
deps = [
":spirv_tools_internal",
":spirv_tools_link",
":test_lib",
2024-06-18 17:52:50 +00:00
"@effcee//:effcee",
"@re2//:re2",
],
)
[cc_test(
name = "link_{testcase}_test".format(testcase = f[len("test/link/"):-len("_test.cpp")]),
size = "small",
srcs = [f],
copts = TEST_COPTS,
linkstatic = 1,
deps = [
":link_test_lib",
"@googletest//:gtest",
"@googletest//:gtest_main",
],
) for f in glob(
["test/link/*_test.cpp"],
)]
[cc_test(
name = "lint_{testcase}_test".format(testcase = f[len("test/lint/"):-len("_test.cpp")]),
size = "small",
srcs = [f],
copts = TEST_COPTS,
linkstatic = 1,
deps = [
":spirv_tools",
":spirv_tools_lint_internal",
":spirv_tools_opt_internal",
"@googletest//:gtest",
"@googletest//:gtest_main",
],
) for f in glob(
["test/lint/*_test.cpp"],
)]
cc_library(
name = "opt_test_lib",
testonly = 1,
srcs = [
"test/opt/pass_utils.cpp",
],
hdrs = [
"test/opt/assembly_builder.h",
"test/opt/function_utils.h",
"test/opt/module_utils.h",
"test/opt/pass_fixture.h",
"test/opt/pass_utils.h",
],
copts = TEST_COPTS,
deps = [
":spirv_tools_internal",
":spirv_tools_opt_internal",
2024-06-18 17:52:50 +00:00
"@effcee//:effcee",
"@googletest//:gtest",
],
)
[cc_test(
name = "opt_{testcase}_test".format(testcase = f[len("test/opt/"):-len("_test.cpp")]),
size = "small",
srcs = [f],
copts = TEST_COPTS,
linkstatic = 1,
deps = [
":opt_test_lib",
":spirv_tools_internal",
":spirv_tools_opt_internal",
":test_lib",
2024-06-18 17:52:50 +00:00
"@effcee//:effcee",
"@googletest//:gtest",
"@googletest//:gtest_main",
],
) for f in glob(["test/opt/*_test.cpp"])]
[cc_test(
name = "opt_dom_tree_{testcase}_test".format(testcase = f[len("test/opt/dominator_tree/"):-len(".cpp")]),
size = "small",
srcs = [f],
copts = TEST_COPTS,
linkstatic = 1,
deps = [
":opt_test_lib",
":spirv_tools_opt_internal",
"@googletest//:gtest",
"@googletest//:gtest_main",
],
) for f in glob(
["test/opt/dominator_tree/*.cpp"],
exclude = ["test/opt/dominator_tree/pch_test_opt_dom.cpp"],
)]
[cc_test(
name = "opt_loop_{testcase}_test".format(testcase = f[len("test/opt/loop_optimizations/"):-len(".cpp")]),
size = "small",
srcs = [f],
copts = TEST_COPTS,
linkstatic = 1,
deps = [
":opt_test_lib",
":spirv_tools",
":spirv_tools_opt_internal",
2024-06-18 17:52:50 +00:00
"@effcee//:effcee",
"@googletest//:gtest",
"@googletest//:gtest_main",
],
) for f in glob(
["test/opt/loop_optimizations/*.cpp"],
exclude = ["test/opt/loop_optimizations/pch_test_opt_loop.cpp"],
)]
cc_library(
name = "reduce_test_lib",
testonly = 1,
srcs = [
"test/reduce/reduce_test_util.cpp",
],
hdrs = ["test/reduce/reduce_test_util.h"],
copts = TEST_COPTS,
deps = [
":spirv_tools",
":spirv_tools_opt_internal",
":spirv_tools_reduce",
":test_lib",
":tools_io",
"@googletest//:gtest",
],
)
[cc_test(
name = "reduce_{testcase}_test".format(testcase = f[len("test/reduce/"):-len("_test.cpp")]),
size = "small",
srcs = [f],
copts = TEST_COPTS,
linkstatic = 1,
deps = [
":reduce_test_lib",
":spirv_tools_internal",
":spirv_tools_opt_internal",
":spirv_tools_reduce",
"@googletest//:gtest_main",
],
) for f in glob(["test/reduce/*_test.cpp"])]
[cc_test(
name = "util_{testcase}_test".format(testcase = f[len("test/util/"):-len("_test.cpp")]),
size = "small",
srcs = [f],
copts = TEST_COPTS,
linkstatic = 1,
deps = [
":spirv_tools_internal",
"@googletest//:gtest",
"@googletest//:gtest_main",
],
) for f in glob(["test/util/*_test.cpp"])]
cc_library(
name = "val_test_lib",
testonly = 1,
srcs = [
"test/val/val_code_generator.cpp",
],
hdrs = [
"test/val/val_code_generator.h",
"test/val/val_fixtures.h",
],
copts = TEST_COPTS,
deps = [
":spirv_tools_internal",
":test_lib",
],
)
[cc_test(
name = "val_{testcase}_test".format(testcase = f[len("test/val/val_"):-len("_test.cpp")]),
size = "small",
srcs = [f],
copts = TEST_COPTS,
linkstatic = 1,
deps = [
":spirv_tools_internal",
":test_lib",
":val_test_lib",
"@googletest//:gtest",
"@googletest//:gtest_main",
],
) for f in glob(
["test/val/val_*_test.cpp"],
exclude = [
"test/val/val_capability_test.cpp",
"test/val/val_limits_test.cpp",
],
)]
cc_test(
name = "val_capability_test",
size = "large",
timeout = "long",
srcs = ["test/val/val_capability_test.cpp"],
copts = TEST_COPTS + ["-O3"],
linkstatic = 1,
deps = [
":spirv_tools_internal",
":test_lib",
":val_test_lib",
"@googletest//:gtest",
"@googletest//:gtest_main",
],
)
cc_test(
name = "val_limits_test",
size = "large",
timeout = "long",
srcs = ["test/val/val_limits_test.cpp"],
copts = TEST_COPTS + [
"-O3",
],
linkstatic = 1,
deps = [
":test_lib",
":val_test_lib",
"@googletest//:gtest",
"@googletest//:gtest_main",
],
)