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.
- package/README.md +60 -4
- package/binding.gyp +5 -1
- package/lib/addon.cc +4 -0
- package/lib/new.cc +1 -246
- package/lib/pattern.cc +252 -0
- package/lib/pattern.h +10 -0
- package/lib/set.cc +777 -0
- package/lib/wrapped_re2_set.h +42 -0
- package/package.json +21 -9
- package/re2.d.ts +46 -9
- package/vendor/abseil-cpp/CMake/AbseilDll.cmake +14 -24
- package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +3 -3
- package/vendor/abseil-cpp/CMake/README.md +2 -2
- package/vendor/abseil-cpp/CMakeLists.txt +3 -3
- package/vendor/abseil-cpp/MODULE.bazel +6 -9
- package/vendor/abseil-cpp/README.md +6 -8
- package/vendor/abseil-cpp/absl/abseil.podspec.gen.py +6 -4
- package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +3 -0
- package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +1 -0
- package/vendor/abseil-cpp/absl/algorithm/container.h +2 -19
- package/vendor/abseil-cpp/absl/algorithm/container_test.cc +4 -11
- package/vendor/abseil-cpp/absl/base/BUILD.bazel +60 -45
- package/vendor/abseil-cpp/absl/base/CMakeLists.txt +57 -38
- package/vendor/abseil-cpp/absl/base/attributes.h +76 -7
- package/vendor/abseil-cpp/absl/base/attributes_test.cc +43 -0
- package/vendor/abseil-cpp/absl/base/call_once.h +11 -12
- package/vendor/abseil-cpp/absl/base/config.h +22 -129
- package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +0 -4
- package/vendor/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
- package/vendor/abseil-cpp/absl/base/{internal/fast_type_id_test.cc → fast_type_id_test.cc} +34 -30
- package/vendor/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
- package/vendor/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
- package/vendor/abseil-cpp/absl/base/internal/endian.h +34 -38
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test.cc +85 -0
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test_helper.h +97 -0
- package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -9
- package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
- package/vendor/abseil-cpp/absl/base/internal/poison.cc +7 -6
- package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +15 -28
- package/vendor/abseil-cpp/absl/base/internal/spinlock.h +65 -35
- package/vendor/abseil-cpp/absl/base/internal/spinlock_benchmark.cc +2 -2
- package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +2 -2
- package/vendor/abseil-cpp/absl/base/internal/thread_identity_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/base/internal/thread_identity_test.cc +4 -4
- package/vendor/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +4 -0
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
- package/vendor/abseil-cpp/absl/base/no_destructor.h +11 -32
- package/vendor/abseil-cpp/absl/base/no_destructor_test.cc +0 -4
- package/vendor/abseil-cpp/absl/base/nullability.h +83 -72
- package/vendor/abseil-cpp/absl/base/nullability_test.cc +25 -64
- package/vendor/abseil-cpp/absl/base/options.h +3 -80
- package/vendor/abseil-cpp/absl/base/policy_checks.h +7 -7
- package/vendor/abseil-cpp/absl/base/raw_logging_test.cc +15 -0
- package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +50 -30
- package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -1
- package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +0 -1
- package/vendor/abseil-cpp/absl/cleanup/cleanup.h +1 -3
- package/vendor/abseil-cpp/absl/cleanup/cleanup_test.cc +0 -2
- package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
- package/vendor/abseil-cpp/absl/container/BUILD.bazel +74 -1
- package/vendor/abseil-cpp/absl/container/CMakeLists.txt +73 -0
- package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +51 -9
- package/vendor/abseil-cpp/absl/container/btree_map.h +8 -6
- package/vendor/abseil-cpp/absl/container/btree_set.h +8 -6
- package/vendor/abseil-cpp/absl/container/btree_test.cc +89 -4
- package/vendor/abseil-cpp/absl/container/fixed_array.h +7 -15
- package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +17 -0
- package/vendor/abseil-cpp/absl/container/flat_hash_map.h +20 -15
- package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +8 -14
- package/vendor/abseil-cpp/absl/container/flat_hash_set.h +19 -14
- package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +46 -0
- package/vendor/abseil-cpp/absl/container/inlined_vector.h +7 -6
- package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +28 -0
- package/vendor/abseil-cpp/absl/container/internal/btree.h +132 -29
- package/vendor/abseil-cpp/absl/container/internal/btree_container.h +175 -71
- package/vendor/abseil-cpp/absl/container/internal/common.h +43 -0
- package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
- package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +28 -24
- package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +4 -17
- package/vendor/abseil-cpp/absl/container/internal/container_memory.h +80 -17
- package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +32 -2
- package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +13 -8
- package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults_test.cc +1 -52
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +9 -31
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +23 -32
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +5 -1
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +11 -23
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits_test.cc +14 -9
- package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +516 -0
- package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes_test.cc +259 -0
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +23 -6
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +32 -13
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +8 -8
- package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
- package/vendor/abseil-cpp/absl/container/internal/layout.h +26 -42
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +1506 -213
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +1095 -1658
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +3 -2
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +31 -29
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +51 -20
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +79 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl_test.cc +66 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +707 -363
- package/vendor/abseil-cpp/absl/container/node_hash_map.h +20 -15
- package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +0 -3
- package/vendor/abseil-cpp/absl/container/node_hash_set.h +18 -13
- package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +3 -8
- package/vendor/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake +1 -1
- package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +9 -20
- package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +9 -20
- package/vendor/abseil-cpp/absl/copts/copts.py +24 -15
- package/vendor/abseil-cpp/absl/crc/BUILD.bazel +3 -0
- package/vendor/abseil-cpp/absl/crc/crc32c.cc +0 -4
- package/vendor/abseil-cpp/absl/crc/crc32c.h +7 -5
- package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +17 -4
- package/vendor/abseil-cpp/absl/crc/crc32c_test.cc +30 -0
- package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +17 -0
- package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
- package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
- package/vendor/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
- package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +136 -165
- package/vendor/abseil-cpp/absl/crc/internal/gen_crc32c_consts.py +90 -0
- package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +7 -0
- package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +4 -0
- package/vendor/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
- package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
- package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
- package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
- package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
- package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +11 -10
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -14
- package/vendor/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
- package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +161 -27
- package/vendor/abseil-cpp/absl/debugging/stacktrace.h +73 -5
- package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +435 -1
- package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +55 -63
- package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
- package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
- package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -0
- package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +3 -0
- package/vendor/abseil-cpp/absl/flags/commandlineflag.h +2 -2
- package/vendor/abseil-cpp/absl/flags/flag.h +4 -3
- package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
- package/vendor/abseil-cpp/absl/flags/internal/flag.cc +14 -13
- package/vendor/abseil-cpp/absl/flags/internal/flag.h +34 -34
- package/vendor/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
- package/vendor/abseil-cpp/absl/flags/internal/registry.h +4 -3
- package/vendor/abseil-cpp/absl/flags/internal/usage.cc +2 -2
- package/vendor/abseil-cpp/absl/flags/parse.cc +10 -6
- package/vendor/abseil-cpp/absl/flags/reflection.cc +9 -7
- package/vendor/abseil-cpp/absl/flags/usage.cc +2 -2
- package/vendor/abseil-cpp/absl/flags/usage_config.cc +2 -2
- package/vendor/abseil-cpp/absl/functional/BUILD.bazel +7 -6
- package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +2 -4
- package/vendor/abseil-cpp/absl/functional/any_invocable.h +15 -15
- package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +10 -42
- package/vendor/abseil-cpp/absl/functional/function_ref.h +2 -9
- package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +10 -0
- package/vendor/abseil-cpp/absl/functional/function_type_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +112 -227
- package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
- package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
- package/vendor/abseil-cpp/absl/functional/overload.h +0 -20
- package/vendor/abseil-cpp/absl/functional/overload_test.cc +1 -7
- package/vendor/abseil-cpp/absl/hash/BUILD.bazel +16 -9
- package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +6 -9
- package/vendor/abseil-cpp/absl/hash/hash.h +18 -0
- package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +3 -0
- package/vendor/abseil-cpp/absl/hash/hash_instantiated_test.cc +1 -1
- package/vendor/abseil-cpp/absl/hash/hash_test.cc +131 -30
- package/vendor/abseil-cpp/absl/hash/hash_testing.h +20 -20
- package/vendor/abseil-cpp/absl/hash/internal/hash.cc +129 -17
- package/vendor/abseil-cpp/absl/hash/internal/hash.h +326 -362
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +54 -151
- package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +14 -2
- package/vendor/abseil-cpp/absl/{strings/cord_buffer.cc → hash/internal/weakly_mixed_integer.h} +14 -6
- package/vendor/abseil-cpp/absl/log/BUILD.bazel +4 -0
- package/vendor/abseil-cpp/absl/log/CMakeLists.txt +7 -0
- package/vendor/abseil-cpp/absl/log/check.h +2 -1
- package/vendor/abseil-cpp/absl/log/check_test_impl.inc +308 -14
- package/vendor/abseil-cpp/absl/log/die_if_null.h +2 -2
- package/vendor/abseil-cpp/absl/log/flags_test.cc +7 -0
- package/vendor/abseil-cpp/absl/log/globals.h +4 -5
- package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +13 -9
- package/vendor/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
- package/vendor/abseil-cpp/absl/log/internal/check_op.cc +24 -22
- package/vendor/abseil-cpp/absl/log/internal/check_op.h +149 -94
- package/vendor/abseil-cpp/absl/log/internal/conditions.cc +5 -3
- package/vendor/abseil-cpp/absl/log/internal/conditions.h +7 -2
- package/vendor/abseil-cpp/absl/log/internal/fnmatch_test.cc +1 -0
- package/vendor/abseil-cpp/absl/log/internal/log_message.cc +85 -43
- package/vendor/abseil-cpp/absl/log/internal/log_message.h +84 -59
- package/vendor/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
- package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -0
- package/vendor/abseil-cpp/absl/log/internal/proto.cc +3 -2
- package/vendor/abseil-cpp/absl/log/internal/proto.h +3 -3
- package/vendor/abseil-cpp/absl/log/internal/strip.h +4 -12
- package/vendor/abseil-cpp/absl/log/internal/structured.h +3 -7
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +9 -9
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
- package/vendor/abseil-cpp/absl/log/internal/voidify.h +10 -4
- package/vendor/abseil-cpp/absl/log/log.h +48 -35
- package/vendor/abseil-cpp/absl/log/log_basic_test_impl.inc +45 -0
- package/vendor/abseil-cpp/absl/log/log_entry.cc +241 -19
- package/vendor/abseil-cpp/absl/log/log_entry.h +2 -0
- package/vendor/abseil-cpp/absl/log/log_format_test.cc +412 -6
- package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +20 -0
- package/vendor/abseil-cpp/absl/log/log_sink_registry.h +2 -2
- package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +15 -2
- package/vendor/abseil-cpp/absl/log/scoped_mock_log.h +7 -1
- package/vendor/abseil-cpp/absl/log/structured_test.cc +1 -0
- package/vendor/abseil-cpp/absl/memory/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/meta/type_traits.h +46 -175
- package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +1 -478
- package/vendor/abseil-cpp/absl/numeric/BUILD.bazel +7 -3
- package/vendor/abseil-cpp/absl/numeric/CMakeLists.txt +2 -0
- package/vendor/abseil-cpp/absl/numeric/bits.h +68 -2
- package/vendor/abseil-cpp/absl/numeric/bits_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/numeric/bits_test.cc +83 -0
- package/vendor/abseil-cpp/absl/numeric/int128.cc +0 -52
- package/vendor/abseil-cpp/absl/numeric/int128_benchmark.cc +14 -15
- package/vendor/abseil-cpp/absl/numeric/int128_test.cc +13 -8
- package/vendor/abseil-cpp/absl/numeric/internal/bits.h +39 -7
- package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +47 -0
- package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +38 -0
- package/vendor/abseil-cpp/absl/profiling/hashtable.cc +124 -0
- package/vendor/abseil-cpp/absl/profiling/hashtable.h +40 -0
- package/vendor/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +462 -0
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +138 -0
- package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
- package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +7 -3
- package/vendor/abseil-cpp/absl/random/BUILD.bazel +6 -4
- package/vendor/abseil-cpp/absl/random/CMakeLists.txt +20 -19
- package/vendor/abseil-cpp/absl/random/benchmarks.cc +16 -23
- package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
- package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +7 -2
- package/vendor/abseil-cpp/absl/random/distributions.h +6 -8
- package/vendor/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
- package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +19 -20
- package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
- package/vendor/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +24 -92
- package/vendor/abseil-cpp/absl/{base/inline_variable_test_b.cc → random/internal/entropy_pool.h} +14 -6
- package/vendor/abseil-cpp/absl/random/internal/entropy_pool_test.cc +119 -0
- package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +6 -7
- package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
- package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +39 -0
- package/vendor/abseil-cpp/absl/random/internal/randen_benchmarks.cc +8 -6
- package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
- package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
- package/vendor/abseil-cpp/absl/random/internal/seed_material.h +5 -5
- package/vendor/abseil-cpp/absl/random/internal/seed_material_test.cc +3 -0
- package/vendor/abseil-cpp/absl/random/mock_distributions_test.cc +5 -4
- package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +8 -10
- package/vendor/abseil-cpp/absl/random/random.h +88 -53
- package/vendor/abseil-cpp/absl/random/seed_sequences.cc +6 -2
- package/vendor/abseil-cpp/absl/status/BUILD.bazel +26 -0
- package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
- package/vendor/abseil-cpp/absl/status/internal/status_internal.h +3 -4
- package/vendor/abseil-cpp/absl/status/internal/status_matchers.cc +4 -3
- package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +194 -32
- package/vendor/abseil-cpp/absl/status/status.cc +4 -8
- package/vendor/abseil-cpp/absl/status/status.h +8 -8
- package/vendor/abseil-cpp/absl/{base/inline_variable_test_a.cc → status/status_benchmark.cc} +20 -10
- package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +65 -0
- package/vendor/abseil-cpp/absl/status/status_payload_printer.h +2 -2
- package/vendor/abseil-cpp/absl/status/statusor.cc +2 -2
- package/vendor/abseil-cpp/absl/status/statusor.h +49 -102
- package/vendor/abseil-cpp/absl/status/statusor_benchmark.cc +480 -0
- package/vendor/abseil-cpp/absl/status/statusor_test.cc +323 -1
- package/vendor/abseil-cpp/absl/strings/BUILD.bazel +70 -34
- package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +6 -3
- package/vendor/abseil-cpp/absl/strings/ascii.cc +9 -9
- package/vendor/abseil-cpp/absl/strings/ascii.h +18 -18
- package/vendor/abseil-cpp/absl/strings/ascii_benchmark.cc +5 -8
- package/vendor/abseil-cpp/absl/strings/charconv.cc +21 -22
- package/vendor/abseil-cpp/absl/strings/charconv.h +5 -5
- package/vendor/abseil-cpp/absl/strings/charconv_benchmark.cc +1 -2
- package/vendor/abseil-cpp/absl/strings/charset_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/cord.cc +54 -58
- package/vendor/abseil-cpp/absl/strings/cord.h +94 -84
- package/vendor/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
- package/vendor/abseil-cpp/absl/strings/cord_analysis.h +3 -3
- package/vendor/abseil-cpp/absl/strings/cord_test.cc +23 -0
- package/vendor/abseil-cpp/absl/strings/cordz_test_helpers.h +4 -5
- package/vendor/abseil-cpp/absl/strings/escaping.cc +130 -149
- package/vendor/abseil-cpp/absl/strings/escaping.h +9 -10
- package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/escaping_test.cc +19 -9
- package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint_test.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +6 -10
- package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
- package/vendor/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +5 -9
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +2 -4
- package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance_benchmark.cc +56 -0
- package/vendor/abseil-cpp/absl/strings/internal/memutil_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/internal/ostringstream_benchmark.cc +1 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
- package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
- package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +1 -6
- package/vendor/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
- package/vendor/abseil-cpp/absl/strings/internal/str_format/extension_test.cc +3 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
- package/vendor/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
- package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +7 -2
- package/vendor/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
- package/vendor/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
- package/vendor/abseil-cpp/absl/strings/internal/utf8.h +15 -1
- package/vendor/abseil-cpp/absl/strings/internal/utf8_test.cc +196 -3
- package/vendor/abseil-cpp/absl/strings/numbers.cc +53 -32
- package/vendor/abseil-cpp/absl/strings/numbers.h +87 -58
- package/vendor/abseil-cpp/absl/strings/numbers_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/numbers_test.cc +634 -120
- package/vendor/abseil-cpp/absl/strings/str_cat.cc +6 -7
- package/vendor/abseil-cpp/absl/strings/str_cat.h +32 -32
- package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +25 -1
- package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +2 -7
- package/vendor/abseil-cpp/absl/strings/str_format.h +18 -18
- package/vendor/abseil-cpp/absl/strings/str_format_test.cc +8 -14
- package/vendor/abseil-cpp/absl/strings/str_join_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/str_replace.cc +3 -3
- package/vendor/abseil-cpp/absl/strings/str_replace.h +6 -6
- package/vendor/abseil-cpp/absl/strings/str_replace_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/str_split.h +2 -2
- package/vendor/abseil-cpp/absl/strings/str_split_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/string_view.cc +4 -9
- package/vendor/abseil-cpp/absl/strings/string_view.h +38 -39
- package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +4 -6
- package/vendor/abseil-cpp/absl/strings/string_view_test.cc +2 -50
- package/vendor/abseil-cpp/absl/strings/strip.h +4 -4
- package/vendor/abseil-cpp/absl/strings/substitute.cc +5 -4
- package/vendor/abseil-cpp/absl/strings/substitute.h +66 -64
- package/vendor/abseil-cpp/absl/strings/substitute_benchmark.cc +158 -0
- package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +6 -1
- package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +2 -1
- package/vendor/abseil-cpp/absl/synchronization/barrier.cc +1 -1
- package/vendor/abseil-cpp/absl/synchronization/barrier_test.cc +3 -3
- package/vendor/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
- package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
- package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_test.cc +6 -5
- package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
- package/vendor/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/thread_pool.h +3 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/waiter_test.cc +12 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/lifetime_test.cc +4 -4
- package/vendor/abseil-cpp/absl/synchronization/mutex.cc +27 -29
- package/vendor/abseil-cpp/absl/synchronization/mutex.h +205 -126
- package/vendor/abseil-cpp/absl/synchronization/mutex_benchmark.cc +13 -31
- package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +183 -169
- package/vendor/abseil-cpp/absl/synchronization/notification.cc +5 -5
- package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
- package/vendor/abseil-cpp/absl/synchronization/notification_test.cc +3 -3
- package/vendor/abseil-cpp/absl/time/BUILD.bazel +9 -1
- package/vendor/abseil-cpp/absl/time/CMakeLists.txt +3 -1
- package/vendor/abseil-cpp/absl/time/civil_time.cc +1 -0
- package/vendor/abseil-cpp/absl/time/civil_time_test.cc +134 -0
- package/vendor/abseil-cpp/absl/time/clock.cc +11 -14
- package/vendor/abseil-cpp/absl/time/duration.cc +14 -9
- package/vendor/abseil-cpp/absl/time/duration_test.cc +6 -7
- package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +14 -3
- package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc +4 -490
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc +515 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h +33 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +41 -4
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +22 -23
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc +1 -488
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coyhaique +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Iran +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +2 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +1 -1
- package/vendor/abseil-cpp/absl/time/time.h +24 -18
- package/vendor/abseil-cpp/absl/time/time_test.cc +26 -0
- package/vendor/abseil-cpp/absl/types/BUILD.bazel +11 -164
- package/vendor/abseil-cpp/absl/types/CMakeLists.txt +23 -167
- package/vendor/abseil-cpp/absl/types/any.h +9 -484
- package/vendor/abseil-cpp/absl/types/optional.h +7 -747
- package/vendor/abseil-cpp/absl/types/span.h +46 -19
- package/vendor/abseil-cpp/absl/types/span_test.cc +27 -0
- package/vendor/abseil-cpp/absl/types/variant.h +5 -784
- package/vendor/abseil-cpp/absl/types/variant_test.cc +43 -2597
- package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -41
- package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +0 -40
- package/vendor/abseil-cpp/absl/utility/utility.h +10 -185
- package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -3
- package/vendor/abseil-cpp/ci/cmake_common.sh +2 -2
- package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +12 -13
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +24 -21
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +12 -12
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +23 -22
- package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +20 -19
- package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
- package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +17 -17
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +10 -10
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +1 -1
- package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +1 -1
- package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +9 -10
- package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +9 -1
- package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +14 -6
- package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +14 -6
- package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +1 -1
- package/vendor/re2/.bazelrc +4 -4
- package/vendor/re2/.bcr/metadata.template.json +16 -0
- package/vendor/re2/.bcr/presubmit.yml +57 -0
- package/vendor/re2/.bcr/source.template.json +5 -0
- package/vendor/re2/.github/bazel.sh +1 -7
- package/vendor/re2/.github/workflows/ci-bazel.yml +5 -5
- package/vendor/re2/.github/workflows/ci-cmake.yml +4 -4
- package/vendor/re2/.github/workflows/ci.yml +5 -6
- package/vendor/re2/.github/workflows/pages.yml +3 -3
- package/vendor/re2/.github/workflows/python.yml +29 -24
- package/vendor/re2/.github/workflows/release-bazel.yml +42 -0
- package/vendor/re2/.github/workflows/release.yml +15 -4
- package/vendor/re2/BUILD.bazel +25 -0
- package/vendor/re2/CMakeLists.txt +100 -85
- package/vendor/re2/CONTRIBUTING.md +0 -1
- package/vendor/re2/MODULE.bazel +10 -10
- package/vendor/re2/Makefile +1 -1
- package/vendor/re2/README.md +259 -0
- package/vendor/re2/python/BUILD.bazel +8 -0
- package/vendor/re2/python/re2.py +1 -1
- package/vendor/re2/python/re2_test.py +6 -0
- package/vendor/re2/python/setup.py +3 -3
- package/vendor/re2/re2/bitmap256.cc +3 -4
- package/vendor/re2/re2/bitstate.cc +15 -10
- package/vendor/re2/re2/dfa.cc +1 -2
- package/vendor/re2/re2/parse.cc +3 -4
- package/vendor/re2/re2/prog.cc +1 -2
- package/vendor/re2/re2/prog.h +1 -0
- package/vendor/re2/re2/re2.cc +5 -0
- package/vendor/re2/re2/re2.h +9 -9
- package/vendor/re2/re2/set.cc +6 -0
- package/vendor/re2/re2/set.h +5 -0
- package/vendor/re2/re2/testing/re2_arg_test.cc +3 -3
- package/vendor/re2/re2/testing/re2_test.cc +8 -0
- package/vendor/re2/re2/testing/set_test.cc +5 -0
- package/vendor/re2/re2/walker-inl.h +1 -1
- package/vendor/abseil-cpp/WORKSPACE +0 -76
- package/vendor/abseil-cpp/WORKSPACE.bzlmod +0 -19
- package/vendor/abseil-cpp/absl/base/inline_variable_test.cc +0 -64
- package/vendor/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
- package/vendor/abseil-cpp/absl/base/internal/inline_variable_testing.h +0 -46
- package/vendor/abseil-cpp/absl/base/internal/invoke.h +0 -241
- package/vendor/abseil-cpp/absl/base/internal/nullability_impl.h +0 -69
- package/vendor/abseil-cpp/absl/base/invoke_test.cc +0 -331
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -148
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -54
- package/vendor/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
- package/vendor/abseil-cpp/absl/random/internal/pool_urbg_test.cc +0 -182
- package/vendor/abseil-cpp/absl/types/any_exception_safety_test.cc +0 -173
- package/vendor/abseil-cpp/absl/types/any_test.cc +0 -778
- package/vendor/abseil-cpp/absl/types/bad_any_cast.cc +0 -64
- package/vendor/abseil-cpp/absl/types/bad_any_cast.h +0 -75
- package/vendor/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
- package/vendor/abseil-cpp/absl/types/bad_optional_access.h +0 -78
- package/vendor/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
- package/vendor/abseil-cpp/absl/types/bad_variant_access.h +0 -82
- package/vendor/abseil-cpp/absl/types/internal/optional.h +0 -352
- package/vendor/abseil-cpp/absl/types/internal/variant.h +0 -1622
- package/vendor/abseil-cpp/absl/types/optional_exception_safety_test.cc +0 -292
- package/vendor/abseil-cpp/absl/types/optional_test.cc +0 -1615
- package/vendor/abseil-cpp/absl/types/variant_benchmark.cc +0 -222
- package/vendor/abseil-cpp/absl/types/variant_exception_safety_test.cc +0 -532
- package/vendor/abseil-cpp/absl/utility/internal/if_constexpr.h +0 -70
- package/vendor/abseil-cpp/absl/utility/internal/if_constexpr_test.cc +0 -79
- package/vendor/abseil-cpp/absl/utility/utility_test.cc +0 -239
- package/vendor/re2/.github/workflows/pr.yml +0 -34
- 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
|
-
|
|
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
|
-
|
|
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 +=
|
|
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 +=
|
|
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 +=
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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 <
|
|
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
|
|
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
|
-
|
|
204
|
-
|
|
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] =
|
|
233
|
+
result[n] = reinterpret_cast<void *>(
|
|
234
|
+
absl::debugging_internal::StripPointerMetadata(prev_return_address));
|
|
239
235
|
if (IS_STACK_FRAMES) {
|
|
240
|
-
|
|
241
|
-
|
|
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**
|
|
71
|
-
const void * /* ucp */,
|
|
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 (
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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,
|
|
66
|
-
const void *ucp,
|
|
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 =
|
|
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
|
|
87
|
-
|
|
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) {
|