# Placeholder#1 for Guitar, do not remove # Placeholder for cc_test, do not remove load("@bazel_skylib//lib:selects.bzl", "selects") load("@rules_license//rules:license.bzl", "license") # Placeholder#2 for Guitar, do not remove package( default_applicable_licenses = ["//:license"], default_visibility = ["//visibility:public"], ) license( name = "license", package_name = "highway", license_kinds = ["@rules_license//licenses/generic:notice"], ) # Dual-licensed Apache 2 and 3-clause BSD. licenses(["notice"]) exports_files(["LICENSE"]) # Detect compiler: config_setting( name = "compiler_clang", flag_values = {"@bazel_tools//tools/cpp:compiler": "clang"}, ) config_setting( name = "compiler_clangcl", flag_values = {"@bazel_tools//tools/cpp:compiler": "lexan"}, ) config_setting( name = "compiler_msvc", flag_values = {"@bazel_tools//tools/cpp:compiler": "msvc-cl"}, ) config_setting( name = "compiler_emscripten", constraint_values = [ "@platforms//cpu:wasm32", ], ) # See https://github.com/bazelbuild/bazel/issues/12707 config_setting( name = "compiler_gcc_bug", flag_values = { "@bazel_tools//tools/cpp:compiler": "compiler", }, ) config_setting( name = "compiler_gcc_actual", flag_values = { "@bazel_tools//tools/cpp:compiler": "gcc", }, ) selects.config_setting_group( name = "compiler_gcc", match_any = [ ":compiler_gcc_bug", ":compiler_gcc_actual", ], ) # Additional warnings for Clang OR GCC (skip for MSVC) CLANG_GCC_COPTS = [ "-Wunused", "-Wextra-semi", "-Wunreachable-code", "-Wshadow", "-Wmissing-declarations", ] # Warnings supported by Clang and Clang-cl CLANG_OR_CLANGCL_OPTS = CLANG_GCC_COPTS + [ "-Wfloat-overflow-conversion", "-Wfloat-zero-conversion", "-Wfor-loop-analysis", "-Wgnu-redeclared-enum", "-Winfinite-recursion", "-Wliteral-conversion", "-Wno-c++98-compat", "-Wno-unused-command-line-argument", "-Wprivate-header", "-Wself-assign", "-Wstring-conversion", "-Wtautological-overlap-compare", "-Wthread-safety-analysis", "-Wundefined-func-template", "-Wunreachable-code-aggressive", "-Wunused-comparison", ] # Warnings only supported by Clang, but not Clang-cl CLANG_ONLY_COPTS = CLANG_OR_CLANGCL_OPTS + [ # Do not treat the third_party headers as system headers when building # highway - the errors are pertinent. "--no-system-header-prefix=third_party/highway", ] COPTS = select({ ":compiler_msvc": [], ":compiler_gcc": CLANG_GCC_COPTS, ":compiler_clangcl": CLANG_OR_CLANGCL_OPTS, # Default to clang because compiler detection only works in Bazel "//conditions:default": CLANG_ONLY_COPTS, }) + select({ "@platforms//cpu:riscv64": [ "-march=rv64gcv1p0", "-menable-experimental-extensions", ], "//conditions:default": [ ], }) DEFINES = select({ ":compiler_msvc": ["HWY_SHARED_DEFINE"], ":compiler_clangcl": ["HWY_SHARED_DEFINE"], "//conditions:default": [], }) # Unused on Bazel builds, where this is not defined/known; Copybara replaces # usages with an empty list. COMPAT = [ "//buildenv/target:non_prod", # includes mobile/vendor. ] # WARNING: changing flags such as HWY_DISABLED_TARGETS may break users without # failing integration tests, if the machine running tests does not support the # newly enabled instruction set, or the failure is only caught by sanitizers # which do not run in CI. # NOTE: when adding a new dependency on the Highway library, please add your # test to the highway.users list in highway.blueprint. cc_library( name = "hwy", srcs = [ "hwy/abort.cc", "hwy/aligned_allocator.cc", "hwy/per_target.cc", "hwy/print.cc", "hwy/targets.cc", ], # Normal headers with include guards hdrs = [ "hwy/abort.h", "hwy/aligned_allocator.h", "hwy/base.h", "hwy/cache_control.h", "hwy/detect_compiler_arch.h", # private "hwy/print.h", "hwy/x86_cpuid.h", ], compatible_with = [], copts = COPTS, defines = DEFINES, local_defines = ["hwy_EXPORTS"], textual_hdrs = [ # These are textual because config macros influence them: "hwy/detect_targets.h", # private "hwy/targets.h", # This .cc file #includes itself through foreach_target.h "hwy/per_target.cc", # End of list "hwy/highway.h", # public "hwy/foreach_target.h", # public "hwy/per_target.h", # public "hwy/print-inl.h", # public "hwy/highway_export.h", # public "hwy/ops/arm_neon-inl.h", "hwy/ops/arm_sve-inl.h", "hwy/ops/emu128-inl.h", "hwy/ops/generic_ops-inl.h", "hwy/ops/inside-inl.h", "hwy/ops/scalar-inl.h", "hwy/ops/set_macros-inl.h", "hwy/ops/shared-inl.h", "hwy/ops/x86_128-inl.h", "hwy/ops/x86_256-inl.h", "hwy/ops/x86_512-inl.h", "hwy/ops/x86_avx3-inl.h", # Select avoids recompiling native arch if only non-native changed ] + select({ ":compiler_emscripten": [ "hwy/ops/wasm_128-inl.h", "hwy/ops/wasm_256-inl.h", ], "//conditions:default": [], }) + select({ "@platforms//cpu:riscv64": ["hwy/ops/rvv-inl.h"], "//conditions:default": [], }), ) cc_library( name = "stats", srcs = ["hwy/stats.cc"], hdrs = ["hwy/stats.h"], compatible_with = [], copts = COPTS, deps = [":hwy"], ) cc_library( name = "robust_statistics", hdrs = ["hwy/robust_statistics.h"], compatible_with = [], copts = COPTS, deps = [":hwy"], ) cc_library( name = "timer", srcs = ["hwy/timer.cc"], hdrs = ["hwy/timer.h"], compatible_with = [], copts = COPTS, # Deprecated. textual_hdrs = [ "hwy/timer-inl.h", ], deps = [ ":hwy", ":robust_statistics", ], ) # Previously provided timer.*, use :timer instead. cc_library( name = "nanobenchmark", srcs = ["hwy/nanobenchmark.cc"], hdrs = [ "hwy/nanobenchmark.h", # TODO(janwas): remove after users depend on :timer. "hwy/timer.h", ], compatible_with = [], copts = COPTS, local_defines = ["hwy_EXPORTS"], deps = [ ":hwy", ":robust_statistics", ":timer", ], ) cc_library( name = "bit_set", hdrs = ["hwy/bit_set.h"], compatible_with = [], copts = COPTS, deps = [ ":hwy", # HWY_DASSERT ], ) cc_library( name = "auto_tune", hdrs = ["hwy/auto_tune.h"], compatible_with = [], copts = COPTS, deps = [ ":hwy", "//hwy/contrib/sort:vqsort", ], ) cc_library( name = "perf_counters", srcs = ["hwy/perf_counters.cc"], hdrs = ["hwy/perf_counters.h"], compatible_with = [], copts = COPTS, deps = [ ":bit_set", ":hwy", ":timer", ], ) cc_library( name = "profiler", srcs = ["hwy/profiler.cc"], hdrs = ["hwy/profiler.h"], compatible_with = [], copts = COPTS, deps = [ ":bit_set", ":hwy", ":robust_statistics", ":timer", ], ) cc_binary( name = "profiler_example", srcs = ["hwy/examples/profiler_example.cc"], copts = COPTS, deps = [ ":hwy", ":profiler", ":thread_pool", ":timer", ], ) cc_library( name = "algo", compatible_with = [], copts = COPTS, textual_hdrs = [ "hwy/contrib/algo/copy-inl.h", "hwy/contrib/algo/find-inl.h", "hwy/contrib/algo/transform-inl.h", ], deps = [ ":hwy", ], ) cc_library( name = "bit_pack", compatible_with = [], copts = COPTS, textual_hdrs = [ "hwy/contrib/bit_pack/bit_pack-inl.h", ], deps = [ ":hwy", ], ) cc_library( name = "dot", compatible_with = [], copts = COPTS, textual_hdrs = [ "hwy/contrib/dot/dot-inl.h", ], deps = [ ":hwy", ], ) cc_library( name = "topology", srcs = ["hwy/contrib/thread_pool/topology.cc"], hdrs = ["hwy/contrib/thread_pool/topology.h"], compatible_with = [], copts = COPTS, deps = [ ":bit_set", ":hwy", ], ) cc_library( name = "thread_pool", hdrs = [ "hwy/contrib/thread_pool/futex.h", "hwy/contrib/thread_pool/spin.h", "hwy/contrib/thread_pool/thread_pool.h", ], compatible_with = [], copts = COPTS, deps = [ ":auto_tune", ":bit_set", ":hwy", ":profiler", ":stats", ":timer", ":topology", ], ) cc_library( name = "matvec", compatible_with = [], copts = COPTS, textual_hdrs = [ "hwy/contrib/matvec/matvec-inl.h", ], deps = [ ":hwy", ":thread_pool", ], ) cc_library( name = "image", srcs = [ "hwy/contrib/image/image.cc", ], hdrs = [ "hwy/contrib/image/image.h", ], compatible_with = [], copts = COPTS, local_defines = ["hwy_contrib_EXPORTS"], deps = [ ":hwy", ], ) cc_library( name = "math", compatible_with = [], copts = COPTS, textual_hdrs = [ "hwy/contrib/math/math-inl.h", ], deps = [ ":hwy", ], ) cc_library( name = "random", compatible_with = [], copts = COPTS, textual_hdrs = [ "hwy/contrib/random/random-inl.h", ], deps = [ ":hwy", ], ) cc_library( name = "unroller", compatible_with = [], copts = COPTS, textual_hdrs = [ "hwy/contrib/unroller/unroller-inl.h", ], deps = [ ":hwy", ], ) # Everything required for tests that use Highway. cc_library( name = "hwy_test_util", srcs = ["hwy/tests/test_util.cc"], hdrs = ["hwy/tests/test_util.h"], compatible_with = [], copts = COPTS, local_defines = ["hwy_test_EXPORTS"], textual_hdrs = [ "hwy/tests/test_util-inl.h", "hwy/tests/hwy_gtest.h", ], # Must not depend on a gtest variant, which can conflict with the # GUNIT_INTERNAL_BUILD_MODE defined by the test. deps = [ ":hwy", ":nanobenchmark", ], ) cc_binary( name = "benchmark", srcs = ["hwy/examples/benchmark.cc"], copts = COPTS, deps = [ ":hwy", ":nanobenchmark", ], ) cc_library( name = "skeleton", srcs = ["hwy/examples/skeleton.cc"], hdrs = ["hwy/examples/skeleton.h"], copts = COPTS, local_defines = ["hwy_EXPORTS"], textual_hdrs = ["hwy/examples/skeleton-inl.h"], deps = [ ":hwy", ], ) cc_library( name = "abort_header_only", hdrs = [ "hwy/abort.h", "hwy/base.h", "hwy/detect_compiler_arch.h", # private "hwy/highway_export.h", # public ], compatible_with = [], copts = COPTS, local_defines = ["HWY_HEADER_ONLY"], ) cc_test( name = "list_targets", size = "small", srcs = ["hwy/tests/list_targets.cc"], deps = [":hwy"], ) cc_test( name = "abort_header_only_test", size = "small", srcs = ["hwy/abort_header_only_test.cc"], deps = [ ":abort_header_only", ":hwy_test_util", "@com_google_googletest//:gtest_main", ], ) # path, name, deps HWY_CONTRIB_TESTS = ( ( "hwy/contrib/algo/", "copy_test", (":algo",), ), ( "hwy/contrib/algo/", "find_test", (":algo",), ), ( "hwy/contrib/algo/", "transform_test", (":algo",), ), ( "hwy/contrib/bit_pack/", "bit_pack_test", (":bit_pack",), ), ( "hwy/contrib/dot/", "dot_test", (":dot",), ), ( "hwy/contrib/image/", "image_test", (":image",), ), ( "hwy/contrib/math/", "math_test", (":math",), ), ( "hwy/contrib/random/", "random_test", (":random",), ), ( "hwy/contrib/matvec/", "matvec_test", (":matvec", ":algo", ":topology", ":thread_pool"), ), ( "hwy/contrib/thread_pool/", "spin_test", (":topology", ":thread_pool"), ), ( "hwy/contrib/thread_pool/", "thread_pool_test", (":topology", ":thread_pool", ":profiler"), ), ( "hwy/contrib/thread_pool/", "topology_test", (":thread_pool", ":topology"), ), ( "hwy/contrib/unroller/", "unroller_test", (":unroller",), ), # contrib/sort has its own BUILD, we also add sort_test to GUITAR_TESTS. # To run bench_sort, specify --test=hwy/contrib/sort:bench_sort. ) # path, name, deps HWY_TESTS = HWY_CONTRIB_TESTS + ( ( "hwy/examples/", "skeleton_test", (":skeleton",), ), ("hwy/", "abort_test", []), ("hwy/", "aligned_allocator_test", []), ( "hwy/", "auto_tune_test", (":auto_tune",), ), ("hwy/", "base_test", []), ( "hwy/", "bit_set_test", (":bit_set",), ), ("hwy/", "highway_test", []), ("hwy/", "nanobenchmark_test", []), ( "hwy/", "perf_counters_test", (":perf_counters", ":thread_pool"), ), ("hwy/", "targets_test", []), ("hwy/tests/", "arithmetic_test", []), ("hwy/tests/", "bit_permute_test", []), ("hwy/tests/", "blockwise_combine_test", []), ("hwy/tests/", "blockwise_shift_test", []), ("hwy/tests/", "blockwise_test", []), ("hwy/tests/", "cast_test", []), ("hwy/tests/", "combine_test", []), ("hwy/tests/", "compare_test", []), ("hwy/tests/", "compress_test", []), ("hwy/tests/", "complex_arithmetic_test", []), ("hwy/tests/", "concat_test", []), ("hwy/tests/", "convert_test", []), ("hwy/tests/", "count_test", []), ("hwy/tests/", "crypto_test", []), ("hwy/tests/", "demote_test", []), ("hwy/tests/", "div_test", []), ("hwy/tests/", "dup128_vec_test", []), ("hwy/tests/", "expand_test", []), ("hwy/tests/", "float_test", []), ("hwy/tests/", "fma_test", []), ("hwy/tests/", "foreach_vec_test", []), ("hwy/tests/", "if_test", []), ("hwy/tests/", "in_range_float_to_int_conv_test", []), ("hwy/tests/", "interleaved_test", []), ("hwy/tests/", "logical_test", []), ("hwy/tests/", "mask_combine_test", []), ("hwy/tests/", "mask_convert_test", []), ("hwy/tests/", "mask_mem_test", []), ("hwy/tests/", "mask_set_test", []), ("hwy/tests/", "mask_slide_test", []), ("hwy/tests/", "mask_test", []), ("hwy/tests/", "masked_arithmetic_test", []), ("hwy/tests/", "masked_minmax_test", []), ("hwy/tests/", "memory_test", []), ("hwy/tests/", "minmax_magnitude_test", []), ("hwy/tests/", "minmax_number_test", []), ("hwy/tests/", "minmax_test", []), ("hwy/tests/", "minmax128_test", []), ("hwy/tests/", "mul_by_pow2_test", []), ("hwy/tests/", "mul_pairwise_test", []), ("hwy/tests/", "mul_test", []), ("hwy/tests/", "reduction_test", []), ("hwy/tests/", "resize_test", []), ("hwy/tests/", "reverse_test", []), ("hwy/tests/", "rotate_test", []), ("hwy/tests/", "saturated_test", []), ("hwy/tests/", "shift_test", []), ("hwy/tests/", "shuffle4_test", []), ("hwy/tests/", "sign_test", []), ("hwy/tests/", "slide_up_down_test", []), ("hwy/tests/", "sums_abs_diff_test", []), ("hwy/tests/", "swizzle_block_test", []), ("hwy/tests/", "swizzle_test", []), ("hwy/tests/", "table_test", []), ("hwy/tests/", "test_util_test", []), ("hwy/tests/", "truncate_test", []), ("hwy/tests/", "tuple_test", []), ("hwy/tests/", "widen_mul_test", []), ) HWY_TEST_COPTS = select({ ":compiler_msvc": [], "//conditions:default": [ # gTest triggers this warning (which is enabled by the # extra-semi in COPTS), so we need to disable it here, # but it's still enabled for :hwy. "-Wno-c++98-compat-extra-semi", ], }) # Common to all tests. HWY_TEST_DEPS = [ ":hwy_test_util", ":hwy", ":nanobenchmark", ":timer", ] + select({ ":compiler_msvc": [], "//conditions:default": ["@com_google_googletest//:gtest_main"], }) [ [ cc_test( name = test, size = "medium", timeout = "long", # default moderate is not enough for math_test srcs = [ subdir + test + ".cc", ], copts = COPTS + HWY_TEST_COPTS, # Fixes OOM for matvec_test on RVV. exec_properties = select({ "@platforms//cpu:riscv64": {"mem": "16g"}, "//conditions:default": None, }), features = select({ "@platforms//cpu:riscv64": ["fully_static_link"], "//conditions:default": [], }), linkopts = select({ ":compiler_emscripten": [ "-s ASSERTIONS=2", "-s ENVIRONMENT=node,shell,web", "-s ERROR_ON_UNDEFINED_SYMBOLS=1", "-s EXIT_RUNTIME=1", "-s ALLOW_MEMORY_GROWTH=1", "--pre-js $(location :preamble.js.lds)", ], "//conditions:default": [], }), linkstatic = select({ "@platforms//cpu:riscv64": True, "//conditions:default": False, }), local_defines = ["HWY_IS_TEST"], # Placeholder for malloc, do not remove # for test_suite. tags = ["hwy_ops_test"], deps = HWY_TEST_DEPS + extra_deps + select({ ":compiler_emscripten": [":preamble.js.lds"], "//conditions:default": [], }), ), ] for subdir, test, extra_deps in HWY_TESTS ] # For manually building the tests we define here (:all does not work in --config=msvc) test_suite( name = "hwy_ops_tests", tags = ["hwy_ops_test"], ) # Placeholder for integration test, do not remove