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.
Files changed (280) hide show
  1. package/README.md +2 -0
  2. package/binding.gyp +3 -2
  3. package/package.json +5 -5
  4. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +25 -4
  5. package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +6 -1
  6. package/vendor/abseil-cpp/CMakeLists.txt +2 -2
  7. package/vendor/abseil-cpp/MODULE.bazel +2 -2
  8. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +0 -1
  9. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +0 -2
  10. package/vendor/abseil-cpp/absl/algorithm/container.h +191 -140
  11. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +818 -0
  12. package/vendor/abseil-cpp/absl/base/BUILD.bazel +44 -5
  13. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +42 -3
  14. package/vendor/abseil-cpp/absl/base/attributes.h +5 -1
  15. package/vendor/abseil-cpp/absl/base/call_once_test.cc +10 -10
  16. package/vendor/abseil-cpp/absl/base/casts.cc +61 -0
  17. package/vendor/abseil-cpp/absl/base/casts.h +128 -2
  18. package/vendor/abseil-cpp/absl/base/casts_test.cc +151 -0
  19. package/vendor/abseil-cpp/absl/base/config.h +13 -37
  20. package/vendor/abseil-cpp/absl/base/internal/dynamic_annotations.h +1 -1
  21. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +4 -0
  22. package/vendor/abseil-cpp/absl/base/internal/nullability_traits.h +71 -0
  23. package/vendor/abseil-cpp/absl/base/internal/nullability_traits_test.cc +98 -0
  24. package/vendor/abseil-cpp/absl/base/internal/raw_logging.cc +3 -4
  25. package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +13 -7
  26. package/vendor/abseil-cpp/absl/base/internal/spinlock.h +16 -11
  27. package/vendor/abseil-cpp/absl/base/internal/strerror_test.cc +2 -1
  28. package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +0 -9
  29. package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +0 -6
  30. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -1
  31. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +1 -1
  32. package/vendor/abseil-cpp/absl/base/macros.h +40 -17
  33. package/vendor/abseil-cpp/absl/base/nullability.h +1 -1
  34. package/vendor/abseil-cpp/absl/base/optimization.h +1 -3
  35. package/vendor/abseil-cpp/absl/base/options.h +1 -27
  36. package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +5 -8
  37. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +4 -0
  38. package/vendor/abseil-cpp/absl/container/BUILD.bazel +195 -2
  39. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +136 -2
  40. package/vendor/abseil-cpp/absl/container/btree_map.h +56 -6
  41. package/vendor/abseil-cpp/absl/container/btree_set.h +52 -6
  42. package/vendor/abseil-cpp/absl/container/btree_test.cc +107 -1
  43. package/vendor/abseil-cpp/absl/container/chunked_queue.h +755 -0
  44. package/vendor/abseil-cpp/absl/container/chunked_queue_benchmark.cc +386 -0
  45. package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +768 -0
  46. package/vendor/abseil-cpp/absl/container/fixed_array.h +4 -6
  47. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +16 -6
  48. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +1 -2
  49. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +16 -6
  50. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +0 -2
  51. package/vendor/abseil-cpp/absl/container/inlined_vector.h +12 -4
  52. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +21 -0
  53. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +14 -5
  54. package/vendor/abseil-cpp/absl/container/internal/chunked_queue.h +173 -0
  55. package/vendor/abseil-cpp/absl/container/internal/common.h +51 -0
  56. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +7 -1
  57. package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +11 -0
  58. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +0 -2
  59. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +1 -2
  60. package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +0 -14
  61. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +11 -8
  62. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +3 -4
  63. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +23 -6
  64. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +31 -15
  65. package/vendor/abseil-cpp/absl/container/internal/heterogeneous_lookup_testing.h +80 -0
  66. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +4 -12
  67. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +35 -10
  68. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +149 -23
  69. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +120 -126
  70. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +4 -0
  71. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +8 -0
  72. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +14 -59
  73. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +111 -22
  74. package/vendor/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h +53 -112
  75. package/vendor/abseil-cpp/absl/container/internal/unordered_map_lookup_test.h +10 -15
  76. package/vendor/abseil-cpp/absl/container/internal/unordered_map_members_test.h +3 -3
  77. package/vendor/abseil-cpp/absl/container/internal/unordered_map_modifiers_test.h +45 -61
  78. package/vendor/abseil-cpp/absl/container/internal/unordered_set_constructor_test.h +53 -112
  79. package/vendor/abseil-cpp/absl/container/internal/unordered_set_lookup_test.h +6 -9
  80. package/vendor/abseil-cpp/absl/container/internal/unordered_set_members_test.h +3 -3
  81. package/vendor/abseil-cpp/absl/container/internal/unordered_set_modifiers_test.h +25 -31
  82. package/vendor/abseil-cpp/absl/container/linked_hash_map.h +666 -0
  83. package/vendor/abseil-cpp/absl/container/linked_hash_map_benchmark.cc +140 -0
  84. package/vendor/abseil-cpp/absl/container/linked_hash_map_test.cc +987 -0
  85. package/vendor/abseil-cpp/absl/container/linked_hash_set.h +527 -0
  86. package/vendor/abseil-cpp/absl/container/linked_hash_set_benchmark.cc +84 -0
  87. package/vendor/abseil-cpp/absl/container/linked_hash_set_test.cc +947 -0
  88. package/vendor/abseil-cpp/absl/container/node_hash_map.h +17 -6
  89. package/vendor/abseil-cpp/absl/container/node_hash_set.h +16 -5
  90. package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +1 -2
  91. package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +79 -0
  92. package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +79 -0
  93. package/vendor/abseil-cpp/absl/copts/copts.py +17 -4
  94. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +67 -13
  95. package/vendor/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +4 -2
  96. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +31 -0
  97. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +34 -0
  98. package/vendor/abseil-cpp/absl/debugging/failure_signal_handler.cc +2 -2
  99. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +118 -0
  100. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +71 -0
  101. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +97 -0
  102. package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +2 -2
  103. package/vendor/abseil-cpp/absl/debugging/internal/elf_mem_image.h +4 -4
  104. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +4 -0
  105. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +7 -0
  106. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +1 -1
  107. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +0 -7
  108. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +3 -2
  109. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +2 -1
  110. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  111. package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +2 -2
  112. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +35 -67
  113. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +3 -0
  114. package/vendor/abseil-cpp/absl/debugging/stacktrace_benchmark.cc +24 -1
  115. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +39 -15
  116. package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +4 -17
  117. package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +25 -40
  118. package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +2 -4
  119. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +1 -0
  120. package/vendor/abseil-cpp/absl/flags/declare.h +9 -0
  121. package/vendor/abseil-cpp/absl/flags/flag.h +2 -1
  122. package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +1 -1
  123. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +3 -2
  124. package/vendor/abseil-cpp/absl/flags/marshalling.cc +1 -16
  125. package/vendor/abseil-cpp/absl/flags/parse.cc +4 -2
  126. package/vendor/abseil-cpp/absl/flags/parse_test.cc +1 -1
  127. package/vendor/abseil-cpp/absl/flags/reflection.cc +4 -3
  128. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +4 -0
  129. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +4 -0
  130. package/vendor/abseil-cpp/absl/functional/any_invocable.h +3 -1
  131. package/vendor/abseil-cpp/absl/functional/function_ref.h +125 -20
  132. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +122 -9
  133. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +13 -2
  134. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +42 -4
  135. package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +11 -0
  136. package/vendor/abseil-cpp/absl/hash/hash_test.cc +5 -2
  137. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +184 -53
  138. package/vendor/abseil-cpp/absl/hash/internal/hash.h +116 -10
  139. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +43 -4
  140. package/vendor/abseil-cpp/absl/log/BUILD.bazel +2 -0
  141. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +35 -1
  142. package/vendor/abseil-cpp/absl/log/check_test_impl.inc +59 -4
  143. package/vendor/abseil-cpp/absl/log/die_if_null.cc +3 -1
  144. package/vendor/abseil-cpp/absl/log/die_if_null.h +24 -3
  145. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +31 -1
  146. package/vendor/abseil-cpp/absl/log/internal/check_impl.h +2 -1
  147. package/vendor/abseil-cpp/absl/log/internal/check_op.cc +3 -1
  148. package/vendor/abseil-cpp/absl/log/internal/check_op.h +44 -18
  149. package/vendor/abseil-cpp/absl/log/internal/conditions.h +38 -35
  150. package/vendor/abseil-cpp/absl/log/internal/container.h +312 -0
  151. package/vendor/abseil-cpp/absl/log/internal/container_test.cc +254 -0
  152. package/vendor/abseil-cpp/absl/log/internal/log_impl.h +108 -110
  153. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -2
  154. package/vendor/abseil-cpp/absl/log/internal/log_message.h +5 -1
  155. package/vendor/abseil-cpp/absl/log/internal/strip.h +30 -31
  156. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +19 -19
  157. package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +0 -1
  158. package/vendor/abseil-cpp/absl/log/log.h +2 -2
  159. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +51 -0
  160. package/vendor/abseil-cpp/absl/meta/CMakeLists.txt +46 -0
  161. package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing.h +73 -0
  162. package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing_test.cc +40 -0
  163. package/vendor/abseil-cpp/absl/meta/internal/requires.h +67 -0
  164. package/vendor/abseil-cpp/absl/meta/internal/requires_test.cc +66 -0
  165. package/vendor/abseil-cpp/absl/meta/type_traits.h +42 -1
  166. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +14 -0
  167. package/vendor/abseil-cpp/absl/numeric/int128.h +41 -21
  168. package/vendor/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +16 -22
  169. package/vendor/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +5 -7
  170. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +52 -5
  171. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +1 -0
  172. package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +1 -0
  173. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +18 -7
  174. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +1 -0
  175. package/vendor/abseil-cpp/absl/random/internal/fastmath_test.cc +3 -5
  176. package/vendor/abseil-cpp/absl/random/internal/platform.h +0 -13
  177. package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +0 -1
  178. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +1 -27
  179. package/vendor/abseil-cpp/absl/status/BUILD.bazel +17 -0
  180. package/vendor/abseil-cpp/absl/status/CMakeLists.txt +16 -0
  181. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +4 -2
  182. package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +2 -2
  183. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +2 -1
  184. package/vendor/abseil-cpp/absl/status/status.cc +4 -0
  185. package/vendor/abseil-cpp/absl/status/status.h +5 -0
  186. package/vendor/abseil-cpp/absl/status/status_matchers.h +48 -0
  187. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +27 -0
  188. package/vendor/abseil-cpp/absl/status/status_test.cc +1 -0
  189. package/vendor/abseil-cpp/absl/status/statusor.h +1 -1
  190. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +101 -21
  191. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +99 -5
  192. package/vendor/abseil-cpp/absl/strings/ascii.h +9 -4
  193. package/vendor/abseil-cpp/absl/strings/cord.cc +15 -10
  194. package/vendor/abseil-cpp/absl/strings/cord.h +1 -1
  195. package/vendor/abseil-cpp/absl/strings/escaping.cc +126 -94
  196. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
  197. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite_test.cc +95 -0
  198. package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +2 -0
  199. package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree_test.cc +8 -8
  200. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +24 -18
  201. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +10 -16
  202. package/vendor/abseil-cpp/absl/strings/internal/escaping.h +9 -7
  203. package/vendor/abseil-cpp/absl/strings/internal/generic_printer.cc +107 -0
  204. package/vendor/abseil-cpp/absl/strings/internal/generic_printer.h +115 -0
  205. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +423 -0
  206. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +685 -0
  207. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +0 -12
  208. package/vendor/abseil-cpp/absl/strings/internal/str_format/checker.h +2 -4
  209. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +21 -7
  210. package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +495 -8
  211. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +18 -15
  212. package/vendor/abseil-cpp/absl/strings/numbers.cc +71 -8
  213. package/vendor/abseil-cpp/absl/strings/numbers.h +25 -12
  214. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +70 -0
  215. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +194 -0
  216. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite_test.cc +154 -0
  217. package/vendor/abseil-cpp/absl/strings/str_cat.cc +96 -91
  218. package/vendor/abseil-cpp/absl/strings/str_cat.h +17 -12
  219. package/vendor/abseil-cpp/absl/strings/str_format_test.cc +4 -4
  220. package/vendor/abseil-cpp/absl/strings/str_split.h +1 -1
  221. package/vendor/abseil-cpp/absl/strings/str_split_test.cc +1 -1
  222. package/vendor/abseil-cpp/absl/strings/string_view.h +8 -718
  223. package/vendor/abseil-cpp/absl/strings/string_view_test.cc +1 -1265
  224. package/vendor/abseil-cpp/absl/strings/substitute.cc +24 -24
  225. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +2 -3
  226. package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +1 -0
  227. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -2
  228. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc +15 -5
  229. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +2 -1
  230. package/vendor/abseil-cpp/absl/synchronization/mutex.h +47 -23
  231. package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
  232. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +2 -0
  233. package/vendor/abseil-cpp/absl/time/civil_time_benchmark.cc +1 -2
  234. package/vendor/abseil-cpp/absl/time/civil_time_test.cc +58 -103
  235. package/vendor/abseil-cpp/absl/time/clock.cc +18 -16
  236. package/vendor/abseil-cpp/absl/time/clock_test.cc +2 -2
  237. package/vendor/abseil-cpp/absl/time/duration_benchmark.cc +144 -0
  238. package/vendor/abseil-cpp/absl/time/duration_test.cc +26 -29
  239. package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +7 -1
  240. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +4 -2
  241. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +6 -103
  242. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +186 -0
  243. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
  244. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  245. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada +0 -0
  246. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel +0 -0
  247. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana +0 -0
  248. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte +0 -0
  249. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/iso3166.tab +9 -9
  250. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +12 -12
  251. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +47 -47
  252. package/vendor/abseil-cpp/absl/time/time.cc +4 -4
  253. package/vendor/abseil-cpp/absl/time/time.h +10 -10
  254. package/vendor/abseil-cpp/absl/time/time_test.cc +1 -0
  255. package/vendor/abseil-cpp/absl/types/compare.h +62 -61
  256. package/vendor/abseil-cpp/absl/types/compare_test.cc +3 -3
  257. package/vendor/abseil-cpp/absl/types/internal/span.h +1 -0
  258. package/vendor/abseil-cpp/absl/types/optional.h +2 -2
  259. package/vendor/abseil-cpp/absl/types/span.h +10 -2
  260. package/vendor/abseil-cpp/absl/utility/utility.h +13 -0
  261. package/vendor/abseil-cpp/ci/absl_alternate_options.h +0 -1
  262. package/vendor/abseil-cpp/ci/cmake_common.sh +1 -1
  263. package/vendor/abseil-cpp/ci/cmake_install_test.sh +6 -0
  264. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +1 -0
  265. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +2 -0
  266. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +1 -0
  267. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +1 -0
  268. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +1 -0
  269. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +1 -0
  270. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +1 -0
  271. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +6 -0
  272. package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +6 -0
  273. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +3 -2
  274. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +5 -0
  275. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -0
  276. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -0
  277. package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +6 -1
  278. package/vendor/abseil-cpp/absl/base/internal/identity.h +0 -39
  279. package/vendor/abseil-cpp/absl/strings/string_view.cc +0 -257
  280. 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
- [[maybe_unused]] uint64_t LowLevelHashLenGt32(const void* data, size_t len,
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
- if (len > 64) {
54
- // If we have more than 64 bytes, we're going to handle chunks of 64
55
- // bytes at a time. We're going to build up four separate hash states
56
- // which we will then hash together. This avoids short dependency chains.
57
- uint64_t duplicated_state0 = current_state;
58
- uint64_t duplicated_state1 = current_state;
59
- uint64_t duplicated_state2 = current_state;
60
-
61
- do {
62
- // Always prefetch the next cacheline.
63
- PrefetchToLocalCache(ptr + ABSL_CACHELINE_SIZE);
64
-
65
- uint64_t a = absl::base_internal::UnalignedLoad64(ptr);
66
- uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8);
67
- uint64_t c = absl::base_internal::UnalignedLoad64(ptr + 16);
68
- uint64_t d = absl::base_internal::UnalignedLoad64(ptr + 24);
69
- uint64_t e = absl::base_internal::UnalignedLoad64(ptr + 32);
70
- uint64_t f = absl::base_internal::UnalignedLoad64(ptr + 40);
71
- uint64_t g = absl::base_internal::UnalignedLoad64(ptr + 48);
72
- uint64_t h = absl::base_internal::UnalignedLoad64(ptr + 56);
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, uint64_t state) {
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, uint64_t state) {
241
+ SplitAndCombineOn32Bit(uint64_t state, const unsigned char* first, size_t len) {
111
242
  while (len >= PiecewiseChunkSize()) {
112
- state = HashBlockOn32Bit(first, PiecewiseChunkSize(), state);
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, uint64_t state) {
258
+ uint64_t state, const unsigned char* data, size_t len) {
128
259
  #ifdef ABSL_HAVE_INTRINSIC_INT128
129
- return LowLevelHashLenGt32(data, len, state);
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, uint64_t state) {
268
+ SplitAndCombineOn64Bit(uint64_t state, const unsigned char* first, size_t len) {
138
269
  while (len >= PiecewiseChunkSize()) {
139
- state = HashBlockOn64Bit(first, PiecewiseChunkSize(), state);
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(const unsigned char* first,
156
- size_t len,
157
- uint64_t state) {
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, state);
292
+ return HashBlockOn32Bit(state, first, len);
162
293
  }
163
- return SplitAndCombineOn32Bit(first, len, state);
294
+ return SplitAndCombineOn32Bit(state, first, len);
164
295
  }
165
296
 
166
- uint64_t CombineLargeContiguousImplOn64BitLengthGt32(const unsigned char* first,
167
- size_t len,
168
- uint64_t state) {
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, state);
303
+ return HashBlockOn64Bit(state, first, len);
173
304
  }
174
- return SplitAndCombineOn64Bit(first, len, state);
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(const unsigned char* first,
1034
- size_t len, uint64_t state);
1035
- uint64_t CombineLargeContiguousImplOn64BitLengthGt32(const unsigned char* first,
1036
- size_t len,
1037
- uint64_t state);
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, state);
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, state);
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
- GTEST_SKIP()
365
- << "We only maintain golden data for little endian 64 bit systems with "
366
- "128 bit intristics.";
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(), state);
445
+ state, reinterpret_cast<const unsigned char*>(s.data()), s.size());
407
446
  };
408
447
 
409
448
  #if UPDATE_GOLDEN
@@ -80,6 +80,8 @@ cc_library(
80
80
  ":log",
81
81
  "//absl/base:config",
82
82
  "//absl/base:core_headers",
83
+ "//absl/base:nullability",
84
+ "//absl/base:nullability_traits_internal",
83
85
  "//absl/strings",
84
86
  ],
85
87
  )
@@ -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
+ )