re2 1.22.2 → 1.23.0

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 (495) hide show
  1. package/README.md +60 -4
  2. package/binding.gyp +5 -1
  3. package/lib/addon.cc +4 -0
  4. package/lib/new.cc +1 -246
  5. package/lib/pattern.cc +252 -0
  6. package/lib/pattern.h +10 -0
  7. package/lib/set.cc +777 -0
  8. package/lib/wrapped_re2_set.h +42 -0
  9. package/package.json +21 -9
  10. package/re2.d.ts +46 -9
  11. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +14 -24
  12. package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +3 -3
  13. package/vendor/abseil-cpp/CMake/README.md +2 -2
  14. package/vendor/abseil-cpp/CMakeLists.txt +3 -3
  15. package/vendor/abseil-cpp/MODULE.bazel +6 -9
  16. package/vendor/abseil-cpp/README.md +6 -8
  17. package/vendor/abseil-cpp/absl/abseil.podspec.gen.py +6 -4
  18. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +3 -0
  19. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +1 -0
  20. package/vendor/abseil-cpp/absl/algorithm/container.h +2 -19
  21. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +4 -11
  22. package/vendor/abseil-cpp/absl/base/BUILD.bazel +60 -45
  23. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +57 -38
  24. package/vendor/abseil-cpp/absl/base/attributes.h +76 -7
  25. package/vendor/abseil-cpp/absl/base/attributes_test.cc +43 -0
  26. package/vendor/abseil-cpp/absl/base/call_once.h +11 -12
  27. package/vendor/abseil-cpp/absl/base/config.h +22 -129
  28. package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +0 -4
  29. package/vendor/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  30. package/vendor/abseil-cpp/absl/base/{internal/fast_type_id_test.cc → fast_type_id_test.cc} +34 -30
  31. package/vendor/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  32. package/vendor/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  33. package/vendor/abseil-cpp/absl/base/internal/endian.h +34 -38
  34. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  35. package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test.cc +85 -0
  36. package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test_helper.h +97 -0
  37. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -9
  38. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
  39. package/vendor/abseil-cpp/absl/base/internal/poison.cc +7 -6
  40. package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +15 -28
  41. package/vendor/abseil-cpp/absl/base/internal/spinlock.h +65 -35
  42. package/vendor/abseil-cpp/absl/base/internal/spinlock_benchmark.cc +2 -2
  43. package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +2 -2
  44. package/vendor/abseil-cpp/absl/base/internal/thread_identity_benchmark.cc +1 -1
  45. package/vendor/abseil-cpp/absl/base/internal/thread_identity_test.cc +4 -4
  46. package/vendor/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  47. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +4 -0
  48. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  49. package/vendor/abseil-cpp/absl/base/no_destructor.h +11 -32
  50. package/vendor/abseil-cpp/absl/base/no_destructor_test.cc +0 -4
  51. package/vendor/abseil-cpp/absl/base/nullability.h +83 -72
  52. package/vendor/abseil-cpp/absl/base/nullability_test.cc +25 -64
  53. package/vendor/abseil-cpp/absl/base/options.h +3 -80
  54. package/vendor/abseil-cpp/absl/base/policy_checks.h +7 -7
  55. package/vendor/abseil-cpp/absl/base/raw_logging_test.cc +15 -0
  56. package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +50 -30
  57. package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -1
  58. package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +0 -1
  59. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  60. package/vendor/abseil-cpp/absl/cleanup/cleanup_test.cc +0 -2
  61. package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  62. package/vendor/abseil-cpp/absl/container/BUILD.bazel +74 -1
  63. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +73 -0
  64. package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +51 -9
  65. package/vendor/abseil-cpp/absl/container/btree_map.h +8 -6
  66. package/vendor/abseil-cpp/absl/container/btree_set.h +8 -6
  67. package/vendor/abseil-cpp/absl/container/btree_test.cc +89 -4
  68. package/vendor/abseil-cpp/absl/container/fixed_array.h +7 -15
  69. package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +17 -0
  70. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +20 -15
  71. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +8 -14
  72. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +19 -14
  73. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +46 -0
  74. package/vendor/abseil-cpp/absl/container/inlined_vector.h +7 -6
  75. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +28 -0
  76. package/vendor/abseil-cpp/absl/container/internal/btree.h +132 -29
  77. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  78. package/vendor/abseil-cpp/absl/container/internal/common.h +43 -0
  79. package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  80. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +28 -24
  81. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +4 -17
  82. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +80 -17
  83. package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +32 -2
  84. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +13 -8
  85. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults_test.cc +1 -52
  86. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +9 -31
  87. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +23 -32
  88. package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +5 -1
  89. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +11 -23
  90. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits_test.cc +14 -9
  91. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +516 -0
  92. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes_test.cc +259 -0
  93. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +23 -6
  94. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +32 -13
  95. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +8 -8
  96. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  97. package/vendor/abseil-cpp/absl/container/internal/layout.h +26 -42
  98. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  99. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +1506 -213
  100. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +1095 -1658
  101. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +3 -2
  102. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +31 -29
  103. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +51 -20
  104. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +79 -0
  105. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl_test.cc +66 -0
  106. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +707 -363
  107. package/vendor/abseil-cpp/absl/container/node_hash_map.h +20 -15
  108. package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +0 -3
  109. package/vendor/abseil-cpp/absl/container/node_hash_set.h +18 -13
  110. package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +3 -8
  111. package/vendor/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake +1 -1
  112. package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +9 -20
  113. package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +9 -20
  114. package/vendor/abseil-cpp/absl/copts/copts.py +24 -15
  115. package/vendor/abseil-cpp/absl/crc/BUILD.bazel +3 -0
  116. package/vendor/abseil-cpp/absl/crc/crc32c.cc +0 -4
  117. package/vendor/abseil-cpp/absl/crc/crc32c.h +7 -5
  118. package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +17 -4
  119. package/vendor/abseil-cpp/absl/crc/crc32c_test.cc +30 -0
  120. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +17 -0
  121. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
  122. package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  123. package/vendor/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
  124. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +136 -165
  125. package/vendor/abseil-cpp/absl/crc/internal/gen_crc32c_consts.py +90 -0
  126. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +7 -0
  127. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +4 -0
  128. package/vendor/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  129. package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  130. package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  131. package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  132. package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  133. package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +11 -10
  134. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  135. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  136. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
  137. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  138. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  139. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  140. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  141. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  142. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  143. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -14
  144. package/vendor/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
  145. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +161 -27
  146. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  147. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +435 -1
  148. package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +55 -63
  149. package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  150. package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  151. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -0
  152. package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +3 -0
  153. package/vendor/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  154. package/vendor/abseil-cpp/absl/flags/flag.h +4 -3
  155. package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  156. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +14 -13
  157. package/vendor/abseil-cpp/absl/flags/internal/flag.h +34 -34
  158. package/vendor/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
  159. package/vendor/abseil-cpp/absl/flags/internal/registry.h +4 -3
  160. package/vendor/abseil-cpp/absl/flags/internal/usage.cc +2 -2
  161. package/vendor/abseil-cpp/absl/flags/parse.cc +10 -6
  162. package/vendor/abseil-cpp/absl/flags/reflection.cc +9 -7
  163. package/vendor/abseil-cpp/absl/flags/usage.cc +2 -2
  164. package/vendor/abseil-cpp/absl/flags/usage_config.cc +2 -2
  165. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +7 -6
  166. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +2 -4
  167. package/vendor/abseil-cpp/absl/functional/any_invocable.h +15 -15
  168. package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +10 -42
  169. package/vendor/abseil-cpp/absl/functional/function_ref.h +2 -9
  170. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +10 -0
  171. package/vendor/abseil-cpp/absl/functional/function_type_benchmark.cc +1 -1
  172. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +112 -227
  173. package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  174. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  175. package/vendor/abseil-cpp/absl/functional/overload.h +0 -20
  176. package/vendor/abseil-cpp/absl/functional/overload_test.cc +1 -7
  177. package/vendor/abseil-cpp/absl/hash/BUILD.bazel +16 -9
  178. package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +6 -9
  179. package/vendor/abseil-cpp/absl/hash/hash.h +18 -0
  180. package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +3 -0
  181. package/vendor/abseil-cpp/absl/hash/hash_instantiated_test.cc +1 -1
  182. package/vendor/abseil-cpp/absl/hash/hash_test.cc +131 -30
  183. package/vendor/abseil-cpp/absl/hash/hash_testing.h +20 -20
  184. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +129 -17
  185. package/vendor/abseil-cpp/absl/hash/internal/hash.h +326 -362
  186. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +54 -151
  187. package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +14 -2
  188. package/vendor/abseil-cpp/absl/{strings/cord_buffer.cc → hash/internal/weakly_mixed_integer.h} +14 -6
  189. package/vendor/abseil-cpp/absl/log/BUILD.bazel +4 -0
  190. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +7 -0
  191. package/vendor/abseil-cpp/absl/log/check.h +2 -1
  192. package/vendor/abseil-cpp/absl/log/check_test_impl.inc +308 -14
  193. package/vendor/abseil-cpp/absl/log/die_if_null.h +2 -2
  194. package/vendor/abseil-cpp/absl/log/flags_test.cc +7 -0
  195. package/vendor/abseil-cpp/absl/log/globals.h +4 -5
  196. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +13 -9
  197. package/vendor/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  198. package/vendor/abseil-cpp/absl/log/internal/check_op.cc +24 -22
  199. package/vendor/abseil-cpp/absl/log/internal/check_op.h +149 -94
  200. package/vendor/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  201. package/vendor/abseil-cpp/absl/log/internal/conditions.h +7 -2
  202. package/vendor/abseil-cpp/absl/log/internal/fnmatch_test.cc +1 -0
  203. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  204. package/vendor/abseil-cpp/absl/log/internal/log_message.h +84 -59
  205. package/vendor/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
  206. package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  207. package/vendor/abseil-cpp/absl/log/internal/proto.cc +3 -2
  208. package/vendor/abseil-cpp/absl/log/internal/proto.h +3 -3
  209. package/vendor/abseil-cpp/absl/log/internal/strip.h +4 -12
  210. package/vendor/abseil-cpp/absl/log/internal/structured.h +3 -7
  211. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +9 -9
  212. package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  213. package/vendor/abseil-cpp/absl/log/internal/voidify.h +10 -4
  214. package/vendor/abseil-cpp/absl/log/log.h +48 -35
  215. package/vendor/abseil-cpp/absl/log/log_basic_test_impl.inc +45 -0
  216. package/vendor/abseil-cpp/absl/log/log_entry.cc +241 -19
  217. package/vendor/abseil-cpp/absl/log/log_entry.h +2 -0
  218. package/vendor/abseil-cpp/absl/log/log_format_test.cc +412 -6
  219. package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +20 -0
  220. package/vendor/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  221. package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +15 -2
  222. package/vendor/abseil-cpp/absl/log/scoped_mock_log.h +7 -1
  223. package/vendor/abseil-cpp/absl/log/structured_test.cc +1 -0
  224. package/vendor/abseil-cpp/absl/memory/BUILD.bazel +2 -0
  225. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
  226. package/vendor/abseil-cpp/absl/meta/type_traits.h +46 -175
  227. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +1 -478
  228. package/vendor/abseil-cpp/absl/numeric/BUILD.bazel +7 -3
  229. package/vendor/abseil-cpp/absl/numeric/CMakeLists.txt +2 -0
  230. package/vendor/abseil-cpp/absl/numeric/bits.h +68 -2
  231. package/vendor/abseil-cpp/absl/numeric/bits_benchmark.cc +1 -1
  232. package/vendor/abseil-cpp/absl/numeric/bits_test.cc +83 -0
  233. package/vendor/abseil-cpp/absl/numeric/int128.cc +0 -52
  234. package/vendor/abseil-cpp/absl/numeric/int128_benchmark.cc +14 -15
  235. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +13 -8
  236. package/vendor/abseil-cpp/absl/numeric/internal/bits.h +39 -7
  237. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +47 -0
  238. package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +38 -0
  239. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +124 -0
  240. package/vendor/abseil-cpp/absl/profiling/hashtable.h +40 -0
  241. package/vendor/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  242. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +462 -0
  243. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +138 -0
  244. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
  245. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +7 -3
  246. package/vendor/abseil-cpp/absl/random/BUILD.bazel +6 -4
  247. package/vendor/abseil-cpp/absl/random/CMakeLists.txt +20 -19
  248. package/vendor/abseil-cpp/absl/random/benchmarks.cc +16 -23
  249. package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  250. package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +7 -2
  251. package/vendor/abseil-cpp/absl/random/distributions.h +6 -8
  252. package/vendor/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  253. package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +19 -20
  254. package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  255. package/vendor/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +24 -92
  256. package/vendor/abseil-cpp/absl/{base/inline_variable_test_b.cc → random/internal/entropy_pool.h} +14 -6
  257. package/vendor/abseil-cpp/absl/random/internal/entropy_pool_test.cc +119 -0
  258. package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +6 -7
  259. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  260. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +39 -0
  261. package/vendor/abseil-cpp/absl/random/internal/randen_benchmarks.cc +8 -6
  262. package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  263. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  264. package/vendor/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  265. package/vendor/abseil-cpp/absl/random/internal/seed_material_test.cc +3 -0
  266. package/vendor/abseil-cpp/absl/random/mock_distributions_test.cc +5 -4
  267. package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +8 -10
  268. package/vendor/abseil-cpp/absl/random/random.h +88 -53
  269. package/vendor/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  270. package/vendor/abseil-cpp/absl/status/BUILD.bazel +26 -0
  271. package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  272. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  273. package/vendor/abseil-cpp/absl/status/internal/status_matchers.cc +4 -3
  274. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +194 -32
  275. package/vendor/abseil-cpp/absl/status/status.cc +4 -8
  276. package/vendor/abseil-cpp/absl/status/status.h +8 -8
  277. package/vendor/abseil-cpp/absl/{base/inline_variable_test_a.cc → status/status_benchmark.cc} +20 -10
  278. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +65 -0
  279. package/vendor/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  280. package/vendor/abseil-cpp/absl/status/statusor.cc +2 -2
  281. package/vendor/abseil-cpp/absl/status/statusor.h +49 -102
  282. package/vendor/abseil-cpp/absl/status/statusor_benchmark.cc +480 -0
  283. package/vendor/abseil-cpp/absl/status/statusor_test.cc +323 -1
  284. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +70 -34
  285. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +6 -3
  286. package/vendor/abseil-cpp/absl/strings/ascii.cc +9 -9
  287. package/vendor/abseil-cpp/absl/strings/ascii.h +18 -18
  288. package/vendor/abseil-cpp/absl/strings/ascii_benchmark.cc +5 -8
  289. package/vendor/abseil-cpp/absl/strings/charconv.cc +21 -22
  290. package/vendor/abseil-cpp/absl/strings/charconv.h +5 -5
  291. package/vendor/abseil-cpp/absl/strings/charconv_benchmark.cc +1 -2
  292. package/vendor/abseil-cpp/absl/strings/charset_benchmark.cc +1 -1
  293. package/vendor/abseil-cpp/absl/strings/cord.cc +54 -58
  294. package/vendor/abseil-cpp/absl/strings/cord.h +94 -84
  295. package/vendor/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  296. package/vendor/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  297. package/vendor/abseil-cpp/absl/strings/cord_test.cc +23 -0
  298. package/vendor/abseil-cpp/absl/strings/cordz_test_helpers.h +4 -5
  299. package/vendor/abseil-cpp/absl/strings/escaping.cc +130 -149
  300. package/vendor/abseil-cpp/absl/strings/escaping.h +9 -10
  301. package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +2 -3
  302. package/vendor/abseil-cpp/absl/strings/escaping_test.cc +19 -9
  303. package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  304. package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint_test.cc +1 -1
  305. package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +6 -10
  306. package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  307. package/vendor/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
  308. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +5 -9
  309. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +2 -4
  310. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance_benchmark.cc +56 -0
  311. package/vendor/abseil-cpp/absl/strings/internal/memutil_benchmark.cc +2 -3
  312. package/vendor/abseil-cpp/absl/strings/internal/ostringstream_benchmark.cc +1 -2
  313. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  314. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  315. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +1 -6
  316. package/vendor/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  317. package/vendor/abseil-cpp/absl/strings/internal/str_format/extension_test.cc +3 -2
  318. package/vendor/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  319. package/vendor/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  320. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  321. package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +7 -2
  322. package/vendor/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  323. package/vendor/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  324. package/vendor/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  325. package/vendor/abseil-cpp/absl/strings/internal/utf8_test.cc +196 -3
  326. package/vendor/abseil-cpp/absl/strings/numbers.cc +53 -32
  327. package/vendor/abseil-cpp/absl/strings/numbers.h +87 -58
  328. package/vendor/abseil-cpp/absl/strings/numbers_benchmark.cc +1 -1
  329. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +634 -120
  330. package/vendor/abseil-cpp/absl/strings/str_cat.cc +6 -7
  331. package/vendor/abseil-cpp/absl/strings/str_cat.h +32 -32
  332. package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +25 -1
  333. package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +2 -7
  334. package/vendor/abseil-cpp/absl/strings/str_format.h +18 -18
  335. package/vendor/abseil-cpp/absl/strings/str_format_test.cc +8 -14
  336. package/vendor/abseil-cpp/absl/strings/str_join_benchmark.cc +2 -3
  337. package/vendor/abseil-cpp/absl/strings/str_replace.cc +3 -3
  338. package/vendor/abseil-cpp/absl/strings/str_replace.h +6 -6
  339. package/vendor/abseil-cpp/absl/strings/str_replace_benchmark.cc +2 -3
  340. package/vendor/abseil-cpp/absl/strings/str_split.h +2 -2
  341. package/vendor/abseil-cpp/absl/strings/str_split_benchmark.cc +2 -3
  342. package/vendor/abseil-cpp/absl/strings/string_view.cc +4 -9
  343. package/vendor/abseil-cpp/absl/strings/string_view.h +38 -39
  344. package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +4 -6
  345. package/vendor/abseil-cpp/absl/strings/string_view_test.cc +2 -50
  346. package/vendor/abseil-cpp/absl/strings/strip.h +4 -4
  347. package/vendor/abseil-cpp/absl/strings/substitute.cc +5 -4
  348. package/vendor/abseil-cpp/absl/strings/substitute.h +66 -64
  349. package/vendor/abseil-cpp/absl/strings/substitute_benchmark.cc +158 -0
  350. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +6 -1
  351. package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +2 -1
  352. package/vendor/abseil-cpp/absl/synchronization/barrier.cc +1 -1
  353. package/vendor/abseil-cpp/absl/synchronization/barrier_test.cc +3 -3
  354. package/vendor/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
  355. package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  356. package/vendor/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  357. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
  358. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_benchmark.cc +2 -3
  359. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_test.cc +6 -5
  360. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  361. package/vendor/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  362. package/vendor/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  363. package/vendor/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  364. package/vendor/abseil-cpp/absl/synchronization/internal/thread_pool.h +3 -3
  365. package/vendor/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  366. package/vendor/abseil-cpp/absl/synchronization/internal/waiter_test.cc +12 -3
  367. package/vendor/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  368. package/vendor/abseil-cpp/absl/synchronization/lifetime_test.cc +4 -4
  369. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +27 -29
  370. package/vendor/abseil-cpp/absl/synchronization/mutex.h +205 -126
  371. package/vendor/abseil-cpp/absl/synchronization/mutex_benchmark.cc +13 -31
  372. package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +183 -169
  373. package/vendor/abseil-cpp/absl/synchronization/notification.cc +5 -5
  374. package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
  375. package/vendor/abseil-cpp/absl/synchronization/notification_test.cc +3 -3
  376. package/vendor/abseil-cpp/absl/time/BUILD.bazel +9 -1
  377. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +3 -1
  378. package/vendor/abseil-cpp/absl/time/civil_time.cc +1 -0
  379. package/vendor/abseil-cpp/absl/time/civil_time_test.cc +134 -0
  380. package/vendor/abseil-cpp/absl/time/clock.cc +11 -14
  381. package/vendor/abseil-cpp/absl/time/duration.cc +14 -9
  382. package/vendor/abseil-cpp/absl/time/duration_test.cc +6 -7
  383. package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +14 -3
  384. package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
  385. package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  386. package/vendor/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc +4 -490
  387. package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc +515 -0
  388. package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h +33 -0
  389. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +41 -4
  390. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +22 -23
  391. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  392. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc +1 -488
  393. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  394. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coyhaique +0 -0
  395. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran +0 -0
  396. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Iran +0 -0
  397. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +2 -1
  398. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +1 -1
  399. package/vendor/abseil-cpp/absl/time/time.h +24 -18
  400. package/vendor/abseil-cpp/absl/time/time_test.cc +26 -0
  401. package/vendor/abseil-cpp/absl/types/BUILD.bazel +11 -164
  402. package/vendor/abseil-cpp/absl/types/CMakeLists.txt +23 -167
  403. package/vendor/abseil-cpp/absl/types/any.h +9 -484
  404. package/vendor/abseil-cpp/absl/types/optional.h +7 -747
  405. package/vendor/abseil-cpp/absl/types/span.h +46 -19
  406. package/vendor/abseil-cpp/absl/types/span_test.cc +27 -0
  407. package/vendor/abseil-cpp/absl/types/variant.h +5 -784
  408. package/vendor/abseil-cpp/absl/types/variant_test.cc +43 -2597
  409. package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -41
  410. package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +0 -40
  411. package/vendor/abseil-cpp/absl/utility/utility.h +10 -185
  412. package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -3
  413. package/vendor/abseil-cpp/ci/cmake_common.sh +2 -2
  414. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +12 -13
  415. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +24 -21
  416. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +12 -12
  417. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +23 -22
  418. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +20 -19
  419. package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
  420. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +17 -17
  421. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +10 -10
  422. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +1 -1
  423. package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +1 -1
  424. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +9 -10
  425. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +9 -1
  426. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +14 -6
  427. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +14 -6
  428. package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +1 -1
  429. package/vendor/re2/.bazelrc +4 -4
  430. package/vendor/re2/.bcr/metadata.template.json +16 -0
  431. package/vendor/re2/.bcr/presubmit.yml +57 -0
  432. package/vendor/re2/.bcr/source.template.json +5 -0
  433. package/vendor/re2/.github/bazel.sh +1 -7
  434. package/vendor/re2/.github/workflows/ci-bazel.yml +5 -5
  435. package/vendor/re2/.github/workflows/ci-cmake.yml +4 -4
  436. package/vendor/re2/.github/workflows/ci.yml +5 -6
  437. package/vendor/re2/.github/workflows/pages.yml +3 -3
  438. package/vendor/re2/.github/workflows/python.yml +29 -24
  439. package/vendor/re2/.github/workflows/release-bazel.yml +42 -0
  440. package/vendor/re2/.github/workflows/release.yml +15 -4
  441. package/vendor/re2/BUILD.bazel +25 -0
  442. package/vendor/re2/CMakeLists.txt +100 -85
  443. package/vendor/re2/CONTRIBUTING.md +0 -1
  444. package/vendor/re2/MODULE.bazel +10 -10
  445. package/vendor/re2/Makefile +1 -1
  446. package/vendor/re2/README.md +259 -0
  447. package/vendor/re2/python/BUILD.bazel +8 -0
  448. package/vendor/re2/python/re2.py +1 -1
  449. package/vendor/re2/python/re2_test.py +6 -0
  450. package/vendor/re2/python/setup.py +3 -3
  451. package/vendor/re2/re2/bitmap256.cc +3 -4
  452. package/vendor/re2/re2/bitstate.cc +15 -10
  453. package/vendor/re2/re2/dfa.cc +1 -2
  454. package/vendor/re2/re2/parse.cc +3 -4
  455. package/vendor/re2/re2/prog.cc +1 -2
  456. package/vendor/re2/re2/prog.h +1 -0
  457. package/vendor/re2/re2/re2.cc +5 -0
  458. package/vendor/re2/re2/re2.h +9 -9
  459. package/vendor/re2/re2/set.cc +6 -0
  460. package/vendor/re2/re2/set.h +5 -0
  461. package/vendor/re2/re2/testing/re2_arg_test.cc +3 -3
  462. package/vendor/re2/re2/testing/re2_test.cc +8 -0
  463. package/vendor/re2/re2/testing/set_test.cc +5 -0
  464. package/vendor/re2/re2/walker-inl.h +1 -1
  465. package/vendor/abseil-cpp/WORKSPACE +0 -76
  466. package/vendor/abseil-cpp/WORKSPACE.bzlmod +0 -19
  467. package/vendor/abseil-cpp/absl/base/inline_variable_test.cc +0 -64
  468. package/vendor/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  469. package/vendor/abseil-cpp/absl/base/internal/inline_variable_testing.h +0 -46
  470. package/vendor/abseil-cpp/absl/base/internal/invoke.h +0 -241
  471. package/vendor/abseil-cpp/absl/base/internal/nullability_impl.h +0 -69
  472. package/vendor/abseil-cpp/absl/base/invoke_test.cc +0 -331
  473. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -148
  474. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -54
  475. package/vendor/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  476. package/vendor/abseil-cpp/absl/random/internal/pool_urbg_test.cc +0 -182
  477. package/vendor/abseil-cpp/absl/types/any_exception_safety_test.cc +0 -173
  478. package/vendor/abseil-cpp/absl/types/any_test.cc +0 -778
  479. package/vendor/abseil-cpp/absl/types/bad_any_cast.cc +0 -64
  480. package/vendor/abseil-cpp/absl/types/bad_any_cast.h +0 -75
  481. package/vendor/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  482. package/vendor/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  483. package/vendor/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  484. package/vendor/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  485. package/vendor/abseil-cpp/absl/types/internal/optional.h +0 -352
  486. package/vendor/abseil-cpp/absl/types/internal/variant.h +0 -1622
  487. package/vendor/abseil-cpp/absl/types/optional_exception_safety_test.cc +0 -292
  488. package/vendor/abseil-cpp/absl/types/optional_test.cc +0 -1615
  489. package/vendor/abseil-cpp/absl/types/variant_benchmark.cc +0 -222
  490. package/vendor/abseil-cpp/absl/types/variant_exception_safety_test.cc +0 -532
  491. package/vendor/abseil-cpp/absl/utility/internal/if_constexpr.h +0 -70
  492. package/vendor/abseil-cpp/absl/utility/internal/if_constexpr_test.cc +0 -79
  493. package/vendor/abseil-cpp/absl/utility/utility_test.cc +0 -239
  494. package/vendor/re2/.github/workflows/pr.yml +0 -34
  495. package/vendor/re2/README +0 -47
@@ -42,6 +42,7 @@ absl_cc_library(
42
42
  absl::config
43
43
  absl::core_headers
44
44
  absl::dynamic_annotations
45
+ absl::malloc_internal
45
46
  absl::raw_logging_internal
46
47
  PUBLIC
47
48
  )
@@ -55,7 +56,9 @@ absl_cc_test(
55
56
  ${ABSL_TEST_COPTS}
56
57
  DEPS
57
58
  absl::stacktrace
59
+ absl::config
58
60
  absl::core_headers
61
+ absl::span
59
62
  GTest::gmock_main
60
63
  )
61
64
 
@@ -174,6 +177,7 @@ absl_cc_library(
174
177
  debugging_internal
175
178
  HDRS
176
179
  "internal/address_is_readable.h"
180
+ "internal/addresses.h"
177
181
  "internal/elf_mem_image.h"
178
182
  "internal/vdso_support.h"
179
183
  SRCS
@@ -0,0 +1,57 @@
1
+ // Copyright 2025 The Abseil Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef ABSL_DEBUGGING_INTERNAL_ADDRESSES_H_
16
+ #define ABSL_DEBUGGING_INTERNAL_ADDRESSES_H_
17
+
18
+ #include <stdint.h>
19
+
20
+ #include "absl/base/config.h"
21
+
22
+ namespace absl {
23
+ ABSL_NAMESPACE_BEGIN
24
+ namespace debugging_internal {
25
+
26
+ // Removes any metadata (tag bits) from the given pointer, converting it into a
27
+ // user-readable address.
28
+ inline uintptr_t StripPointerMetadata(uintptr_t ptr) {
29
+ #if defined(__aarch64__)
30
+ // When PAC-RET (-mbranch-protection=pac-ret) is enabled, return addresses
31
+ // stored on the stack will be signed, which means that pointer bits outside
32
+ // of the virtual address range are potentially set. Since the stacktrace code
33
+ // is expected to return normal code pointers, this function clears those
34
+ // bits.
35
+ register uintptr_t x30 __asm__("x30") = ptr;
36
+ // The normal instruction for clearing PAC bits is XPACI, but for
37
+ // compatibility with ARM platforms that do not support pointer
38
+ // authentication, we use the hint space instruction XPACLRI instead. Hint
39
+ // space instructions behave as NOPs on unsupported platforms.
40
+ #define ABSL_XPACLRI_HINT "hint #0x7;"
41
+ asm(ABSL_XPACLRI_HINT : "+r"(x30)); // asm("xpaclri" : "+r"(x30));
42
+ #undef ABSL_XPACLRI_HINT
43
+ return x30;
44
+ #else
45
+ return ptr;
46
+ #endif
47
+ }
48
+
49
+ inline uintptr_t StripPointerMetadata(void* ptr) {
50
+ return StripPointerMetadata(reinterpret_cast<uintptr_t>(ptr));
51
+ }
52
+
53
+ } // namespace debugging_internal
54
+ ABSL_NAMESPACE_END
55
+ } // namespace absl
56
+
57
+ #endif // ABSL_DEBUGGING_INTERNAL_ADDRESSES_H_
@@ -172,7 +172,7 @@ bool ScanNextDelta(const char*& punycode_begin, const char* const punycode_end,
172
172
 
173
173
  } // namespace
174
174
 
175
- absl::Nullable<char*> DecodeRustPunycode(DecodeRustPunycodeOptions options) {
175
+ char* absl_nullable DecodeRustPunycode(DecodeRustPunycodeOptions options) {
176
176
  const char* punycode_begin = options.punycode_begin;
177
177
  const char* const punycode_end = options.punycode_end;
178
178
  char* const out_begin = options.out_begin;
@@ -23,10 +23,10 @@ ABSL_NAMESPACE_BEGIN
23
23
  namespace debugging_internal {
24
24
 
25
25
  struct DecodeRustPunycodeOptions {
26
- const char* punycode_begin;
27
- const char* punycode_end;
28
- char* out_begin;
29
- char* out_end;
26
+ const char* absl_nonnull punycode_begin;
27
+ const char* absl_nonnull punycode_end;
28
+ char* absl_nonnull out_begin;
29
+ char* absl_nonnull out_end;
30
30
  };
31
31
 
32
32
  // Given Rust Punycode in `punycode_begin .. punycode_end`, writes the
@@ -46,7 +46,7 @@ struct DecodeRustPunycodeOptions {
46
46
  // DecodeRustPunycode is async-signal-safe with bounded runtime and a small
47
47
  // stack footprint, making it suitable for use in demangling Rust symbol names
48
48
  // from a signal handler.
49
- absl::Nullable<char*> DecodeRustPunycode(DecodeRustPunycodeOptions options);
49
+ char* absl_nullable DecodeRustPunycode(DecodeRustPunycodeOptions options);
50
50
 
51
51
  } // namespace debugging_internal
52
52
  ABSL_NAMESPACE_END
@@ -484,36 +484,6 @@ static bool IsAlpha(char c) {
484
484
 
485
485
  static bool IsDigit(char c) { return c >= '0' && c <= '9'; }
486
486
 
487
- // Returns true if "str" is a function clone suffix. These suffixes are used
488
- // by GCC 4.5.x and later versions (and our locally-modified version of GCC
489
- // 4.4.x) to indicate functions which have been cloned during optimization.
490
- // We treat any sequence (.<alpha>+.<digit>+)+ as a function clone suffix.
491
- // Additionally, '_' is allowed along with the alphanumeric sequence.
492
- static bool IsFunctionCloneSuffix(const char *str) {
493
- size_t i = 0;
494
- while (str[i] != '\0') {
495
- bool parsed = false;
496
- // Consume a single [.<alpha> | _]*[.<digit>]* sequence.
497
- if (str[i] == '.' && (IsAlpha(str[i + 1]) || str[i + 1] == '_')) {
498
- parsed = true;
499
- i += 2;
500
- while (IsAlpha(str[i]) || str[i] == '_') {
501
- ++i;
502
- }
503
- }
504
- if (str[i] == '.' && IsDigit(str[i + 1])) {
505
- parsed = true;
506
- i += 2;
507
- while (IsDigit(str[i])) {
508
- ++i;
509
- }
510
- }
511
- if (!parsed)
512
- return false;
513
- }
514
- return true; // Consumed everything in "str".
515
- }
516
-
517
487
  static bool EndsWith(State *state, const char chr) {
518
488
  return state->parse_state.out_cur_idx > 0 &&
519
489
  state->parse_state.out_cur_idx < state->out_end_idx &&
@@ -1039,7 +1009,8 @@ static bool ParseNumber(State *state, int *number_out) {
1039
1009
  number = ~number + 1;
1040
1010
  }
1041
1011
  if (p != RemainingInput(state)) { // Conversion succeeded.
1042
- state->parse_state.mangled_idx += p - RemainingInput(state);
1012
+ state->parse_state.mangled_idx +=
1013
+ static_cast<int>(p - RemainingInput(state));
1043
1014
  UpdateHighWaterMark(state);
1044
1015
  if (number_out != nullptr) {
1045
1016
  // Note: possibly truncate "number".
@@ -1062,7 +1033,8 @@ static bool ParseFloatNumber(State *state) {
1062
1033
  }
1063
1034
  }
1064
1035
  if (p != RemainingInput(state)) { // Conversion succeeded.
1065
- state->parse_state.mangled_idx += p - RemainingInput(state);
1036
+ state->parse_state.mangled_idx +=
1037
+ static_cast<int>(p - RemainingInput(state));
1066
1038
  UpdateHighWaterMark(state);
1067
1039
  return true;
1068
1040
  }
@@ -1081,7 +1053,8 @@ static bool ParseSeqId(State *state) {
1081
1053
  }
1082
1054
  }
1083
1055
  if (p != RemainingInput(state)) { // Conversion succeeded.
1084
- state->parse_state.mangled_idx += p - RemainingInput(state);
1056
+ state->parse_state.mangled_idx +=
1057
+ static_cast<int>(p - RemainingInput(state));
1085
1058
  UpdateHighWaterMark(state);
1086
1059
  return true;
1087
1060
  }
@@ -1100,7 +1073,7 @@ static bool ParseIdentifier(State *state, size_t length) {
1100
1073
  } else {
1101
1074
  MaybeAppendWithLength(state, RemainingInput(state), length);
1102
1075
  }
1103
- state->parse_state.mangled_idx += length;
1076
+ state->parse_state.mangled_idx += static_cast<int>(length);
1104
1077
  UpdateHighWaterMark(state);
1105
1078
  return true;
1106
1079
  }
@@ -2929,7 +2902,7 @@ static bool ParseTopLevelMangledName(State *state) {
2929
2902
  if (ParseMangledName(state)) {
2930
2903
  if (RemainingInput(state)[0] != '\0') {
2931
2904
  // Drop trailing function clone suffix, if any.
2932
- if (IsFunctionCloneSuffix(RemainingInput(state))) {
2905
+ if (RemainingInput(state)[0] == '.') {
2933
2906
  return true;
2934
2907
  }
2935
2908
  // Append trailing version suffix if any.
@@ -84,7 +84,7 @@ class RustSymbolParser {
84
84
  // structure was not recognized or exceeded implementation limits, such as by
85
85
  // nesting structures too deep. In either case *this should not be used
86
86
  // again.
87
- ABSL_MUST_USE_RESULT bool Parse() && {
87
+ [[nodiscard]] bool Parse() && {
88
88
  // Recursively parses the grammar production named by callee, then resumes
89
89
  // execution at the next statement.
90
90
  //
@@ -564,7 +564,7 @@ class RustSymbolParser {
564
564
 
565
565
  // If the next input character is the given character, consumes it and returns
566
566
  // true; otherwise returns false without consuming a character.
567
- ABSL_MUST_USE_RESULT bool Eat(char want) {
567
+ [[nodiscard]] bool Eat(char want) {
568
568
  if (encoding_[pos_] != want) return false;
569
569
  ++pos_;
570
570
  return true;
@@ -573,7 +573,7 @@ class RustSymbolParser {
573
573
  // Provided there is enough remaining output space, appends c to the output,
574
574
  // writing a fresh NUL terminator afterward, and returns true. Returns false
575
575
  // if the output buffer had less than two bytes free.
576
- ABSL_MUST_USE_RESULT bool EmitChar(char c) {
576
+ [[nodiscard]] bool EmitChar(char c) {
577
577
  if (silence_depth_ > 0) return true;
578
578
  if (out_end_ - out_ < 2) return false;
579
579
  *out_++ = c;
@@ -584,7 +584,7 @@ class RustSymbolParser {
584
584
  // Provided there is enough remaining output space, appends the C string token
585
585
  // to the output, followed by a NUL character, and returns true. Returns
586
586
  // false if not everything fit into the output buffer.
587
- ABSL_MUST_USE_RESULT bool Emit(const char* token) {
587
+ [[nodiscard]] bool Emit(const char* token) {
588
588
  if (silence_depth_ > 0) return true;
589
589
  const size_t token_length = std::strlen(token);
590
590
  const size_t bytes_to_copy = token_length + 1; // token and final NUL
@@ -598,7 +598,7 @@ class RustSymbolParser {
598
598
  // of disambiguator (if it's nonnegative) or "?" (if it's negative) to the
599
599
  // output, followed by a NUL character, and returns true. Returns false if
600
600
  // not everything fit into the output buffer.
601
- ABSL_MUST_USE_RESULT bool EmitDisambiguator(int disambiguator) {
601
+ [[nodiscard]] bool EmitDisambiguator(int disambiguator) {
602
602
  if (disambiguator < 0) return EmitChar('?'); // parsed but too large
603
603
  if (disambiguator == 0) return EmitChar('0');
604
604
  // Convert disambiguator to decimal text. Three digits per byte is enough
@@ -618,7 +618,7 @@ class RustSymbolParser {
618
618
  // On success returns true and fills value with the encoded value if it was
619
619
  // not too big, otherwise with -1. If the optional disambiguator was omitted,
620
620
  // value is 0. On parse failure returns false and sets value to -1.
621
- ABSL_MUST_USE_RESULT bool ParseDisambiguator(int& value) {
621
+ [[nodiscard]] bool ParseDisambiguator(int& value) {
622
622
  value = -1;
623
623
 
624
624
  // disambiguator = s base-62-number
@@ -639,7 +639,7 @@ class RustSymbolParser {
639
639
  // On success returns true and fills value with the encoded value if it was
640
640
  // not too big, otherwise with -1. On parse failure returns false and sets
641
641
  // value to -1.
642
- ABSL_MUST_USE_RESULT bool ParseBase62Number(int& value) {
642
+ [[nodiscard]] bool ParseBase62Number(int& value) {
643
643
  value = -1;
644
644
 
645
645
  // base-62-number = (digit | lower | upper)* _
@@ -686,7 +686,7 @@ class RustSymbolParser {
686
686
  // A nonzero uppercase_namespace specifies the character after the N in a
687
687
  // nested-identifier, e.g., 'C' for a closure, allowing ParseIdentifier to
688
688
  // write out the name with the conventional decoration for that namespace.
689
- ABSL_MUST_USE_RESULT bool ParseIdentifier(char uppercase_namespace = '\0') {
689
+ [[nodiscard]] bool ParseIdentifier(char uppercase_namespace = '\0') {
690
690
  // identifier -> disambiguator? undisambiguated-identifier
691
691
  int disambiguator = 0;
692
692
  if (!ParseDisambiguator(disambiguator)) return false;
@@ -703,7 +703,7 @@ class RustSymbolParser {
703
703
  //
704
704
  // At other appearances of undisambiguated-identifier in the grammar, this
705
705
  // treatment is not applicable, and the call site omits both arguments.
706
- ABSL_MUST_USE_RESULT bool ParseUndisambiguatedIdentifier(
706
+ [[nodiscard]] bool ParseUndisambiguatedIdentifier(
707
707
  char uppercase_namespace = '\0', int disambiguator = 0) {
708
708
  // undisambiguated-identifier -> u? decimal-number _? bytes
709
709
  const bool is_punycoded = Eat('u');
@@ -766,7 +766,7 @@ class RustSymbolParser {
766
766
  // Consumes a decimal number like 0 or 123 from the input. On success returns
767
767
  // true and fills value with the encoded value. If the encoded value is too
768
768
  // large or otherwise unparsable, returns false and sets value to -1.
769
- ABSL_MUST_USE_RESULT bool ParseDecimalNumber(int& value) {
769
+ [[nodiscard]] bool ParseDecimalNumber(int& value) {
770
770
  value = -1;
771
771
  if (!IsDigit(Peek())) return false;
772
772
  int encoded_number = Take() - '0';
@@ -788,7 +788,7 @@ class RustSymbolParser {
788
788
  // Consumes a binder of higher-ranked lifetimes if one is present. On success
789
789
  // returns true and discards the encoded lifetime count. On parse failure
790
790
  // returns false.
791
- ABSL_MUST_USE_RESULT bool ParseOptionalBinder() {
791
+ [[nodiscard]] bool ParseOptionalBinder() {
792
792
  // binder -> G base-62-number
793
793
  if (!Eat('G')) return true;
794
794
  int ignored_binding_count;
@@ -802,7 +802,7 @@ class RustSymbolParser {
802
802
  // things we omit from output, such as the entire contents of generic-args.
803
803
  //
804
804
  // On parse failure returns false.
805
- ABSL_MUST_USE_RESULT bool ParseOptionalLifetime() {
805
+ [[nodiscard]] bool ParseOptionalLifetime() {
806
806
  // lifetime -> L base-62-number
807
807
  if (!Eat('L')) return true;
808
808
  int ignored_de_bruijn_index;
@@ -811,14 +811,14 @@ class RustSymbolParser {
811
811
 
812
812
  // Consumes a lifetime just like ParseOptionalLifetime, but returns false if
813
813
  // there is no lifetime here.
814
- ABSL_MUST_USE_RESULT bool ParseRequiredLifetime() {
814
+ [[nodiscard]] bool ParseRequiredLifetime() {
815
815
  if (Peek() != 'L') return false;
816
816
  return ParseOptionalLifetime();
817
817
  }
818
818
 
819
819
  // Pushes ns onto the namespace stack and returns true if the stack is not
820
820
  // full, else returns false.
821
- ABSL_MUST_USE_RESULT bool PushNamespace(char ns) {
821
+ [[nodiscard]] bool PushNamespace(char ns) {
822
822
  if (namespace_depth_ == kNamespaceStackSize) return false;
823
823
  namespace_stack_[namespace_depth_++] = ns;
824
824
  return true;
@@ -830,7 +830,7 @@ class RustSymbolParser {
830
830
 
831
831
  // Pushes position onto the position stack and returns true if the stack is
832
832
  // not full, else returns false.
833
- ABSL_MUST_USE_RESULT bool PushPosition(int position) {
833
+ [[nodiscard]] bool PushPosition(int position) {
834
834
  if (position_depth_ == kPositionStackSize) return false;
835
835
  position_stack_[position_depth_++] = position;
836
836
  return true;
@@ -845,7 +845,7 @@ class RustSymbolParser {
845
845
  // beginning of the backref target. Returns true on success. Returns false
846
846
  // if parsing failed, the stack is exhausted, or the backref target position
847
847
  // is out of range.
848
- ABSL_MUST_USE_RESULT bool BeginBackref() {
848
+ [[nodiscard]] bool BeginBackref() {
849
849
  // backref = B base-62-number (B already consumed)
850
850
  //
851
851
  // Reject backrefs that don't parse, overflow int, or don't point backward.
@@ -556,14 +556,15 @@ TEST(Demangle, Clones) {
556
556
  EXPECT_TRUE(Demangle("_ZL3Foov.part.9.165493.constprop.775.31805", tmp,
557
557
  sizeof(tmp)));
558
558
  EXPECT_STREQ("Foo()", tmp);
559
- // Invalid (. without anything else), should not demangle.
560
- EXPECT_FALSE(Demangle("_ZL3Foov.", tmp, sizeof(tmp)));
561
- // Invalid (. with mix of alpha and digits), should not demangle.
562
- EXPECT_FALSE(Demangle("_ZL3Foov.abc123", tmp, sizeof(tmp)));
563
- // Invalid (.clone. not followed by number), should not demangle.
564
- EXPECT_FALSE(Demangle("_ZL3Foov.clone.", tmp, sizeof(tmp)));
565
- // Invalid (.constprop. not followed by number), should not demangle.
566
- EXPECT_FALSE(Demangle("_ZL3Foov.isra.2.constprop.", tmp, sizeof(tmp)));
559
+ // Other suffixes should demangle too.
560
+ EXPECT_TRUE(Demangle("_ZL3Foov.", tmp, sizeof(tmp)));
561
+ EXPECT_STREQ("Foo()", tmp);
562
+ EXPECT_TRUE(Demangle("_ZL3Foov.abc123", tmp, sizeof(tmp)));
563
+ EXPECT_STREQ("Foo()", tmp);
564
+ EXPECT_TRUE(Demangle("_ZL3Foov.clone.", tmp, sizeof(tmp)));
565
+ EXPECT_STREQ("Foo()", tmp);
566
+ EXPECT_TRUE(Demangle("_ZL3Foov.isra.2.constprop.", tmp, sizeof(tmp)));
567
+ EXPECT_STREQ("Foo()", tmp);
567
568
  }
568
569
 
569
570
  TEST(Demangle, Discriminators) {
@@ -1935,11 +1936,11 @@ static const char *DemangleStackConsumption(const char *mangled,
1935
1936
  return g_demangle_result;
1936
1937
  }
1937
1938
 
1938
- // Demangle stack consumption should be within 8kB for simple mangled names
1939
+ // Demangle stack consumption should be within 9kB for simple mangled names
1939
1940
  // with some level of nesting. With alternate signal stack we have 64K,
1940
1941
  // but some signal handlers run on thread stack, and could have arbitrarily
1941
1942
  // little space left (so we don't want to make this number too large).
1942
- const int kStackConsumptionUpperLimit = 8192;
1943
+ const int kStackConsumptionUpperLimit = 9670;
1943
1944
 
1944
1945
  // Returns a mangled name nested to the given depth.
1945
1946
  static std::string NestedMangledName(int depth) {
@@ -18,6 +18,7 @@
18
18
 
19
19
  #include "absl/base/attributes.h"
20
20
  #include "absl/debugging/internal/address_is_readable.h"
21
+ #include "absl/debugging/internal/addresses.h"
21
22
  #include "absl/debugging/internal/vdso_support.h" // a no-op on non-elf or non-glibc systems
22
23
  #include "absl/debugging/stacktrace.h"
23
24
 
@@ -101,7 +102,8 @@ static bool InsideSignalStack(void** ptr, const StackInfo* stack_info) {
101
102
  // "STRICT_UNWINDING") to reduce the chance that a bad pointer is returned.
102
103
  template<bool STRICT_UNWINDING, bool WITH_CONTEXT>
103
104
  ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS // May read random elements from stack.
104
- ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY // May read random elements from stack.
105
+ ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY // May read random elements from stack.
106
+ ABSL_ATTRIBUTE_NO_SANITIZE_THREAD // May read random elements from stack.
105
107
  static void **NextStackFrame(void **old_frame_pointer, const void *uc,
106
108
  const StackInfo *stack_info) {
107
109
  void **new_frame_pointer = reinterpret_cast<void**>(*old_frame_pointer);
@@ -124,6 +126,7 @@ static void **NextStackFrame(void **old_frame_pointer, const void *uc,
124
126
  if (pre_signal_frame_pointer >= old_frame_pointer) {
125
127
  new_frame_pointer = pre_signal_frame_pointer;
126
128
  }
129
+ }
127
130
  }
128
131
  #endif
129
132
 
@@ -131,17 +134,13 @@ static void **NextStackFrame(void **old_frame_pointer, const void *uc,
131
134
  if ((reinterpret_cast<uintptr_t>(new_frame_pointer) & 7) != 0)
132
135
  return nullptr;
133
136
 
134
- // Check that alleged frame pointer is actually readable. This is to
135
- // prevent "double fault" in case we hit the first fault due to e.g.
136
- // stack corruption.
137
- if (!absl::debugging_internal::AddressIsReadable(
138
- new_frame_pointer))
139
- return nullptr;
140
- }
141
-
137
+ uintptr_t new_fp_comparable = reinterpret_cast<uintptr_t>(new_frame_pointer);
142
138
  // Only check the size if both frames are in the same stack.
143
- if (InsideSignalStack(new_frame_pointer, stack_info) ==
144
- InsideSignalStack(old_frame_pointer, stack_info)) {
139
+ const bool old_inside_signal_stack =
140
+ InsideSignalStack(old_frame_pointer, stack_info);
141
+ const bool new_inside_signal_stack =
142
+ InsideSignalStack(new_frame_pointer, stack_info);
143
+ if (new_inside_signal_stack == old_inside_signal_stack) {
145
144
  // Check frame size. In strict mode, we assume frames to be under
146
145
  // 100,000 bytes. In non-strict mode, we relax the limit to 1MB.
147
146
  const size_t max_size = STRICT_UNWINDING ? 100000 : 1000000;
@@ -155,16 +154,15 @@ static void **NextStackFrame(void **old_frame_pointer, const void *uc,
155
154
  if (frame_size > max_size) {
156
155
  size_t stack_low = stack_info->stack_low;
157
156
  size_t stack_high = stack_info->stack_high;
158
- if (InsideSignalStack(new_frame_pointer, stack_info)) {
157
+ if (new_inside_signal_stack) {
159
158
  stack_low = stack_info->sig_stack_low;
160
159
  stack_high = stack_info->sig_stack_high;
161
160
  }
162
161
  if (stack_high < kUnknownStackEnd &&
163
162
  static_cast<size_t>(getpagesize()) < stack_low) {
164
- const uintptr_t new_fp_u =
165
- reinterpret_cast<uintptr_t>(new_frame_pointer);
166
163
  // Stack bounds are known.
167
- if (!(stack_low < new_fp_u && new_fp_u <= stack_high)) {
164
+ if (!(stack_low < new_fp_comparable &&
165
+ new_fp_comparable <= stack_high)) {
168
166
  // new_frame_pointer is not within a known stack.
169
167
  return nullptr;
170
168
  }
@@ -174,24 +172,19 @@ static void **NextStackFrame(void **old_frame_pointer, const void *uc,
174
172
  }
175
173
  }
176
174
  }
175
+ // New frame pointer is valid if it is inside either known stack or readable.
176
+ // This assumes that everything within either known stack is readable. Outside
177
+ // either known stack but readable is unexpected, and possibly corrupt, but
178
+ // for now assume it is valid. If it isn't actually valid, the next frame will
179
+ // be corrupt and we will detect that next iteration.
180
+ if (new_inside_signal_stack ||
181
+ (new_fp_comparable >= stack_info->stack_low &&
182
+ new_fp_comparable < stack_info->stack_high) ||
183
+ absl::debugging_internal::AddressIsReadable(new_frame_pointer)) {
184
+ return new_frame_pointer;
185
+ }
177
186
 
178
- return new_frame_pointer;
179
- }
180
-
181
- // When PAC-RET (-mbranch-protection=pac-ret) is enabled, return addresses
182
- // stored on the stack will be signed, which means that pointer bits outside of
183
- // the VA range are potentially set. Since the stacktrace code is expected to
184
- // return normal code pointers, this function clears those bits.
185
- inline void* ClearPacBits(void* ptr) {
186
- register void* x30 __asm__("x30") = ptr;
187
- // The normal instruction for clearing PAC bits is XPACI, but for
188
- // compatibility with ARM platforms that do not support pointer
189
- // authentication, we use the hint space instruction XPACLRI instead. Hint
190
- // space instructions behave as NOPs on unsupported platforms.
191
- #define ABSL_XPACLRI_HINT "hint #0x7;"
192
- asm(ABSL_XPACLRI_HINT : "+r"(x30)); // asm("xpaclri" : "+r"(x30));
193
- #undef ABSL_XPACLRI_HINT
194
- return x30;
187
+ return nullptr;
195
188
  }
196
189
 
197
190
  template <bool IS_STACK_FRAMES, bool IS_WITH_CONTEXT>
@@ -200,8 +193,10 @@ template <bool IS_STACK_FRAMES, bool IS_WITH_CONTEXT>
200
193
  ABSL_ATTRIBUTE_NOINLINE
201
194
  ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS // May read random elements from stack.
202
195
  ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY // May read random elements from stack.
203
- static int UnwindImpl(void** result, int* sizes, int max_depth, int skip_count,
204
- const void *ucp, int *min_dropped_frames) {
196
+ ABSL_ATTRIBUTE_NO_SANITIZE_THREAD // May read random elements from stack.
197
+ static int UnwindImpl(void **result, uintptr_t *frames, int *sizes,
198
+ int max_depth, int skip_count, const void *ucp,
199
+ int *min_dropped_frames) {
205
200
  #ifdef __GNUC__
206
201
  void **frame_pointer = reinterpret_cast<void**>(__builtin_frame_address(0));
207
202
  #else
@@ -235,10 +230,18 @@ static int UnwindImpl(void** result, int* sizes, int max_depth, int skip_count,
235
230
  if (skip_count > 0) {
236
231
  skip_count--;
237
232
  } else {
238
- result[n] = ClearPacBits(prev_return_address);
233
+ result[n] = reinterpret_cast<void *>(
234
+ absl::debugging_internal::StripPointerMetadata(prev_return_address));
239
235
  if (IS_STACK_FRAMES) {
240
- sizes[n] = static_cast<int>(
241
- ComputeStackFrameSize(prev_frame_pointer, frame_pointer));
236
+ if (frames != nullptr) {
237
+ frames[n] = absl::debugging_internal::StripPointerMetadata(
238
+ prev_frame_pointer) +
239
+ 2 * sizeof(void *) /* go past the return address */;
240
+ }
241
+ if (sizes != nullptr) {
242
+ sizes[n] = static_cast<int>(
243
+ ComputeStackFrameSize(prev_frame_pointer, frame_pointer));
244
+ }
242
245
  }
243
246
  n++;
244
247
  }
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include <cstdint>
21
21
 
22
+ #include "absl/debugging/internal/addresses.h"
22
23
  #include "absl/debugging/stacktrace.h"
23
24
 
24
25
  // WARNING:
@@ -67,8 +68,9 @@ void StacktraceArmDummyFunction() { __asm__ volatile(""); }
67
68
  #endif
68
69
 
69
70
  template <bool IS_STACK_FRAMES, bool IS_WITH_CONTEXT>
70
- static int UnwindImpl(void** result, int* sizes, int max_depth, int skip_count,
71
- const void * /* ucp */, int *min_dropped_frames) {
71
+ static int UnwindImpl(void **result, uintptr_t *frames, int *sizes,
72
+ int max_depth, int skip_count, const void * /* ucp */,
73
+ int *min_dropped_frames) {
72
74
  #ifdef __GNUC__
73
75
  void **sp = reinterpret_cast<void**>(__builtin_frame_address(0));
74
76
  #else
@@ -97,11 +99,18 @@ static int UnwindImpl(void** result, int* sizes, int max_depth, int skip_count,
97
99
  result[n] = *sp;
98
100
 
99
101
  if (IS_STACK_FRAMES) {
100
- if (next_sp > sp) {
101
- sizes[n] = (uintptr_t)next_sp - (uintptr_t)sp;
102
- } else {
103
- // A frame-size of 0 is used to indicate unknown frame size.
104
- sizes[n] = 0;
102
+ if (frames != nullptr) {
103
+ frames[n] = absl::debugging_internal::StripPointerMetadata(sp) +
104
+ 1 * sizeof(void *) /* go past the return address */;
105
+ }
106
+ if (sizes != nullptr) {
107
+ if (next_sp > sp) {
108
+ sizes[n] = absl::debugging_internal::StripPointerMetadata(next_sp) -
109
+ absl::debugging_internal::StripPointerMetadata(sp);
110
+ } else {
111
+ // A frame-size of 0 is used to indicate unknown frame size.
112
+ sizes[n] = 0;
113
+ }
105
114
  }
106
115
  }
107
116
  n++;
@@ -43,11 +43,12 @@
43
43
  "absl/debugging/internal/stacktrace_emscripten-inl.inc"
44
44
 
45
45
  #elif defined(__ANDROID__) && __ANDROID_API__ >= 33
46
-
46
+ #ifdef ABSL_HAVE_THREAD_LOCAL
47
47
  // Use the generic implementation for Android 33+ (Android T+). This is the
48
48
  // first version of Android for which <execinfo.h> implements backtrace().
49
49
  #define ABSL_STACKTRACE_INL_HEADER \
50
50
  "absl/debugging/internal/stacktrace_generic-inl.inc"
51
+ #endif // defined(ABSL_HAVE_THREAD_LOCAL)
51
52
 
52
53
  #elif defined(__linux__) && !defined(__ANDROID__)
53
54
 
@@ -59,11 +60,11 @@
59
60
  "absl/debugging/internal/stacktrace_libunwind-inl.inc"
60
61
  #define STACKTRACE_USES_LIBUNWIND 1
61
62
  #elif defined(NO_FRAME_POINTER) && defined(__has_include)
62
- #if __has_include(<execinfo.h>)
63
+ #if __has_include(<execinfo.h>) && defined(ABSL_HAVE_THREAD_LOCAL)
63
64
  // Note: When using glibc this may require -funwind-tables to function properly.
64
65
  #define ABSL_STACKTRACE_INL_HEADER \
65
66
  "absl/debugging/internal/stacktrace_generic-inl.inc"
66
- #endif // __has_include(<execinfo.h>)
67
+ #endif // __has_include(<execinfo.h>) && defined(ABSL_HAVE_THREAD_LOCAL)
67
68
  #elif defined(__i386__) || defined(__x86_64__)
68
69
  #define ABSL_STACKTRACE_INL_HEADER \
69
70
  "absl/debugging/internal/stacktrace_x86-inl.inc"
@@ -77,11 +78,11 @@
77
78
  #define ABSL_STACKTRACE_INL_HEADER \
78
79
  "absl/debugging/internal/stacktrace_riscv-inl.inc"
79
80
  #elif defined(__has_include)
80
- #if __has_include(<execinfo.h>)
81
+ #if __has_include(<execinfo.h>) && defined(ABSL_HAVE_THREAD_LOCAL)
81
82
  // Note: When using glibc this may require -funwind-tables to function properly.
82
83
  #define ABSL_STACKTRACE_INL_HEADER \
83
84
  "absl/debugging/internal/stacktrace_generic-inl.inc"
84
- #endif // __has_include(<execinfo.h>)
85
+ #endif // __has_include(<execinfo.h>) && defined(ABSL_HAVE_THREAD_LOCAL)
85
86
  #endif // defined(__has_include)
86
87
 
87
88
  #endif // defined(__linux__) && !defined(__ANDROID__)
@@ -21,8 +21,10 @@
21
21
  #define ABSL_DEBUGGING_INTERNAL_STACKTRACE_EMSCRIPTEN_INL_H_
22
22
 
23
23
  #include <emscripten.h>
24
+ #include <stdint.h>
24
25
 
25
26
  #include <atomic>
27
+ #include <cstddef>
26
28
  #include <cstring>
27
29
 
28
30
  #include "absl/base/attributes.h"
@@ -62,8 +64,9 @@ ABSL_ATTRIBUTE_UNUSED static int stacktraces_enabler = []() {
62
64
  }();
63
65
 
64
66
  template <bool IS_STACK_FRAMES, bool IS_WITH_CONTEXT>
65
- static int UnwindImpl(void **result, int *sizes, int max_depth, int skip_count,
66
- const void *ucp, int *min_dropped_frames) {
67
+ static int UnwindImpl(void **result, uintptr_t *frames, int *sizes,
68
+ int max_depth, int skip_count, const void *ucp,
69
+ int *min_dropped_frames) {
67
70
  if (recursive || disable_stacktraces.load(std::memory_order_relaxed)) {
68
71
  return 0;
69
72
  }
@@ -75,7 +78,8 @@ static int UnwindImpl(void **result, int *sizes, int max_depth, int skip_count,
75
78
 
76
79
  int size;
77
80
  uintptr_t pc = emscripten_stack_snapshot();
78
- size = emscripten_stack_unwind_buffer(pc, stack, kStackLength);
81
+ size =
82
+ static_cast<int>(emscripten_stack_unwind_buffer(pc, stack, kStackLength));
79
83
 
80
84
  int result_count = size - skip_count;
81
85
  if (result_count < 0) result_count = 0;
@@ -83,8 +87,13 @@ static int UnwindImpl(void **result, int *sizes, int max_depth, int skip_count,
83
87
  for (int i = 0; i < result_count; i++) result[i] = stack[i + skip_count];
84
88
 
85
89
  if (IS_STACK_FRAMES) {
86
- // No implementation for finding out the stack frame sizes yet.
87
- memset(sizes, 0, sizeof(*sizes) * result_count);
90
+ // No implementation for finding out the stack frames yet.
91
+ if (frames != nullptr) {
92
+ memset(frames, 0, sizeof(*frames) * static_cast<size_t>(result_count));
93
+ }
94
+ if (sizes != nullptr) {
95
+ memset(sizes, 0, sizeof(*sizes) * static_cast<size_t>(result_count));
96
+ }
88
97
  }
89
98
  if (min_dropped_frames != nullptr) {
90
99
  if (size - skip_count - max_depth > 0) {