re2 1.23.0 → 1.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/binding.gyp +3 -2
- package/package.json +5 -5
- package/vendor/abseil-cpp/CMake/AbseilDll.cmake +25 -4
- package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +6 -1
- package/vendor/abseil-cpp/CMakeLists.txt +2 -2
- package/vendor/abseil-cpp/MODULE.bazel +2 -2
- package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +0 -1
- package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +0 -2
- package/vendor/abseil-cpp/absl/algorithm/container.h +191 -140
- package/vendor/abseil-cpp/absl/algorithm/container_test.cc +818 -0
- package/vendor/abseil-cpp/absl/base/BUILD.bazel +44 -5
- package/vendor/abseil-cpp/absl/base/CMakeLists.txt +42 -3
- package/vendor/abseil-cpp/absl/base/attributes.h +5 -1
- package/vendor/abseil-cpp/absl/base/call_once_test.cc +10 -10
- package/vendor/abseil-cpp/absl/base/casts.cc +61 -0
- package/vendor/abseil-cpp/absl/base/casts.h +128 -2
- package/vendor/abseil-cpp/absl/base/casts_test.cc +151 -0
- package/vendor/abseil-cpp/absl/base/config.h +13 -37
- package/vendor/abseil-cpp/absl/base/internal/dynamic_annotations.h +1 -1
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +4 -0
- package/vendor/abseil-cpp/absl/base/internal/nullability_traits.h +71 -0
- package/vendor/abseil-cpp/absl/base/internal/nullability_traits_test.cc +98 -0
- package/vendor/abseil-cpp/absl/base/internal/raw_logging.cc +3 -4
- package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +13 -7
- package/vendor/abseil-cpp/absl/base/internal/spinlock.h +16 -11
- package/vendor/abseil-cpp/absl/base/internal/strerror_test.cc +2 -1
- package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +0 -9
- package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +0 -6
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -1
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +1 -1
- package/vendor/abseil-cpp/absl/base/macros.h +40 -17
- package/vendor/abseil-cpp/absl/base/nullability.h +1 -1
- package/vendor/abseil-cpp/absl/base/optimization.h +1 -3
- package/vendor/abseil-cpp/absl/base/options.h +1 -27
- package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +5 -8
- package/vendor/abseil-cpp/absl/cleanup/cleanup.h +4 -0
- package/vendor/abseil-cpp/absl/container/BUILD.bazel +195 -2
- package/vendor/abseil-cpp/absl/container/CMakeLists.txt +136 -2
- package/vendor/abseil-cpp/absl/container/btree_map.h +56 -6
- package/vendor/abseil-cpp/absl/container/btree_set.h +52 -6
- package/vendor/abseil-cpp/absl/container/btree_test.cc +107 -1
- package/vendor/abseil-cpp/absl/container/chunked_queue.h +755 -0
- package/vendor/abseil-cpp/absl/container/chunked_queue_benchmark.cc +386 -0
- package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +768 -0
- package/vendor/abseil-cpp/absl/container/fixed_array.h +4 -6
- package/vendor/abseil-cpp/absl/container/flat_hash_map.h +16 -6
- package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +1 -2
- package/vendor/abseil-cpp/absl/container/flat_hash_set.h +16 -6
- package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +0 -2
- package/vendor/abseil-cpp/absl/container/inlined_vector.h +12 -4
- package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +21 -0
- package/vendor/abseil-cpp/absl/container/internal/btree_container.h +14 -5
- package/vendor/abseil-cpp/absl/container/internal/chunked_queue.h +173 -0
- package/vendor/abseil-cpp/absl/container/internal/common.h +51 -0
- package/vendor/abseil-cpp/absl/container/internal/container_memory.h +7 -1
- package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +11 -0
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +0 -2
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +1 -2
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +0 -14
- package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +11 -8
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +3 -4
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +23 -6
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +31 -15
- package/vendor/abseil-cpp/absl/container/internal/heterogeneous_lookup_testing.h +80 -0
- package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +4 -12
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +35 -10
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +149 -23
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +120 -126
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +4 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +8 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +14 -59
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +111 -22
- package/vendor/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h +53 -112
- package/vendor/abseil-cpp/absl/container/internal/unordered_map_lookup_test.h +10 -15
- package/vendor/abseil-cpp/absl/container/internal/unordered_map_members_test.h +3 -3
- package/vendor/abseil-cpp/absl/container/internal/unordered_map_modifiers_test.h +45 -61
- package/vendor/abseil-cpp/absl/container/internal/unordered_set_constructor_test.h +53 -112
- package/vendor/abseil-cpp/absl/container/internal/unordered_set_lookup_test.h +6 -9
- package/vendor/abseil-cpp/absl/container/internal/unordered_set_members_test.h +3 -3
- package/vendor/abseil-cpp/absl/container/internal/unordered_set_modifiers_test.h +25 -31
- package/vendor/abseil-cpp/absl/container/linked_hash_map.h +666 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_map_benchmark.cc +140 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_map_test.cc +987 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_set.h +527 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_set_benchmark.cc +84 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_set_test.cc +947 -0
- package/vendor/abseil-cpp/absl/container/node_hash_map.h +17 -6
- package/vendor/abseil-cpp/absl/container/node_hash_set.h +16 -5
- package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +1 -2
- package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +79 -0
- package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +79 -0
- package/vendor/abseil-cpp/absl/copts/copts.py +17 -4
- package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +67 -13
- package/vendor/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +4 -2
- package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +31 -0
- package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +34 -0
- package/vendor/abseil-cpp/absl/debugging/failure_signal_handler.cc +2 -2
- package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +118 -0
- package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +71 -0
- package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +97 -0
- package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +2 -2
- package/vendor/abseil-cpp/absl/debugging/internal/elf_mem_image.h +4 -4
- package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +4 -0
- package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +7 -0
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +1 -1
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +0 -7
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +3 -2
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +2 -1
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
- package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +2 -2
- package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +35 -67
- package/vendor/abseil-cpp/absl/debugging/stacktrace.h +3 -0
- package/vendor/abseil-cpp/absl/debugging/stacktrace_benchmark.cc +24 -1
- package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +39 -15
- package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +4 -17
- package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +25 -40
- package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +2 -4
- package/vendor/abseil-cpp/absl/flags/BUILD.bazel +1 -0
- package/vendor/abseil-cpp/absl/flags/declare.h +9 -0
- package/vendor/abseil-cpp/absl/flags/flag.h +2 -1
- package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +1 -1
- package/vendor/abseil-cpp/absl/flags/internal/flag.cc +3 -2
- package/vendor/abseil-cpp/absl/flags/marshalling.cc +1 -16
- package/vendor/abseil-cpp/absl/flags/parse.cc +4 -2
- package/vendor/abseil-cpp/absl/flags/parse_test.cc +1 -1
- package/vendor/abseil-cpp/absl/flags/reflection.cc +4 -3
- package/vendor/abseil-cpp/absl/functional/BUILD.bazel +4 -0
- package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +4 -0
- package/vendor/abseil-cpp/absl/functional/any_invocable.h +3 -1
- package/vendor/abseil-cpp/absl/functional/function_ref.h +125 -20
- package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +122 -9
- package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +13 -2
- package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +42 -4
- package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +11 -0
- package/vendor/abseil-cpp/absl/hash/hash_test.cc +5 -2
- package/vendor/abseil-cpp/absl/hash/internal/hash.cc +184 -53
- package/vendor/abseil-cpp/absl/hash/internal/hash.h +116 -10
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +43 -4
- package/vendor/abseil-cpp/absl/log/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/log/CMakeLists.txt +35 -1
- package/vendor/abseil-cpp/absl/log/check_test_impl.inc +59 -4
- package/vendor/abseil-cpp/absl/log/die_if_null.cc +3 -1
- package/vendor/abseil-cpp/absl/log/die_if_null.h +24 -3
- package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +31 -1
- package/vendor/abseil-cpp/absl/log/internal/check_impl.h +2 -1
- package/vendor/abseil-cpp/absl/log/internal/check_op.cc +3 -1
- package/vendor/abseil-cpp/absl/log/internal/check_op.h +44 -18
- package/vendor/abseil-cpp/absl/log/internal/conditions.h +38 -35
- package/vendor/abseil-cpp/absl/log/internal/container.h +312 -0
- package/vendor/abseil-cpp/absl/log/internal/container_test.cc +254 -0
- package/vendor/abseil-cpp/absl/log/internal/log_impl.h +108 -110
- package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -2
- package/vendor/abseil-cpp/absl/log/internal/log_message.h +5 -1
- package/vendor/abseil-cpp/absl/log/internal/strip.h +30 -31
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +19 -19
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +0 -1
- package/vendor/abseil-cpp/absl/log/log.h +2 -2
- package/vendor/abseil-cpp/absl/meta/BUILD.bazel +51 -0
- package/vendor/abseil-cpp/absl/meta/CMakeLists.txt +46 -0
- package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing.h +73 -0
- package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing_test.cc +40 -0
- package/vendor/abseil-cpp/absl/meta/internal/requires.h +67 -0
- package/vendor/abseil-cpp/absl/meta/internal/requires_test.cc +66 -0
- package/vendor/abseil-cpp/absl/meta/type_traits.h +42 -1
- package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +14 -0
- package/vendor/abseil-cpp/absl/numeric/int128.h +41 -21
- package/vendor/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +16 -22
- package/vendor/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +5 -7
- package/vendor/abseil-cpp/absl/numeric/int128_test.cc +52 -5
- package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +1 -0
- package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +1 -0
- package/vendor/abseil-cpp/absl/profiling/hashtable.cc +18 -7
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +1 -0
- package/vendor/abseil-cpp/absl/random/internal/fastmath_test.cc +3 -5
- package/vendor/abseil-cpp/absl/random/internal/platform.h +0 -13
- package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +0 -1
- package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +1 -27
- package/vendor/abseil-cpp/absl/status/BUILD.bazel +17 -0
- package/vendor/abseil-cpp/absl/status/CMakeLists.txt +16 -0
- package/vendor/abseil-cpp/absl/status/internal/status_internal.h +4 -2
- package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +2 -2
- package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +2 -1
- package/vendor/abseil-cpp/absl/status/status.cc +4 -0
- package/vendor/abseil-cpp/absl/status/status.h +5 -0
- package/vendor/abseil-cpp/absl/status/status_matchers.h +48 -0
- package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +27 -0
- package/vendor/abseil-cpp/absl/status/status_test.cc +1 -0
- package/vendor/abseil-cpp/absl/status/statusor.h +1 -1
- package/vendor/abseil-cpp/absl/strings/BUILD.bazel +101 -21
- package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +99 -5
- package/vendor/abseil-cpp/absl/strings/ascii.h +9 -4
- package/vendor/abseil-cpp/absl/strings/cord.cc +15 -10
- package/vendor/abseil-cpp/absl/strings/cord.h +1 -1
- package/vendor/abseil-cpp/absl/strings/escaping.cc +126 -94
- package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
- package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite_test.cc +95 -0
- package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +2 -0
- package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree_test.cc +8 -8
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +24 -18
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +10 -16
- package/vendor/abseil-cpp/absl/strings/internal/escaping.h +9 -7
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer.cc +107 -0
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer.h +115 -0
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +423 -0
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +685 -0
- package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +0 -12
- package/vendor/abseil-cpp/absl/strings/internal/str_format/checker.h +2 -4
- package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +21 -7
- package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +495 -8
- package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +18 -15
- package/vendor/abseil-cpp/absl/strings/numbers.cc +71 -8
- package/vendor/abseil-cpp/absl/strings/numbers.h +25 -12
- package/vendor/abseil-cpp/absl/strings/numbers_test.cc +70 -0
- package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +194 -0
- package/vendor/abseil-cpp/absl/strings/resize_and_overwrite_test.cc +154 -0
- package/vendor/abseil-cpp/absl/strings/str_cat.cc +96 -91
- package/vendor/abseil-cpp/absl/strings/str_cat.h +17 -12
- package/vendor/abseil-cpp/absl/strings/str_format_test.cc +4 -4
- package/vendor/abseil-cpp/absl/strings/str_split.h +1 -1
- package/vendor/abseil-cpp/absl/strings/str_split_test.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/string_view.h +8 -718
- package/vendor/abseil-cpp/absl/strings/string_view_test.cc +1 -1265
- package/vendor/abseil-cpp/absl/strings/substitute.cc +24 -24
- package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +2 -3
- package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +1 -0
- package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -2
- package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc +15 -5
- package/vendor/abseil-cpp/absl/synchronization/mutex.cc +2 -1
- package/vendor/abseil-cpp/absl/synchronization/mutex.h +47 -23
- package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
- package/vendor/abseil-cpp/absl/time/CMakeLists.txt +2 -0
- package/vendor/abseil-cpp/absl/time/civil_time_benchmark.cc +1 -2
- package/vendor/abseil-cpp/absl/time/civil_time_test.cc +58 -103
- package/vendor/abseil-cpp/absl/time/clock.cc +18 -16
- package/vendor/abseil-cpp/absl/time/clock_test.cc +2 -2
- package/vendor/abseil-cpp/absl/time/duration_benchmark.cc +144 -0
- package/vendor/abseil-cpp/absl/time/duration_test.cc +26 -29
- package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +7 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +4 -2
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +6 -103
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +186 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/iso3166.tab +9 -9
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +12 -12
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +47 -47
- package/vendor/abseil-cpp/absl/time/time.cc +4 -4
- package/vendor/abseil-cpp/absl/time/time.h +10 -10
- package/vendor/abseil-cpp/absl/time/time_test.cc +1 -0
- package/vendor/abseil-cpp/absl/types/compare.h +62 -61
- package/vendor/abseil-cpp/absl/types/compare_test.cc +3 -3
- package/vendor/abseil-cpp/absl/types/internal/span.h +1 -0
- package/vendor/abseil-cpp/absl/types/optional.h +2 -2
- package/vendor/abseil-cpp/absl/types/span.h +10 -2
- package/vendor/abseil-cpp/absl/utility/utility.h +13 -0
- package/vendor/abseil-cpp/ci/absl_alternate_options.h +0 -1
- package/vendor/abseil-cpp/ci/cmake_common.sh +1 -1
- package/vendor/abseil-cpp/ci/cmake_install_test.sh +6 -0
- package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +2 -0
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +6 -0
- package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +6 -0
- package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +3 -2
- package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +5 -0
- package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -0
- package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -0
- package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +6 -1
- package/vendor/abseil-cpp/absl/base/internal/identity.h +0 -39
- package/vendor/abseil-cpp/absl/strings/string_view.cc +0 -257
- package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +0 -380
|
@@ -26,12 +26,130 @@
|
|
|
26
26
|
#include "absl/base/prefetch.h"
|
|
27
27
|
#include "absl/hash/internal/city.h"
|
|
28
28
|
|
|
29
|
+
#ifdef ABSL_AES_INTERNAL_HAVE_X86_SIMD
|
|
30
|
+
#error ABSL_AES_INTERNAL_HAVE_X86_SIMD cannot be directly set
|
|
31
|
+
#elif defined(__SSE4_2__) && defined(__AES__)
|
|
32
|
+
#define ABSL_AES_INTERNAL_HAVE_X86_SIMD
|
|
33
|
+
#endif
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
#ifdef ABSL_AES_INTERNAL_HAVE_X86_SIMD
|
|
37
|
+
#include <smmintrin.h>
|
|
38
|
+
#include <wmmintrin.h>
|
|
39
|
+
#include <xmmintrin.h>
|
|
40
|
+
#endif // ABSL_AES_INTERNAL_HAVE_X86_SIMD
|
|
41
|
+
|
|
29
42
|
namespace absl {
|
|
30
43
|
ABSL_NAMESPACE_BEGIN
|
|
31
44
|
namespace hash_internal {
|
|
32
45
|
|
|
33
46
|
namespace {
|
|
34
47
|
|
|
48
|
+
void PrefetchFutureDataToLocalCache(const uint8_t* ptr) {
|
|
49
|
+
PrefetchToLocalCache(ptr + 5 * ABSL_CACHELINE_SIZE);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
#ifdef ABSL_AES_INTERNAL_HAVE_X86_SIMD
|
|
53
|
+
uint64_t Mix4x16Vectors(__m128i a, __m128i b, __m128i c, __m128i d) {
|
|
54
|
+
// res128 = encrypt(a + c, d) + decrypt(b - d, a)
|
|
55
|
+
auto res128 = _mm_add_epi64(_mm_aesenc_si128(_mm_add_epi64(a, c), d),
|
|
56
|
+
_mm_aesdec_si128(_mm_sub_epi64(b, d), a));
|
|
57
|
+
auto x64 = static_cast<uint64_t>(_mm_cvtsi128_si64(res128));
|
|
58
|
+
auto y64 = static_cast<uint64_t>(_mm_extract_epi64(res128, 1));
|
|
59
|
+
return x64 ^ y64;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
uint64_t LowLevelHash33To64(uint64_t seed, const uint8_t* ptr, size_t len) {
|
|
63
|
+
assert(len > 32);
|
|
64
|
+
assert(len <= 64);
|
|
65
|
+
__m128i state =
|
|
66
|
+
_mm_set_epi64x(static_cast<int64_t>(seed), static_cast<int64_t>(len));
|
|
67
|
+
auto a = _mm_loadu_si128(reinterpret_cast<const __m128i*>(ptr));
|
|
68
|
+
auto b = _mm_loadu_si128(reinterpret_cast<const __m128i*>(ptr + 16));
|
|
69
|
+
auto* last32_ptr = ptr + len - 32;
|
|
70
|
+
auto c = _mm_loadu_si128(reinterpret_cast<const __m128i*>(last32_ptr));
|
|
71
|
+
auto d = _mm_loadu_si128(reinterpret_cast<const __m128i*>(last32_ptr + 16));
|
|
72
|
+
|
|
73
|
+
// Bits of the second argument to _mm_aesdec_si128/_mm_aesenc_si128 are
|
|
74
|
+
// XORed with the state argument after encryption.
|
|
75
|
+
// We use each value as the first argument to shuffle all the bits around.
|
|
76
|
+
// We do not add any salt to the state or loaded data, instead we vary
|
|
77
|
+
// instructions used to mix bits _mm_aesdec_si128/_mm_aesenc_si128 and
|
|
78
|
+
// _mm_add_epi64/_mm_sub_epi64.
|
|
79
|
+
// _mm_add_epi64/_mm_sub_epi64 are combined to one instruction with data
|
|
80
|
+
// loading like `vpaddq xmm1, xmm0, xmmword ptr [rdi]`.
|
|
81
|
+
auto na = _mm_aesdec_si128(_mm_add_epi64(state, a), state);
|
|
82
|
+
auto nb = _mm_aesdec_si128(_mm_sub_epi64(state, b), state);
|
|
83
|
+
auto nc = _mm_aesenc_si128(_mm_add_epi64(state, c), state);
|
|
84
|
+
auto nd = _mm_aesenc_si128(_mm_sub_epi64(state, d), state);
|
|
85
|
+
|
|
86
|
+
// We perform another round of encryption to mix bits between two halves of
|
|
87
|
+
// the input.
|
|
88
|
+
return Mix4x16Vectors(na, nb, nc, nd);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
[[maybe_unused]] ABSL_ATTRIBUTE_NOINLINE uint64_t
|
|
92
|
+
LowLevelHashLenGt64(uint64_t seed, const void* data, size_t len) {
|
|
93
|
+
assert(len > 64);
|
|
94
|
+
const uint8_t* ptr = static_cast<const uint8_t*>(data);
|
|
95
|
+
const uint8_t* last_32_ptr = ptr + len - 32;
|
|
96
|
+
|
|
97
|
+
// If we have more than 64 bytes, we're going to handle chunks of 64
|
|
98
|
+
// bytes at a time. We're going to build up four separate hash states
|
|
99
|
+
// which we will then hash together. This avoids short dependency chains.
|
|
100
|
+
__m128i state0 =
|
|
101
|
+
_mm_set_epi64x(static_cast<int64_t>(seed), static_cast<int64_t>(len));
|
|
102
|
+
__m128i state1 = state0;
|
|
103
|
+
__m128i state2 = state1;
|
|
104
|
+
__m128i state3 = state2;
|
|
105
|
+
|
|
106
|
+
// Mixing two 128-bit vectors at a time with corresponding states.
|
|
107
|
+
// All variables are mixed slightly differently to avoid hash collision
|
|
108
|
+
// due to trivial byte rotation.
|
|
109
|
+
// We combine state and data with _mm_add_epi64/_mm_sub_epi64 before applying
|
|
110
|
+
// AES encryption to make hash function dependent on the order of the blocks.
|
|
111
|
+
// See comments in LowLevelHash33To64 for more considerations.
|
|
112
|
+
auto mix_ab = [&state0,
|
|
113
|
+
&state1](const uint8_t* p) ABSL_ATTRIBUTE_ALWAYS_INLINE {
|
|
114
|
+
// i128 a = *p;
|
|
115
|
+
// i128 b = *(p + 16);
|
|
116
|
+
// state0 = decrypt(state0 + a, state0);
|
|
117
|
+
// state1 = decrypt(state1 - b, state1);
|
|
118
|
+
auto a = _mm_loadu_si128(reinterpret_cast<const __m128i*>(p));
|
|
119
|
+
auto b = _mm_loadu_si128(reinterpret_cast<const __m128i*>(p + 16));
|
|
120
|
+
state0 = _mm_aesdec_si128(_mm_add_epi64(state0, a), state0);
|
|
121
|
+
state1 = _mm_aesdec_si128(_mm_sub_epi64(state1, b), state1);
|
|
122
|
+
};
|
|
123
|
+
auto mix_cd = [&state2,
|
|
124
|
+
&state3](const uint8_t* p) ABSL_ATTRIBUTE_ALWAYS_INLINE {
|
|
125
|
+
// i128 c = *p;
|
|
126
|
+
// i128 d = *(p + 16);
|
|
127
|
+
// state2 = encrypt(state2 + c, state2);
|
|
128
|
+
// state3 = encrypt(state3 - d, state3);
|
|
129
|
+
auto c = _mm_loadu_si128(reinterpret_cast<const __m128i*>(p));
|
|
130
|
+
auto d = _mm_loadu_si128(reinterpret_cast<const __m128i*>(p + 16));
|
|
131
|
+
state2 = _mm_aesenc_si128(_mm_add_epi64(state2, c), state2);
|
|
132
|
+
state3 = _mm_aesenc_si128(_mm_sub_epi64(state3, d), state3);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
do {
|
|
136
|
+
PrefetchFutureDataToLocalCache(ptr);
|
|
137
|
+
mix_ab(ptr);
|
|
138
|
+
mix_cd(ptr + 32);
|
|
139
|
+
|
|
140
|
+
ptr += 64;
|
|
141
|
+
len -= 64;
|
|
142
|
+
} while (len > 64);
|
|
143
|
+
|
|
144
|
+
// We now have a data `ptr` with at most 64 bytes.
|
|
145
|
+
if (len > 32) {
|
|
146
|
+
mix_ab(ptr);
|
|
147
|
+
}
|
|
148
|
+
mix_cd(last_32_ptr);
|
|
149
|
+
|
|
150
|
+
return Mix4x16Vectors(state0, state1, state2, state3);
|
|
151
|
+
}
|
|
152
|
+
#else
|
|
35
153
|
uint64_t Mix32Bytes(const uint8_t* ptr, uint64_t current_state) {
|
|
36
154
|
uint64_t a = absl::base_internal::UnalignedLoad64(ptr);
|
|
37
155
|
uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8);
|
|
@@ -43,48 +161,51 @@ uint64_t Mix32Bytes(const uint8_t* ptr, uint64_t current_state) {
|
|
|
43
161
|
return cs0 ^ cs1;
|
|
44
162
|
}
|
|
45
163
|
|
|
46
|
-
|
|
47
|
-
uint64_t seed) {
|
|
164
|
+
uint64_t LowLevelHash33To64(uint64_t seed, const uint8_t* ptr, size_t len) {
|
|
48
165
|
assert(len > 32);
|
|
166
|
+
assert(len <= 64);
|
|
167
|
+
uint64_t current_state = seed ^ kStaticRandomData[0] ^ len;
|
|
168
|
+
const uint8_t* last_32_ptr = ptr + len - 32;
|
|
169
|
+
return Mix32Bytes(last_32_ptr, Mix32Bytes(ptr, current_state));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
[[maybe_unused]] ABSL_ATTRIBUTE_NOINLINE uint64_t
|
|
173
|
+
LowLevelHashLenGt64(uint64_t seed, const void* data, size_t len) {
|
|
174
|
+
assert(len > 64);
|
|
49
175
|
const uint8_t* ptr = static_cast<const uint8_t*>(data);
|
|
50
176
|
uint64_t current_state = seed ^ kStaticRandomData[0] ^ len;
|
|
51
177
|
const uint8_t* last_32_ptr = ptr + len - 32;
|
|
178
|
+
// If we have more than 64 bytes, we're going to handle chunks of 64
|
|
179
|
+
// bytes at a time. We're going to build up four separate hash states
|
|
180
|
+
// which we will then hash together. This avoids short dependency chains.
|
|
181
|
+
uint64_t duplicated_state0 = current_state;
|
|
182
|
+
uint64_t duplicated_state1 = current_state;
|
|
183
|
+
uint64_t duplicated_state2 = current_state;
|
|
52
184
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
uint64_t
|
|
58
|
-
uint64_t
|
|
59
|
-
uint64_t
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
current_state = Mix(a ^ kStaticRandomData[1], b ^ current_state);
|
|
75
|
-
duplicated_state0 = Mix(c ^ kStaticRandomData[2], d ^ duplicated_state0);
|
|
76
|
-
|
|
77
|
-
duplicated_state1 = Mix(e ^ kStaticRandomData[3], f ^ duplicated_state1);
|
|
78
|
-
duplicated_state2 = Mix(g ^ kStaticRandomData[4], h ^ duplicated_state2);
|
|
79
|
-
|
|
80
|
-
ptr += 64;
|
|
81
|
-
len -= 64;
|
|
82
|
-
} while (len > 64);
|
|
83
|
-
|
|
84
|
-
current_state = (current_state ^ duplicated_state0) ^
|
|
85
|
-
(duplicated_state1 + duplicated_state2);
|
|
86
|
-
}
|
|
185
|
+
do {
|
|
186
|
+
PrefetchFutureDataToLocalCache(ptr);
|
|
187
|
+
|
|
188
|
+
uint64_t a = absl::base_internal::UnalignedLoad64(ptr);
|
|
189
|
+
uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8);
|
|
190
|
+
uint64_t c = absl::base_internal::UnalignedLoad64(ptr + 16);
|
|
191
|
+
uint64_t d = absl::base_internal::UnalignedLoad64(ptr + 24);
|
|
192
|
+
uint64_t e = absl::base_internal::UnalignedLoad64(ptr + 32);
|
|
193
|
+
uint64_t f = absl::base_internal::UnalignedLoad64(ptr + 40);
|
|
194
|
+
uint64_t g = absl::base_internal::UnalignedLoad64(ptr + 48);
|
|
195
|
+
uint64_t h = absl::base_internal::UnalignedLoad64(ptr + 56);
|
|
196
|
+
|
|
197
|
+
current_state = Mix(a ^ kStaticRandomData[1], b ^ current_state);
|
|
198
|
+
duplicated_state0 = Mix(c ^ kStaticRandomData[2], d ^ duplicated_state0);
|
|
199
|
+
|
|
200
|
+
duplicated_state1 = Mix(e ^ kStaticRandomData[3], f ^ duplicated_state1);
|
|
201
|
+
duplicated_state2 = Mix(g ^ kStaticRandomData[4], h ^ duplicated_state2);
|
|
202
|
+
|
|
203
|
+
ptr += 64;
|
|
204
|
+
len -= 64;
|
|
205
|
+
} while (len > 64);
|
|
87
206
|
|
|
207
|
+
current_state = (current_state ^ duplicated_state0) ^
|
|
208
|
+
(duplicated_state1 + duplicated_state2);
|
|
88
209
|
// We now have a data `ptr` with at most 64 bytes and the current state
|
|
89
210
|
// of the hashing state machine stored in current_state.
|
|
90
211
|
if (len > 32) {
|
|
@@ -96,9 +217,19 @@ uint64_t Mix32Bytes(const uint8_t* ptr, uint64_t current_state) {
|
|
|
96
217
|
// safely read from `ptr + len - 32`.
|
|
97
218
|
return Mix32Bytes(last_32_ptr, current_state);
|
|
98
219
|
}
|
|
220
|
+
#endif // ABSL_AES_INTERNAL_HAVE_X86_SIMD
|
|
221
|
+
|
|
222
|
+
[[maybe_unused]] uint64_t LowLevelHashLenGt32(uint64_t seed, const void* data,
|
|
223
|
+
size_t len) {
|
|
224
|
+
assert(len > 32);
|
|
225
|
+
if (ABSL_PREDICT_FALSE(len > 64)) {
|
|
226
|
+
return LowLevelHashLenGt64(seed, data, len);
|
|
227
|
+
}
|
|
228
|
+
return LowLevelHash33To64(seed, static_cast<const uint8_t*>(data), len);
|
|
229
|
+
}
|
|
99
230
|
|
|
100
231
|
ABSL_ATTRIBUTE_ALWAYS_INLINE inline uint64_t HashBlockOn32Bit(
|
|
101
|
-
const unsigned char* data, size_t len
|
|
232
|
+
uint64_t state, const unsigned char* data, size_t len) {
|
|
102
233
|
// TODO(b/417141985): expose and use CityHash32WithSeed.
|
|
103
234
|
// Note: we can't use PrecombineLengthMix here because len can be up to 1024.
|
|
104
235
|
return CombineRawImpl(
|
|
@@ -107,9 +238,9 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE inline uint64_t HashBlockOn32Bit(
|
|
|
107
238
|
}
|
|
108
239
|
|
|
109
240
|
ABSL_ATTRIBUTE_NOINLINE uint64_t
|
|
110
|
-
SplitAndCombineOn32Bit(const unsigned char* first, size_t len
|
|
241
|
+
SplitAndCombineOn32Bit(uint64_t state, const unsigned char* first, size_t len) {
|
|
111
242
|
while (len >= PiecewiseChunkSize()) {
|
|
112
|
-
state = HashBlockOn32Bit(first, PiecewiseChunkSize()
|
|
243
|
+
state = HashBlockOn32Bit(state, first, PiecewiseChunkSize());
|
|
113
244
|
len -= PiecewiseChunkSize();
|
|
114
245
|
first += PiecewiseChunkSize();
|
|
115
246
|
}
|
|
@@ -124,9 +255,9 @@ SplitAndCombineOn32Bit(const unsigned char* first, size_t len, uint64_t state) {
|
|
|
124
255
|
}
|
|
125
256
|
|
|
126
257
|
ABSL_ATTRIBUTE_ALWAYS_INLINE inline uint64_t HashBlockOn64Bit(
|
|
127
|
-
const unsigned char* data, size_t len
|
|
258
|
+
uint64_t state, const unsigned char* data, size_t len) {
|
|
128
259
|
#ifdef ABSL_HAVE_INTRINSIC_INT128
|
|
129
|
-
return LowLevelHashLenGt32(data, len
|
|
260
|
+
return LowLevelHashLenGt32(state, data, len);
|
|
130
261
|
#else
|
|
131
262
|
return hash_internal::CityHash64WithSeed(reinterpret_cast<const char*>(data),
|
|
132
263
|
len, state);
|
|
@@ -134,9 +265,9 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE inline uint64_t HashBlockOn64Bit(
|
|
|
134
265
|
}
|
|
135
266
|
|
|
136
267
|
ABSL_ATTRIBUTE_NOINLINE uint64_t
|
|
137
|
-
SplitAndCombineOn64Bit(const unsigned char* first, size_t len
|
|
268
|
+
SplitAndCombineOn64Bit(uint64_t state, const unsigned char* first, size_t len) {
|
|
138
269
|
while (len >= PiecewiseChunkSize()) {
|
|
139
|
-
state = HashBlockOn64Bit(first, PiecewiseChunkSize()
|
|
270
|
+
state = HashBlockOn64Bit(state, first, PiecewiseChunkSize());
|
|
140
271
|
len -= PiecewiseChunkSize();
|
|
141
272
|
first += PiecewiseChunkSize();
|
|
142
273
|
}
|
|
@@ -152,26 +283,26 @@ SplitAndCombineOn64Bit(const unsigned char* first, size_t len, uint64_t state) {
|
|
|
152
283
|
|
|
153
284
|
} // namespace
|
|
154
285
|
|
|
155
|
-
uint64_t CombineLargeContiguousImplOn32BitLengthGt8(
|
|
156
|
-
|
|
157
|
-
|
|
286
|
+
uint64_t CombineLargeContiguousImplOn32BitLengthGt8(uint64_t state,
|
|
287
|
+
const unsigned char* first,
|
|
288
|
+
size_t len) {
|
|
158
289
|
assert(len > 8);
|
|
159
290
|
assert(sizeof(size_t) == 4); // NOLINT(misc-static-assert)
|
|
160
291
|
if (ABSL_PREDICT_TRUE(len <= PiecewiseChunkSize())) {
|
|
161
|
-
return HashBlockOn32Bit(first, len
|
|
292
|
+
return HashBlockOn32Bit(state, first, len);
|
|
162
293
|
}
|
|
163
|
-
return SplitAndCombineOn32Bit(first, len
|
|
294
|
+
return SplitAndCombineOn32Bit(state, first, len);
|
|
164
295
|
}
|
|
165
296
|
|
|
166
|
-
uint64_t CombineLargeContiguousImplOn64BitLengthGt32(
|
|
167
|
-
|
|
168
|
-
|
|
297
|
+
uint64_t CombineLargeContiguousImplOn64BitLengthGt32(uint64_t state,
|
|
298
|
+
const unsigned char* first,
|
|
299
|
+
size_t len) {
|
|
169
300
|
assert(len > 32);
|
|
170
301
|
assert(sizeof(size_t) == 8); // NOLINT(misc-static-assert)
|
|
171
302
|
if (ABSL_PREDICT_TRUE(len <= PiecewiseChunkSize())) {
|
|
172
|
-
return HashBlockOn64Bit(first, len
|
|
303
|
+
return HashBlockOn64Bit(state, first, len);
|
|
173
304
|
}
|
|
174
|
-
return SplitAndCombineOn64Bit(first, len
|
|
305
|
+
return SplitAndCombineOn64Bit(state, first, len);
|
|
175
306
|
}
|
|
176
307
|
|
|
177
308
|
ABSL_CONST_INIT const void* const MixingHashState::kSeed = &kSeed;
|
|
@@ -74,6 +74,7 @@
|
|
|
74
74
|
#include <vector>
|
|
75
75
|
|
|
76
76
|
#include "absl/base/attributes.h"
|
|
77
|
+
#include "absl/base/internal/endian.h"
|
|
77
78
|
#include "absl/base/internal/unaligned_access.h"
|
|
78
79
|
#include "absl/base/optimization.h"
|
|
79
80
|
#include "absl/base/port.h"
|
|
@@ -93,6 +94,38 @@
|
|
|
93
94
|
#include <filesystem> // NOLINT
|
|
94
95
|
#endif
|
|
95
96
|
|
|
97
|
+
// 32-bit builds with SSE 4.2 do not have _mm_crc32_u64, so the
|
|
98
|
+
// __x86_64__ condition is necessary.
|
|
99
|
+
#if defined(__SSE4_2__) && defined(__x86_64__)
|
|
100
|
+
|
|
101
|
+
#include <x86intrin.h>
|
|
102
|
+
#define ABSL_HASH_INTERNAL_HAS_CRC32
|
|
103
|
+
#define ABSL_HASH_INTERNAL_CRC32_U64 _mm_crc32_u64
|
|
104
|
+
#define ABSL_HASH_INTERNAL_CRC32_U32 _mm_crc32_u32
|
|
105
|
+
#define ABSL_HASH_INTERNAL_CRC32_U8 _mm_crc32_u8
|
|
106
|
+
|
|
107
|
+
#elif defined(_MSC_VER) && !defined(__clang__) && defined(__AVX__)
|
|
108
|
+
|
|
109
|
+
// MSVC AVX (/arch:AVX) implies SSE 4.2.
|
|
110
|
+
#include <intrin.h>
|
|
111
|
+
#define ABSL_HASH_INTERNAL_HAS_CRC32
|
|
112
|
+
#define ABSL_HASH_INTERNAL_CRC32_U64 _mm_crc32_u64
|
|
113
|
+
#define ABSL_HASH_INTERNAL_CRC32_U32 _mm_crc32_u32
|
|
114
|
+
#define ABSL_HASH_INTERNAL_CRC32_U8 _mm_crc32_u8
|
|
115
|
+
|
|
116
|
+
#elif defined(__ARM_FEATURE_CRC32)
|
|
117
|
+
|
|
118
|
+
#include <arm_acle.h>
|
|
119
|
+
#define ABSL_HASH_INTERNAL_HAS_CRC32
|
|
120
|
+
// Casting to uint32_t to be consistent with x86 intrinsic (_mm_crc32_u64
|
|
121
|
+
// accepts crc as 64 bit integer).
|
|
122
|
+
#define ABSL_HASH_INTERNAL_CRC32_U64(crc, data) \
|
|
123
|
+
__crc32cd(static_cast<uint32_t>(crc), data)
|
|
124
|
+
#define ABSL_HASH_INTERNAL_CRC32_U32 __crc32cw
|
|
125
|
+
#define ABSL_HASH_INTERNAL_CRC32_U8 __crc32cb
|
|
126
|
+
|
|
127
|
+
#endif
|
|
128
|
+
|
|
96
129
|
namespace absl {
|
|
97
130
|
ABSL_NAMESPACE_BEGIN
|
|
98
131
|
|
|
@@ -965,18 +998,20 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE inline uint64_t Mix(uint64_t lhs, uint64_t rhs) {
|
|
|
965
998
|
return Uint128High64(m) ^ Uint128Low64(m);
|
|
966
999
|
}
|
|
967
1000
|
|
|
968
|
-
// Reads 8 bytes from p.
|
|
969
|
-
inline uint64_t Read8(const unsigned char* p) {
|
|
970
1001
|
// Suppress erroneous array bounds errors on GCC.
|
|
971
1002
|
#if defined(__GNUC__) && !defined(__clang__)
|
|
972
1003
|
#pragma GCC diagnostic push
|
|
973
1004
|
#pragma GCC diagnostic ignored "-Warray-bounds"
|
|
974
1005
|
#endif
|
|
1006
|
+
inline uint32_t Read4(const unsigned char* p) {
|
|
1007
|
+
return absl::base_internal::UnalignedLoad32(p);
|
|
1008
|
+
}
|
|
1009
|
+
inline uint64_t Read8(const unsigned char* p) {
|
|
975
1010
|
return absl::base_internal::UnalignedLoad64(p);
|
|
1011
|
+
}
|
|
976
1012
|
#if defined(__GNUC__) && !defined(__clang__)
|
|
977
1013
|
#pragma GCC diagnostic pop
|
|
978
1014
|
#endif
|
|
979
|
-
}
|
|
980
1015
|
|
|
981
1016
|
// Reads 9 to 16 bytes from p.
|
|
982
1017
|
// The first 8 bytes are in .first, and the rest of the bytes are in .second
|
|
@@ -1030,11 +1065,12 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE inline uint64_t CombineRawImpl(uint64_t state,
|
|
|
1030
1065
|
// Slow dispatch path for calls to CombineContiguousImpl with a size argument
|
|
1031
1066
|
// larger than inlined size. Has the same effect as calling
|
|
1032
1067
|
// CombineContiguousImpl() repeatedly with the chunk stride size.
|
|
1033
|
-
uint64_t CombineLargeContiguousImplOn32BitLengthGt8(
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1068
|
+
uint64_t CombineLargeContiguousImplOn32BitLengthGt8(uint64_t state,
|
|
1069
|
+
const unsigned char* first,
|
|
1070
|
+
size_t len);
|
|
1071
|
+
uint64_t CombineLargeContiguousImplOn64BitLengthGt32(uint64_t state,
|
|
1072
|
+
const unsigned char* first,
|
|
1073
|
+
size_t len);
|
|
1038
1074
|
|
|
1039
1075
|
ABSL_ATTRIBUTE_ALWAYS_INLINE inline uint64_t CombineSmallContiguousImpl(
|
|
1040
1076
|
uint64_t state, const unsigned char* first, size_t len) {
|
|
@@ -1092,9 +1128,73 @@ inline uint64_t CombineContiguousImpl(
|
|
|
1092
1128
|
return CombineSmallContiguousImpl(PrecombineLengthMix(state, len), first,
|
|
1093
1129
|
len);
|
|
1094
1130
|
}
|
|
1095
|
-
return CombineLargeContiguousImplOn32BitLengthGt8(first, len
|
|
1131
|
+
return CombineLargeContiguousImplOn32BitLengthGt8(state, first, len);
|
|
1096
1132
|
}
|
|
1097
1133
|
|
|
1134
|
+
#ifdef ABSL_HASH_INTERNAL_HAS_CRC32
|
|
1135
|
+
inline uint64_t CombineContiguousImpl(
|
|
1136
|
+
uint64_t state, const unsigned char* first, size_t len,
|
|
1137
|
+
std::integral_constant<int, 8> /* sizeof_size_t */) {
|
|
1138
|
+
if (ABSL_PREDICT_FALSE(len > 32)) {
|
|
1139
|
+
return CombineLargeContiguousImplOn64BitLengthGt32(state, first, len);
|
|
1140
|
+
}
|
|
1141
|
+
// `mul` is the salt that is used for final mixing. It is important to fill
|
|
1142
|
+
// high 32 bits because CRC wipes out high 32 bits.
|
|
1143
|
+
// `rotr` is important to mix `len` into high 32 bits.
|
|
1144
|
+
uint64_t mul = absl::rotr(kMul, static_cast<int>(len));
|
|
1145
|
+
// Only low 32 bits of each uint64_t are used in CRC32 so we use gbswap_64 to
|
|
1146
|
+
// move high 32 bits to low 32 bits. It has slightly smaller binary size than
|
|
1147
|
+
// `>> 32`. `state + 8 * len` is a single instruction on both x86 and ARM, so
|
|
1148
|
+
// we use it to better mix length. Although only the low 32 bits of the pair
|
|
1149
|
+
// elements are used, we use pair<uint64_t, uint64_t> for better generated
|
|
1150
|
+
// code.
|
|
1151
|
+
std::pair<uint64_t, uint64_t> crcs = {state + 8 * len,
|
|
1152
|
+
absl::gbswap_64(state)};
|
|
1153
|
+
|
|
1154
|
+
// All CRC operations here directly read bytes from the memory.
|
|
1155
|
+
// Single fused instructions are used, like `crc32 rcx, qword ptr [rsi]`.
|
|
1156
|
+
// On x86, llvm-mca reports latency `R + 2` for such fused instructions, while
|
|
1157
|
+
// `R + 3` for two separate `mov` + `crc` instructions. `R` is the latency of
|
|
1158
|
+
// reading the memory. Fused instructions also reduce register pressure
|
|
1159
|
+
// allowing surrounding code to be more efficient when this code is inlined.
|
|
1160
|
+
if (len > 8) {
|
|
1161
|
+
crcs = {ABSL_HASH_INTERNAL_CRC32_U64(crcs.first, Read8(first)),
|
|
1162
|
+
ABSL_HASH_INTERNAL_CRC32_U64(crcs.second, Read8(first + len - 8))};
|
|
1163
|
+
if (len > 16) {
|
|
1164
|
+
// We compute the second round of dependent CRC32 operations.
|
|
1165
|
+
crcs = {ABSL_HASH_INTERNAL_CRC32_U64(crcs.first, Read8(first + len - 16)),
|
|
1166
|
+
ABSL_HASH_INTERNAL_CRC32_U64(crcs.second, Read8(first + 8))};
|
|
1167
|
+
}
|
|
1168
|
+
} else {
|
|
1169
|
+
if (len >= 4) {
|
|
1170
|
+
// We use CRC for 4 bytes to benefit from the fused instruction and better
|
|
1171
|
+
// hash quality.
|
|
1172
|
+
// Using `xor` or `add` may reduce latency for this case, but would
|
|
1173
|
+
// require more registers, more instructions and will have worse hash
|
|
1174
|
+
// quality.
|
|
1175
|
+
crcs = {ABSL_HASH_INTERNAL_CRC32_U32(static_cast<uint32_t>(crcs.first),
|
|
1176
|
+
Read4(first)),
|
|
1177
|
+
ABSL_HASH_INTERNAL_CRC32_U32(static_cast<uint32_t>(crcs.second),
|
|
1178
|
+
Read4(first + len - 4))};
|
|
1179
|
+
} else if (len >= 1) {
|
|
1180
|
+
// We mix three bytes all into different output registers.
|
|
1181
|
+
// This way, we do not need shifting of these bytes (so they don't overlap
|
|
1182
|
+
// with each other).
|
|
1183
|
+
crcs = {ABSL_HASH_INTERNAL_CRC32_U8(static_cast<uint32_t>(crcs.first),
|
|
1184
|
+
first[0]),
|
|
1185
|
+
ABSL_HASH_INTERNAL_CRC32_U8(static_cast<uint32_t>(crcs.second),
|
|
1186
|
+
first[len - 1])};
|
|
1187
|
+
// Middle byte is mixed weaker. It is a new byte only for len == 3.
|
|
1188
|
+
// Mixing is independent from CRC operations so it is scheduled ASAP.
|
|
1189
|
+
mul += first[len / 2];
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
// `mul` is mixed into both sides of `Mix` to guarantee non-zero values for
|
|
1193
|
+
// both multiplicands. Using Mix instead of just multiplication here improves
|
|
1194
|
+
// hash quality, especially for short strings.
|
|
1195
|
+
return Mix(mul - crcs.first, crcs.second - mul);
|
|
1196
|
+
}
|
|
1197
|
+
#else
|
|
1098
1198
|
inline uint64_t CombineContiguousImpl(
|
|
1099
1199
|
uint64_t state, const unsigned char* first, size_t len,
|
|
1100
1200
|
std::integral_constant<int, 8> /* sizeof_size_t */) {
|
|
@@ -1115,8 +1215,9 @@ inline uint64_t CombineContiguousImpl(
|
|
|
1115
1215
|
// We must not mix length into the state here because calling
|
|
1116
1216
|
// CombineContiguousImpl twice with PiecewiseChunkSize() must be equivalent
|
|
1117
1217
|
// to calling CombineLargeContiguousImpl once with 2 * PiecewiseChunkSize().
|
|
1118
|
-
return CombineLargeContiguousImplOn64BitLengthGt32(first, len
|
|
1218
|
+
return CombineLargeContiguousImplOn64BitLengthGt32(state, first, len);
|
|
1119
1219
|
}
|
|
1220
|
+
#endif // ABSL_HASH_INTERNAL_HAS_CRC32
|
|
1120
1221
|
|
|
1121
1222
|
#if defined(ABSL_INTERNAL_LEGACY_HASH_NAMESPACE) && \
|
|
1122
1223
|
ABSL_META_INTERNAL_STD_HASH_SFINAE_FRIENDLY_
|
|
@@ -1451,4 +1552,9 @@ H PiecewiseCombiner::finalize(H state) {
|
|
|
1451
1552
|
ABSL_NAMESPACE_END
|
|
1452
1553
|
} // namespace absl
|
|
1453
1554
|
|
|
1555
|
+
#undef ABSL_HASH_INTERNAL_HAS_CRC32
|
|
1556
|
+
#undef ABSL_HASH_INTERNAL_CRC32_U64
|
|
1557
|
+
#undef ABSL_HASH_INTERNAL_CRC32_U32
|
|
1558
|
+
#undef ABSL_HASH_INTERNAL_CRC32_U8
|
|
1559
|
+
|
|
1454
1560
|
#endif // ABSL_HASH_INTERNAL_HASH_H_
|
|
@@ -361,9 +361,48 @@ TEST(LowLevelHashTest, VerifyGolden) {
|
|
|
361
361
|
#if defined(ABSL_IS_BIG_ENDIAN) || !defined(ABSL_HAVE_INTRINSIC_INT128) || \
|
|
362
362
|
UINTPTR_MAX != UINT64_MAX
|
|
363
363
|
constexpr uint64_t kGolden[kNumGoldenOutputs] = {};
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
364
|
+
// This conditional is to avoid an unreachable code warning.
|
|
365
|
+
bool skip = true;
|
|
366
|
+
if (skip) {
|
|
367
|
+
GTEST_SKIP()
|
|
368
|
+
<< "We only maintain golden data for little endian 64 bit systems with "
|
|
369
|
+
"128 bit intristics.";
|
|
370
|
+
}
|
|
371
|
+
#elif defined(__SSE4_2__) && defined(__AES__)
|
|
372
|
+
constexpr uint64_t kGolden[kNumGoldenOutputs] = {
|
|
373
|
+
0xd6bdb2c9ba5e55f2, 0xffd3e23d4115a8ae, 0x2c3218ef486127de,
|
|
374
|
+
0x554fa7f3a262b886, 0x06304cbf82e312d3, 0x490b3fb5af80622c,
|
|
375
|
+
0x7398a90b8cc59c5d, 0x65fb3168b98030ab, 0xd4564363c53617bb,
|
|
376
|
+
0x0545c26351925fe7, 0xc30700723b634bf4, 0xfb23a140a76dbe94,
|
|
377
|
+
0x2fa1467fe218a47c, 0x92e05ec3a7b966eb, 0x6112b56e5624dd50,
|
|
378
|
+
0x8760801365f9d722, 0x41f7187b61db0e5e, 0x7fe9188a1f5f50ad,
|
|
379
|
+
0x25800bd4c2002ef1, 0x91fecd33a78ef0aa, 0x93986ad71e983613,
|
|
380
|
+
0xe4c78173c7ea537b, 0x0bbdc2bcabdb50b1, 0xd9aa134df2d87623,
|
|
381
|
+
0x6c4907c9477a9409, 0xc3e418a5dbda52e5, 0x4d24f3e9d0dda93a,
|
|
382
|
+
0xcdb565a363dbe45f, 0xa95f228c8ee57478, 0x6b8f00bab5130227,
|
|
383
|
+
0x2d05a0f44818b67a, 0xd6bf7d990b5f44cb, 0xa3608bdb4712861a,
|
|
384
|
+
0xf20c33e5e355330b, 0xbc86e1b13130180d, 0x0848221b397b839a,
|
|
385
|
+
0x17cc0acf44a7e210, 0xc18c6dc584fe0f62, 0x896c7858a59f991d,
|
|
386
|
+
0xeab1e6d7d2856ed7, 0x7e4b2d99c23edc51, 0x9aeeeb7fa46e7cf0,
|
|
387
|
+
0x161b9f2e3611790f, 0x5f82aae18d971b36, 0x8d0dd9965881e162,
|
|
388
|
+
0x56700ea26285895a, 0xcd919c86c29a053e, 0x3e5d589282d9a722,
|
|
389
|
+
0x92caee9f48a66604, 0x7e1a2fd9b06f14b0, 0xce1d5293f95b0178,
|
|
390
|
+
0x8101361290e70a11, 0x570e3e9c9eafc1c6, 0x77b6241926a7a568,
|
|
391
|
+
0x313e5cb34f346699, 0xab8ebeab0514b82b, 0x6e0a43763a310408,
|
|
392
|
+
0x761b76ec22b2e440, 0x4238c84a9ec00528, 0xb9ea1f6d4d5552af,
|
|
393
|
+
0xd21f8f110b9dc060, 0xb3d3842b69ac3689, 0xd0a88aa1dcf59869,
|
|
394
|
+
0xf3f69f637b123403, 0xf5f34b1068cac7da, 0xe69a08d604774abf,
|
|
395
|
+
0x57648d3a73332437, 0x9762947f5013d00d, 0x35c5d734a0015922,
|
|
396
|
+
0xbee2fe5a104ce209, 0xedb060efa6efca34, 0x5ccf0f4786d97bc2,
|
|
397
|
+
0x1ef8ed72e80d7bef, 0x58522deb49c5e30f, 0xde97cd2a6f8bd13b,
|
|
398
|
+
0x3fae37c6f9855d09, 0xea99ae786feca261, 0x8c6d1d46670b0943,
|
|
399
|
+
0x84658b2a232c7bfb, 0x7058b7a7968de394, 0x0d44fba68e25aa8f,
|
|
400
|
+
0xc7f687020f8eb00b, 0xbf9671e1196153d6, 0x1009be891b7f83e7,
|
|
401
|
+
0x4f9457fb4aa12865, 0x30a49d9563643b32, 0x0302e2c5b46d5a3a,
|
|
402
|
+
0x77553f42fb0bfbf7, 0x26b95e89f0077110, 0x76ce68ebe01191ba,
|
|
403
|
+
0x724110fb509e4376, 0xebe74b016b5cfb88, 0x3b0fe11dcf175fc9,
|
|
404
|
+
0x20b737b9c0490538, 0x0db21c429b45fd17,
|
|
405
|
+
};
|
|
367
406
|
#else
|
|
368
407
|
constexpr uint64_t kGolden[kNumGoldenOutputs] = {
|
|
369
408
|
0x669da02f8d009e0f, 0xceb19bf2255445cd, 0x0e746992d6d43a7c,
|
|
@@ -403,7 +442,7 @@ TEST(LowLevelHashTest, VerifyGolden) {
|
|
|
403
442
|
|
|
404
443
|
auto hash_fn = [](absl::string_view s, uint64_t state) {
|
|
405
444
|
return absl::hash_internal::CombineLargeContiguousImplOn64BitLengthGt32(
|
|
406
|
-
reinterpret_cast<const unsigned char*>(s.data()), s.size()
|
|
445
|
+
state, reinterpret_cast<const unsigned char*>(s.data()), s.size());
|
|
407
446
|
};
|
|
408
447
|
|
|
409
448
|
#if UPDATE_GOLDEN
|
|
@@ -28,7 +28,6 @@ absl_cc_library(
|
|
|
28
28
|
absl::core_headers
|
|
29
29
|
absl::log_internal_check_op
|
|
30
30
|
absl::log_internal_conditions
|
|
31
|
-
absl::log_internal_message
|
|
32
31
|
absl::log_internal_strip
|
|
33
32
|
)
|
|
34
33
|
|
|
@@ -467,6 +466,8 @@ absl_cc_library(
|
|
|
467
466
|
absl::config
|
|
468
467
|
absl::core_headers
|
|
469
468
|
absl::log
|
|
469
|
+
absl::nullability
|
|
470
|
+
absl::nullability_traits_internal
|
|
470
471
|
absl::strings
|
|
471
472
|
PUBLIC
|
|
472
473
|
)
|
|
@@ -1203,3 +1204,36 @@ absl_cc_test(
|
|
|
1203
1204
|
absl::log_internal_fnmatch
|
|
1204
1205
|
GTest::gmock_main
|
|
1205
1206
|
)
|
|
1207
|
+
|
|
1208
|
+
absl_cc_library(
|
|
1209
|
+
NAME
|
|
1210
|
+
log_internal_container
|
|
1211
|
+
HDRS
|
|
1212
|
+
"internal/container.h"
|
|
1213
|
+
COPTS
|
|
1214
|
+
${ABSL_DEFAULT_COPTS}
|
|
1215
|
+
LINKOPTS
|
|
1216
|
+
${ABSL_DEFAULT_LINKOPTS}
|
|
1217
|
+
DEPS
|
|
1218
|
+
absl::config
|
|
1219
|
+
absl::requires_internal
|
|
1220
|
+
absl::strings
|
|
1221
|
+
)
|
|
1222
|
+
|
|
1223
|
+
absl_cc_test(
|
|
1224
|
+
NAME
|
|
1225
|
+
internal_container_test
|
|
1226
|
+
SRCS
|
|
1227
|
+
"internal/container_test.cc"
|
|
1228
|
+
COPTS
|
|
1229
|
+
${ABSL_TEST_COPTS}
|
|
1230
|
+
LINKOPTS
|
|
1231
|
+
${ABSL_DEFAULT_LINKOPTS}
|
|
1232
|
+
DEPS
|
|
1233
|
+
absl::config
|
|
1234
|
+
absl::log_internal_container
|
|
1235
|
+
absl::span
|
|
1236
|
+
absl::strings
|
|
1237
|
+
absl::str_format
|
|
1238
|
+
GTest::gmock_main
|
|
1239
|
+
)
|