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
|
@@ -31,11 +31,53 @@
|
|
|
31
31
|
#ifndef ABSL_DEBUGGING_STACKTRACE_H_
|
|
32
32
|
#define ABSL_DEBUGGING_STACKTRACE_H_
|
|
33
33
|
|
|
34
|
+
#include <stddef.h>
|
|
35
|
+
#include <stdint.h>
|
|
36
|
+
|
|
37
|
+
#include "absl/base/attributes.h"
|
|
34
38
|
#include "absl/base/config.h"
|
|
35
39
|
|
|
36
40
|
namespace absl {
|
|
37
41
|
ABSL_NAMESPACE_BEGIN
|
|
38
42
|
|
|
43
|
+
namespace internal_stacktrace {
|
|
44
|
+
|
|
45
|
+
// Same as `absl::GetStackFrames`, but with an optional `frames` parameter to
|
|
46
|
+
// allow callers to receive the raw stack frame addresses.
|
|
47
|
+
// This is internal for now; use `absl::GetStackFrames()` instead.
|
|
48
|
+
extern int GetStackFrames(void** result, uintptr_t* frames, int* sizes,
|
|
49
|
+
int max_depth, int skip_count);
|
|
50
|
+
|
|
51
|
+
// Same as `absl::GetStackFramesWithContext`, but with an optional `frames`
|
|
52
|
+
// parameter to allow callers to receive a start address for each stack frame.
|
|
53
|
+
// The address may be zero in cases where it cannot be computed.
|
|
54
|
+
//
|
|
55
|
+
// DO NOT use this function without consulting the owners of absl/debuggging.
|
|
56
|
+
// There is NO GUARANTEE on the precise frame addresses returned on any given
|
|
57
|
+
// platform. It is only intended to provide sufficient non-overlapping bounds on
|
|
58
|
+
// the local variables of a stack frame when used in conjunction with the
|
|
59
|
+
// returned frame sizes. The actual pointers may be ABI-dependent, may vary at
|
|
60
|
+
// run time, and are subject to breakage without notice.
|
|
61
|
+
//
|
|
62
|
+
// Implementation note:
|
|
63
|
+
// Currently, we *attempt* to return the Canonical Frame Address (CFA) in DWARF
|
|
64
|
+
// on most platforms. This is the value of the stack pointer just before the
|
|
65
|
+
// 'call' instruction is executed in the caller.
|
|
66
|
+
// Not all platforms and toolchains support this exact address, so this should
|
|
67
|
+
// not be relied on for correctness.
|
|
68
|
+
extern int GetStackFramesWithContext(void** result, uintptr_t* frames,
|
|
69
|
+
int* sizes, int max_depth, int skip_count,
|
|
70
|
+
const void* uc, int* min_dropped_frames);
|
|
71
|
+
|
|
72
|
+
// Same as `absl::DefaultStackUnwinder`, but with an optional `frames` parameter
|
|
73
|
+
// to allow callers to receive the raw stack frame addresses.
|
|
74
|
+
// This is internal for now; do not depend on this externally.
|
|
75
|
+
extern int DefaultStackUnwinder(void** pcs, uintptr_t* frames, int* sizes,
|
|
76
|
+
int max_depth, int skip_count, const void* uc,
|
|
77
|
+
int* min_dropped_frames);
|
|
78
|
+
|
|
79
|
+
} // namespace internal_stacktrace
|
|
80
|
+
|
|
39
81
|
// GetStackFrames()
|
|
40
82
|
//
|
|
41
83
|
// Records program counter values for up to `max_depth` frames, skipping the
|
|
@@ -78,8 +120,13 @@ ABSL_NAMESPACE_BEGIN
|
|
|
78
120
|
//
|
|
79
121
|
// This routine may return fewer stack frame entries than are
|
|
80
122
|
// available. Also note that `result` and `sizes` must both be non-null.
|
|
81
|
-
|
|
82
|
-
|
|
123
|
+
ABSL_ATTRIBUTE_ALWAYS_INLINE inline int GetStackFrames(void** result,
|
|
124
|
+
int* sizes,
|
|
125
|
+
int max_depth,
|
|
126
|
+
int skip_count) {
|
|
127
|
+
return internal_stacktrace::GetStackFrames(result, nullptr, sizes, max_depth,
|
|
128
|
+
skip_count);
|
|
129
|
+
}
|
|
83
130
|
|
|
84
131
|
// GetStackFramesWithContext()
|
|
85
132
|
//
|
|
@@ -102,9 +149,12 @@ extern int GetStackFrames(void** result, int* sizes, int max_depth,
|
|
|
102
149
|
// or other reasons. (This value will be set to `0` if no frames were dropped.)
|
|
103
150
|
// The number of total stack frames is guaranteed to be >= skip_count +
|
|
104
151
|
// max_depth + *min_dropped_frames.
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
152
|
+
ABSL_ATTRIBUTE_ALWAYS_INLINE inline int GetStackFramesWithContext(
|
|
153
|
+
void** result, int* sizes, int max_depth, int skip_count, const void* uc,
|
|
154
|
+
int* min_dropped_frames) {
|
|
155
|
+
return internal_stacktrace::GetStackFramesWithContext(
|
|
156
|
+
result, nullptr, sizes, max_depth, skip_count, uc, min_dropped_frames);
|
|
157
|
+
}
|
|
108
158
|
|
|
109
159
|
// GetStackTrace()
|
|
110
160
|
//
|
|
@@ -225,6 +275,24 @@ namespace debugging_internal {
|
|
|
225
275
|
// working.
|
|
226
276
|
extern bool StackTraceWorksForTest();
|
|
227
277
|
} // namespace debugging_internal
|
|
278
|
+
|
|
279
|
+
namespace internal_stacktrace {
|
|
280
|
+
extern bool ShouldFixUpStack();
|
|
281
|
+
|
|
282
|
+
// Fixes up the stack trace of the current thread, in the first `depth` frames
|
|
283
|
+
// of each buffer. The buffers need to be larger than `depth`, to accommodate
|
|
284
|
+
// any newly inserted elements. `depth` is updated to reflect the new number of
|
|
285
|
+
// elements valid across all the buffers. (It is therefore recommended that all
|
|
286
|
+
// buffer sizes be equal.)
|
|
287
|
+
//
|
|
288
|
+
// The `frames` and `sizes` parameters denote the bounds of the stack frame
|
|
289
|
+
// corresponding to each instruction pointer in the `pcs`.
|
|
290
|
+
// Any elements inside these buffers may be zero or null, in which case that
|
|
291
|
+
// information is assumed to be absent/unavailable.
|
|
292
|
+
extern void FixUpStack(void** pcs, uintptr_t* frames, int* sizes,
|
|
293
|
+
size_t capacity, size_t& depth);
|
|
294
|
+
} // namespace internal_stacktrace
|
|
295
|
+
|
|
228
296
|
ABSL_NAMESPACE_END
|
|
229
297
|
} // namespace absl
|
|
230
298
|
|
|
@@ -14,12 +14,58 @@
|
|
|
14
14
|
|
|
15
15
|
#include "absl/debugging/stacktrace.h"
|
|
16
16
|
|
|
17
|
+
#include <stddef.h>
|
|
18
|
+
#include <stdint.h>
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <cerrno>
|
|
22
|
+
#include <csignal>
|
|
23
|
+
#include <cstring>
|
|
24
|
+
#include <memory>
|
|
25
|
+
|
|
26
|
+
#include "gmock/gmock.h"
|
|
17
27
|
#include "gtest/gtest.h"
|
|
18
|
-
#include "absl/base/
|
|
28
|
+
#include "absl/base/attributes.h"
|
|
29
|
+
#include "absl/base/config.h"
|
|
19
30
|
#include "absl/base/optimization.h"
|
|
31
|
+
#include "absl/types/span.h"
|
|
32
|
+
|
|
33
|
+
static int g_should_fixup_calls = 0;
|
|
34
|
+
static int g_fixup_calls = 0;
|
|
35
|
+
static bool g_enable_fixup = false;
|
|
36
|
+
static uintptr_t g_last_fixup_frame_address = 0;
|
|
37
|
+
|
|
38
|
+
#if ABSL_HAVE_ATTRIBUTE_WEAK
|
|
39
|
+
bool absl::internal_stacktrace::ShouldFixUpStack() {
|
|
40
|
+
++g_should_fixup_calls;
|
|
41
|
+
return g_enable_fixup;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
void absl::internal_stacktrace::FixUpStack(void**, uintptr_t*, int*, size_t,
|
|
45
|
+
size_t&) {
|
|
46
|
+
const void* frame_address = nullptr;
|
|
47
|
+
#if ABSL_HAVE_BUILTIN(__builtin_frame_address)
|
|
48
|
+
frame_address = __builtin_frame_address(0);
|
|
49
|
+
#endif
|
|
50
|
+
g_last_fixup_frame_address = reinterpret_cast<uintptr_t>(frame_address);
|
|
51
|
+
++g_fixup_calls;
|
|
52
|
+
}
|
|
53
|
+
#endif
|
|
20
54
|
|
|
21
55
|
namespace {
|
|
22
56
|
|
|
57
|
+
using ::testing::ContainerEq;
|
|
58
|
+
using ::testing::Contains;
|
|
59
|
+
using ::testing::internal::Cleanup;
|
|
60
|
+
|
|
61
|
+
struct StackTrace {
|
|
62
|
+
static constexpr int kStackCount = 64;
|
|
63
|
+
int depth;
|
|
64
|
+
void* result[kStackCount];
|
|
65
|
+
uintptr_t frames[kStackCount];
|
|
66
|
+
int sizes[kStackCount];
|
|
67
|
+
};
|
|
68
|
+
|
|
23
69
|
// This test is currently only known to pass on Linux x86_64/aarch64.
|
|
24
70
|
#if defined(__linux__) && (defined(__x86_64__) || defined(__aarch64__))
|
|
25
71
|
ABSL_ATTRIBUTE_NOINLINE void Unwind(void* p) {
|
|
@@ -44,4 +90,392 @@ TEST(StackTrace, HugeFrame) {
|
|
|
44
90
|
}
|
|
45
91
|
#endif
|
|
46
92
|
|
|
93
|
+
// This is a separate function to avoid inlining.
|
|
94
|
+
ABSL_ATTRIBUTE_NOINLINE static void FixupNoFixupEquivalenceNoInline() {
|
|
95
|
+
#if !ABSL_HAVE_ATTRIBUTE_WEAK
|
|
96
|
+
GTEST_SKIP() << "Need weak symbol support";
|
|
97
|
+
#endif
|
|
98
|
+
#if defined(__riscv)
|
|
99
|
+
GTEST_SKIP() << "Skipping test on RISC-V due to pre-existing failure";
|
|
100
|
+
#endif
|
|
101
|
+
#if defined(_WIN32)
|
|
102
|
+
// TODO(b/434184677): Add support for fixups on Windows if needed
|
|
103
|
+
GTEST_SKIP() << "Skipping test on Windows due to lack of support for fixups";
|
|
104
|
+
#endif
|
|
105
|
+
bool can_rely_on_frame_pointers = false;
|
|
106
|
+
if (!can_rely_on_frame_pointers) {
|
|
107
|
+
GTEST_SKIP() << "Frame pointers are required, but not guaranteed in OSS";
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// This test is known not to pass on MSVC (due to weak symbols)
|
|
111
|
+
|
|
112
|
+
const Cleanup restore_state([enable_fixup = g_enable_fixup,
|
|
113
|
+
fixup_calls = g_fixup_calls,
|
|
114
|
+
should_fixup_calls = g_should_fixup_calls]() {
|
|
115
|
+
g_enable_fixup = enable_fixup;
|
|
116
|
+
g_fixup_calls = fixup_calls;
|
|
117
|
+
g_should_fixup_calls = should_fixup_calls;
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
constexpr int kSkip = 1; // Skip our own frame, whose return PCs won't match
|
|
121
|
+
constexpr auto kStackCount = 1;
|
|
122
|
+
|
|
123
|
+
StackTrace a;
|
|
124
|
+
StackTrace b;
|
|
125
|
+
|
|
126
|
+
// ==========================================================================
|
|
127
|
+
|
|
128
|
+
g_fixup_calls = 0;
|
|
129
|
+
g_should_fixup_calls = 0;
|
|
130
|
+
a.depth = absl::GetStackTrace(a.result, kStackCount, kSkip);
|
|
131
|
+
g_enable_fixup = !g_enable_fixup;
|
|
132
|
+
b.depth = absl::GetStackTrace(b.result, kStackCount, kSkip);
|
|
133
|
+
EXPECT_THAT(
|
|
134
|
+
absl::MakeSpan(a.result, static_cast<size_t>(a.depth)),
|
|
135
|
+
ContainerEq(absl::MakeSpan(b.result, static_cast<size_t>(b.depth))));
|
|
136
|
+
EXPECT_GT(g_should_fixup_calls, 0);
|
|
137
|
+
EXPECT_GE(g_should_fixup_calls, g_fixup_calls);
|
|
138
|
+
|
|
139
|
+
// ==========================================================================
|
|
140
|
+
|
|
141
|
+
g_fixup_calls = 0;
|
|
142
|
+
g_should_fixup_calls = 0;
|
|
143
|
+
a.depth = absl::GetStackFrames(a.result, a.sizes, kStackCount, kSkip);
|
|
144
|
+
g_enable_fixup = !g_enable_fixup;
|
|
145
|
+
b.depth = absl::GetStackFrames(b.result, b.sizes, kStackCount, kSkip);
|
|
146
|
+
EXPECT_THAT(
|
|
147
|
+
absl::MakeSpan(a.result, static_cast<size_t>(a.depth)),
|
|
148
|
+
ContainerEq(absl::MakeSpan(b.result, static_cast<size_t>(b.depth))));
|
|
149
|
+
EXPECT_THAT(
|
|
150
|
+
absl::MakeSpan(a.sizes, static_cast<size_t>(a.depth)),
|
|
151
|
+
ContainerEq(absl::MakeSpan(b.sizes, static_cast<size_t>(b.depth))));
|
|
152
|
+
EXPECT_GT(g_should_fixup_calls, 0);
|
|
153
|
+
EXPECT_GE(g_should_fixup_calls, g_fixup_calls);
|
|
154
|
+
|
|
155
|
+
// ==========================================================================
|
|
156
|
+
|
|
157
|
+
g_fixup_calls = 0;
|
|
158
|
+
g_should_fixup_calls = 0;
|
|
159
|
+
a.depth = absl::GetStackTraceWithContext(a.result, kStackCount, kSkip,
|
|
160
|
+
nullptr, nullptr);
|
|
161
|
+
g_enable_fixup = !g_enable_fixup;
|
|
162
|
+
b.depth = absl::GetStackTraceWithContext(b.result, kStackCount, kSkip,
|
|
163
|
+
nullptr, nullptr);
|
|
164
|
+
EXPECT_THAT(
|
|
165
|
+
absl::MakeSpan(a.result, static_cast<size_t>(a.depth)),
|
|
166
|
+
ContainerEq(absl::MakeSpan(b.result, static_cast<size_t>(b.depth))));
|
|
167
|
+
EXPECT_GT(g_should_fixup_calls, 0);
|
|
168
|
+
EXPECT_GE(g_should_fixup_calls, g_fixup_calls);
|
|
169
|
+
|
|
170
|
+
// ==========================================================================
|
|
171
|
+
|
|
172
|
+
g_fixup_calls = 0;
|
|
173
|
+
g_should_fixup_calls = 0;
|
|
174
|
+
a.depth = absl::GetStackFramesWithContext(a.result, a.sizes, kStackCount,
|
|
175
|
+
kSkip, nullptr, nullptr);
|
|
176
|
+
g_enable_fixup = !g_enable_fixup;
|
|
177
|
+
b.depth = absl::GetStackFramesWithContext(b.result, b.sizes, kStackCount,
|
|
178
|
+
kSkip, nullptr, nullptr);
|
|
179
|
+
EXPECT_THAT(
|
|
180
|
+
absl::MakeSpan(a.result, static_cast<size_t>(a.depth)),
|
|
181
|
+
ContainerEq(absl::MakeSpan(b.result, static_cast<size_t>(b.depth))));
|
|
182
|
+
EXPECT_THAT(
|
|
183
|
+
absl::MakeSpan(a.sizes, static_cast<size_t>(a.depth)),
|
|
184
|
+
ContainerEq(absl::MakeSpan(b.sizes, static_cast<size_t>(b.depth))));
|
|
185
|
+
EXPECT_GT(g_should_fixup_calls, 0);
|
|
186
|
+
EXPECT_GE(g_should_fixup_calls, g_fixup_calls);
|
|
187
|
+
|
|
188
|
+
// ==========================================================================
|
|
189
|
+
|
|
190
|
+
g_fixup_calls = 0;
|
|
191
|
+
g_should_fixup_calls = 0;
|
|
192
|
+
a.depth = absl::internal_stacktrace::GetStackFrames(
|
|
193
|
+
a.result, a.frames, a.sizes, kStackCount, kSkip);
|
|
194
|
+
g_enable_fixup = !g_enable_fixup;
|
|
195
|
+
b.depth = absl::internal_stacktrace::GetStackFrames(
|
|
196
|
+
b.result, b.frames, b.sizes, kStackCount, kSkip);
|
|
197
|
+
EXPECT_THAT(
|
|
198
|
+
absl::MakeSpan(a.result, static_cast<size_t>(a.depth)),
|
|
199
|
+
ContainerEq(absl::MakeSpan(b.result, static_cast<size_t>(b.depth))));
|
|
200
|
+
EXPECT_THAT(
|
|
201
|
+
absl::MakeSpan(a.sizes, static_cast<size_t>(a.depth)),
|
|
202
|
+
ContainerEq(absl::MakeSpan(b.sizes, static_cast<size_t>(b.depth))));
|
|
203
|
+
EXPECT_THAT(
|
|
204
|
+
absl::MakeSpan(a.frames, static_cast<size_t>(a.depth)),
|
|
205
|
+
ContainerEq(absl::MakeSpan(b.frames, static_cast<size_t>(b.depth))));
|
|
206
|
+
EXPECT_GT(g_should_fixup_calls, 0);
|
|
207
|
+
EXPECT_GE(g_should_fixup_calls, g_fixup_calls);
|
|
208
|
+
|
|
209
|
+
// ==========================================================================
|
|
210
|
+
|
|
211
|
+
g_fixup_calls = 0;
|
|
212
|
+
g_should_fixup_calls = 0;
|
|
213
|
+
a.depth = absl::internal_stacktrace::GetStackFramesWithContext(
|
|
214
|
+
a.result, a.frames, a.sizes, kStackCount, kSkip, nullptr, nullptr);
|
|
215
|
+
g_enable_fixup = !g_enable_fixup;
|
|
216
|
+
b.depth = absl::internal_stacktrace::GetStackFramesWithContext(
|
|
217
|
+
b.result, b.frames, b.sizes, kStackCount, kSkip, nullptr, nullptr);
|
|
218
|
+
EXPECT_THAT(
|
|
219
|
+
absl::MakeSpan(a.result, static_cast<size_t>(a.depth)),
|
|
220
|
+
ContainerEq(absl::MakeSpan(b.result, static_cast<size_t>(b.depth))));
|
|
221
|
+
EXPECT_THAT(
|
|
222
|
+
absl::MakeSpan(a.sizes, static_cast<size_t>(a.depth)),
|
|
223
|
+
ContainerEq(absl::MakeSpan(b.sizes, static_cast<size_t>(b.depth))));
|
|
224
|
+
EXPECT_THAT(
|
|
225
|
+
absl::MakeSpan(a.frames, static_cast<size_t>(a.depth)),
|
|
226
|
+
ContainerEq(absl::MakeSpan(b.frames, static_cast<size_t>(b.depth))));
|
|
227
|
+
EXPECT_GT(g_should_fixup_calls, 0);
|
|
228
|
+
EXPECT_GE(g_should_fixup_calls, g_fixup_calls);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
TEST(StackTrace, FixupNoFixupEquivalence) { FixupNoFixupEquivalenceNoInline(); }
|
|
232
|
+
|
|
233
|
+
TEST(StackTrace, FixupLowStackUsage) {
|
|
234
|
+
#if !ABSL_HAVE_ATTRIBUTE_WEAK
|
|
235
|
+
GTEST_SKIP() << "Skipping test on MSVC due to weak symbols";
|
|
236
|
+
#endif
|
|
237
|
+
#if defined(_WIN32)
|
|
238
|
+
// TODO(b/434184677): Add support for fixups on Windows if needed
|
|
239
|
+
GTEST_SKIP() << "Skipping test on Windows due to lack of support for fixups";
|
|
240
|
+
#endif
|
|
241
|
+
|
|
242
|
+
const Cleanup restore_state([enable_fixup = g_enable_fixup,
|
|
243
|
+
fixup_calls = g_fixup_calls,
|
|
244
|
+
should_fixup_calls = g_should_fixup_calls]() {
|
|
245
|
+
g_enable_fixup = enable_fixup;
|
|
246
|
+
g_fixup_calls = fixup_calls;
|
|
247
|
+
g_should_fixup_calls = should_fixup_calls;
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
g_enable_fixup = true;
|
|
251
|
+
|
|
252
|
+
// Request a ton of stack frames, regardless of how many are actually used.
|
|
253
|
+
// It's fine to request more frames than we have, since functions preallocate
|
|
254
|
+
// memory before discovering how high the stack really is, and we're really
|
|
255
|
+
// just trying to make sure the preallocations don't overflow the stack.
|
|
256
|
+
//
|
|
257
|
+
// Note that we loop in order to cover all sides of any branches in the
|
|
258
|
+
// implementation that switch allocation behavior (e.g., from stack to heap)
|
|
259
|
+
// and to ensure that no sides allocate too much stack space.
|
|
260
|
+
constexpr size_t kPageSize = 4096;
|
|
261
|
+
for (size_t depth = 2; depth < (1 << 20); depth += depth / 2) {
|
|
262
|
+
const auto stack = std::make_unique<void*[]>(depth);
|
|
263
|
+
const auto frames = std::make_unique<int[]>(depth);
|
|
264
|
+
|
|
265
|
+
absl::GetStackFrames(stack.get(), frames.get(), static_cast<int>(depth), 0);
|
|
266
|
+
const void* frame_address = nullptr;
|
|
267
|
+
#if ABSL_HAVE_BUILTIN(__builtin_frame_address)
|
|
268
|
+
frame_address = __builtin_frame_address(0);
|
|
269
|
+
#endif
|
|
270
|
+
size_t stack_usage =
|
|
271
|
+
reinterpret_cast<uintptr_t>(frame_address) - g_last_fixup_frame_address;
|
|
272
|
+
EXPECT_LT(stack_usage, kPageSize);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
TEST(StackTrace, CustomUnwinderPerformsFixup) {
|
|
277
|
+
#if !ABSL_HAVE_ATTRIBUTE_WEAK
|
|
278
|
+
GTEST_SKIP() << "Need weak symbol support";
|
|
279
|
+
#endif
|
|
280
|
+
#if defined(_WIN32)
|
|
281
|
+
// TODO(b/434184677): Add support for fixups on Windows if needed
|
|
282
|
+
GTEST_SKIP() << "Skipping test on Windows due to lack of support for fixups";
|
|
283
|
+
#endif
|
|
284
|
+
|
|
285
|
+
constexpr int kSkip = 1; // Skip our own frame, whose return PCs won't match
|
|
286
|
+
constexpr auto kStackCount = 1;
|
|
287
|
+
|
|
288
|
+
absl::SetStackUnwinder(absl::DefaultStackUnwinder);
|
|
289
|
+
const Cleanup restore_state([enable_fixup = g_enable_fixup,
|
|
290
|
+
fixup_calls = g_fixup_calls,
|
|
291
|
+
should_fixup_calls = g_should_fixup_calls]() {
|
|
292
|
+
absl::SetStackUnwinder(nullptr);
|
|
293
|
+
g_enable_fixup = enable_fixup;
|
|
294
|
+
g_fixup_calls = fixup_calls;
|
|
295
|
+
g_should_fixup_calls = should_fixup_calls;
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
StackTrace trace;
|
|
299
|
+
|
|
300
|
+
g_enable_fixup = true;
|
|
301
|
+
g_should_fixup_calls = 0;
|
|
302
|
+
g_fixup_calls = 0;
|
|
303
|
+
absl::GetStackTrace(trace.result, kSkip, kStackCount);
|
|
304
|
+
EXPECT_GT(g_should_fixup_calls, 0);
|
|
305
|
+
EXPECT_GT(g_fixup_calls, 0);
|
|
306
|
+
|
|
307
|
+
g_enable_fixup = true;
|
|
308
|
+
g_should_fixup_calls = 0;
|
|
309
|
+
g_fixup_calls = 0;
|
|
310
|
+
absl::GetStackFrames(trace.result, trace.sizes, kSkip, kStackCount);
|
|
311
|
+
EXPECT_GT(g_should_fixup_calls, 0);
|
|
312
|
+
EXPECT_GT(g_fixup_calls, 0);
|
|
313
|
+
|
|
314
|
+
g_enable_fixup = true;
|
|
315
|
+
g_should_fixup_calls = 0;
|
|
316
|
+
g_fixup_calls = 0;
|
|
317
|
+
absl::GetStackTraceWithContext(trace.result, kSkip, kStackCount, nullptr,
|
|
318
|
+
nullptr);
|
|
319
|
+
EXPECT_GT(g_should_fixup_calls, 0);
|
|
320
|
+
EXPECT_GT(g_fixup_calls, 0);
|
|
321
|
+
|
|
322
|
+
g_enable_fixup = true;
|
|
323
|
+
g_should_fixup_calls = 0;
|
|
324
|
+
g_fixup_calls = 0;
|
|
325
|
+
absl::GetStackFramesWithContext(trace.result, trace.sizes, kSkip, kStackCount,
|
|
326
|
+
nullptr, nullptr);
|
|
327
|
+
EXPECT_GT(g_should_fixup_calls, 0);
|
|
328
|
+
EXPECT_GT(g_fixup_calls, 0);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
#if ABSL_HAVE_BUILTIN(__builtin_frame_address)
|
|
332
|
+
struct FrameInfo {
|
|
333
|
+
const void* return_address;
|
|
334
|
+
uintptr_t frame_address;
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
// Returns the canonical frame address and return address for the current stack
|
|
338
|
+
// frame, while capturing the stack trace at the same time.
|
|
339
|
+
// This performs any platform-specific adjustments necessary to convert from the
|
|
340
|
+
// compiler built-ins to the expected API outputs.
|
|
341
|
+
ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS // May read random elements from stack.
|
|
342
|
+
ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY // May read random elements from stack.
|
|
343
|
+
ABSL_ATTRIBUTE_NOINLINE static FrameInfo
|
|
344
|
+
CaptureBacktraceNoInline(StackTrace& backtrace) {
|
|
345
|
+
FrameInfo result;
|
|
346
|
+
result.return_address = __builtin_return_address(0);
|
|
347
|
+
// Large enough to cover all realistic slots the return address could be in
|
|
348
|
+
const int kMaxReturnAddressIndex = 5;
|
|
349
|
+
void* const* bfa = static_cast<void* const*>(__builtin_frame_address(0));
|
|
350
|
+
backtrace.depth = absl::internal_stacktrace::GetStackFramesWithContext(
|
|
351
|
+
backtrace.result, backtrace.frames, backtrace.sizes,
|
|
352
|
+
StackTrace::kStackCount, /*skip_count=*/0,
|
|
353
|
+
/*uc=*/nullptr, /*min_dropped_frames=*/nullptr);
|
|
354
|
+
// Make sure the return address is at a reasonable location in the frame
|
|
355
|
+
ptrdiff_t i;
|
|
356
|
+
for (i = 0; i < kMaxReturnAddressIndex; ++i) {
|
|
357
|
+
// Avoid std::find() here, since it lacks no-sanitize attributes.
|
|
358
|
+
if (bfa[i] == result.return_address) {
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
result.frame_address =
|
|
363
|
+
i < kMaxReturnAddressIndex
|
|
364
|
+
? reinterpret_cast<uintptr_t>(
|
|
365
|
+
bfa + i + 1 /* get the Canonical Frame Address (CFA) */)
|
|
366
|
+
: 0;
|
|
367
|
+
return result;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
TEST(StackTrace, CanonicalFrameAddresses) {
|
|
371
|
+
// Now capture a stack trace and verify that the return addresses and frame
|
|
372
|
+
// addresses line up for one frame.
|
|
373
|
+
StackTrace backtrace;
|
|
374
|
+
const auto [return_address, frame_address] =
|
|
375
|
+
CaptureBacktraceNoInline(backtrace);
|
|
376
|
+
auto return_addresses = absl::MakeSpan(backtrace.result)
|
|
377
|
+
.subspan(0, static_cast<size_t>(backtrace.depth));
|
|
378
|
+
auto frame_addresses = absl::MakeSpan(backtrace.frames)
|
|
379
|
+
.subspan(0, static_cast<size_t>(backtrace.depth));
|
|
380
|
+
|
|
381
|
+
// Many platforms don't support this by default.
|
|
382
|
+
bool support_is_expected = false;
|
|
383
|
+
|
|
384
|
+
if (support_is_expected) {
|
|
385
|
+
// If all zeros were returned, that is valid per the function's contract.
|
|
386
|
+
// It just means we don't support returning frame addresses on this
|
|
387
|
+
// platform.
|
|
388
|
+
bool supported = static_cast<size_t>(std::count(frame_addresses.begin(),
|
|
389
|
+
frame_addresses.end(), 0)) <
|
|
390
|
+
frame_addresses.size();
|
|
391
|
+
EXPECT_TRUE(supported);
|
|
392
|
+
if (supported) {
|
|
393
|
+
ASSERT_TRUE(frame_address)
|
|
394
|
+
<< "unable to obtain frame address corresponding to return address";
|
|
395
|
+
EXPECT_THAT(return_addresses, Contains(return_address).Times(1));
|
|
396
|
+
EXPECT_THAT(frame_addresses, Contains(frame_address).Times(1));
|
|
397
|
+
ptrdiff_t ifound = std::find(return_addresses.begin(),
|
|
398
|
+
return_addresses.end(), return_address) -
|
|
399
|
+
return_addresses.begin();
|
|
400
|
+
// Make sure we found the frame in the first place.
|
|
401
|
+
ASSERT_LT(ifound, backtrace.depth);
|
|
402
|
+
// Make sure the frame address actually corresponds to the return
|
|
403
|
+
// address.
|
|
404
|
+
EXPECT_EQ(frame_addresses[static_cast<size_t>(ifound)], frame_address);
|
|
405
|
+
// Make sure the addresses only appear once.
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
#endif
|
|
410
|
+
|
|
411
|
+
// This test is Linux specific.
|
|
412
|
+
#if defined(__linux__)
|
|
413
|
+
const void* g_return_address = nullptr;
|
|
414
|
+
bool g_sigusr2_raised = false;
|
|
415
|
+
|
|
416
|
+
void SigUsr2Handler(int, siginfo_t*, void* uc) {
|
|
417
|
+
// Many platforms don't support this by default.
|
|
418
|
+
bool support_is_expected = false;
|
|
419
|
+
constexpr int kMaxStackDepth = 64;
|
|
420
|
+
void* result[kMaxStackDepth];
|
|
421
|
+
int depth =
|
|
422
|
+
absl::GetStackTraceWithContext(result, kMaxStackDepth, 0, uc, nullptr);
|
|
423
|
+
// Verify we can unwind past the nested signal handlers.
|
|
424
|
+
if (support_is_expected) {
|
|
425
|
+
EXPECT_THAT(absl::MakeSpan(result, static_cast<size_t>(depth)),
|
|
426
|
+
Contains(g_return_address).Times(1));
|
|
427
|
+
}
|
|
428
|
+
depth = absl::GetStackTrace(result, kMaxStackDepth, 0);
|
|
429
|
+
if (support_is_expected) {
|
|
430
|
+
EXPECT_THAT(absl::MakeSpan(result, static_cast<size_t>(depth)),
|
|
431
|
+
Contains(g_return_address).Times(1));
|
|
432
|
+
}
|
|
433
|
+
g_sigusr2_raised = true;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
void SigUsr1Handler(int, siginfo_t*, void*) {
|
|
437
|
+
raise(SIGUSR2);
|
|
438
|
+
ABSL_BLOCK_TAIL_CALL_OPTIMIZATION();
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
ABSL_ATTRIBUTE_NOINLINE void RaiseSignal() {
|
|
442
|
+
g_return_address = __builtin_return_address(0);
|
|
443
|
+
raise(SIGUSR1);
|
|
444
|
+
ABSL_BLOCK_TAIL_CALL_OPTIMIZATION();
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
ABSL_ATTRIBUTE_NOINLINE void TestNestedSignal() {
|
|
448
|
+
constexpr size_t kAltstackSize = 1 << 14;
|
|
449
|
+
// Allocate altstack on regular stack to make sure it'll have a higher
|
|
450
|
+
// address than some of the regular stack frames.
|
|
451
|
+
char space[kAltstackSize];
|
|
452
|
+
stack_t altstack;
|
|
453
|
+
stack_t old_stack;
|
|
454
|
+
altstack.ss_sp = space;
|
|
455
|
+
altstack.ss_size = kAltstackSize;
|
|
456
|
+
altstack.ss_flags = 0;
|
|
457
|
+
ASSERT_EQ(sigaltstack(&altstack, &old_stack), 0) << strerror(errno);
|
|
458
|
+
struct sigaction act;
|
|
459
|
+
struct sigaction oldusr1act;
|
|
460
|
+
struct sigaction oldusr2act;
|
|
461
|
+
act.sa_sigaction = SigUsr1Handler;
|
|
462
|
+
act.sa_flags = SA_SIGINFO | SA_ONSTACK;
|
|
463
|
+
sigemptyset(&act.sa_mask);
|
|
464
|
+
ASSERT_EQ(sigaction(SIGUSR1, &act, &oldusr1act), 0) << strerror(errno);
|
|
465
|
+
act.sa_sigaction = SigUsr2Handler;
|
|
466
|
+
ASSERT_EQ(sigaction(SIGUSR2, &act, &oldusr2act), 0) << strerror(errno);
|
|
467
|
+
RaiseSignal();
|
|
468
|
+
ASSERT_EQ(sigaltstack(&old_stack, nullptr), 0) << strerror(errno);
|
|
469
|
+
ASSERT_EQ(sigaction(SIGUSR1, &oldusr1act, nullptr), 0) << strerror(errno);
|
|
470
|
+
ASSERT_EQ(sigaction(SIGUSR2, &oldusr2act, nullptr), 0) << strerror(errno);
|
|
471
|
+
ABSL_BLOCK_TAIL_CALL_OPTIMIZATION();
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
TEST(StackTrace, NestedSignal) {
|
|
475
|
+
// Verify we can unwind past the nested signal handlers.
|
|
476
|
+
TestNestedSignal();
|
|
477
|
+
EXPECT_TRUE(g_sigusr2_raised);
|
|
478
|
+
}
|
|
479
|
+
#endif
|
|
480
|
+
|
|
47
481
|
} // namespace
|