re2 1.23.0 → 1.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/binding.gyp +3 -2
- package/package.json +5 -5
- package/vendor/abseil-cpp/CMake/AbseilDll.cmake +25 -4
- package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +6 -1
- package/vendor/abseil-cpp/CMakeLists.txt +2 -2
- package/vendor/abseil-cpp/MODULE.bazel +2 -2
- package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +0 -1
- package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +0 -2
- package/vendor/abseil-cpp/absl/algorithm/container.h +191 -140
- package/vendor/abseil-cpp/absl/algorithm/container_test.cc +818 -0
- package/vendor/abseil-cpp/absl/base/BUILD.bazel +44 -5
- package/vendor/abseil-cpp/absl/base/CMakeLists.txt +42 -3
- package/vendor/abseil-cpp/absl/base/attributes.h +5 -1
- package/vendor/abseil-cpp/absl/base/call_once_test.cc +10 -10
- package/vendor/abseil-cpp/absl/base/casts.cc +61 -0
- package/vendor/abseil-cpp/absl/base/casts.h +128 -2
- package/vendor/abseil-cpp/absl/base/casts_test.cc +151 -0
- package/vendor/abseil-cpp/absl/base/config.h +13 -37
- package/vendor/abseil-cpp/absl/base/internal/dynamic_annotations.h +1 -1
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +4 -0
- package/vendor/abseil-cpp/absl/base/internal/nullability_traits.h +71 -0
- package/vendor/abseil-cpp/absl/base/internal/nullability_traits_test.cc +98 -0
- package/vendor/abseil-cpp/absl/base/internal/raw_logging.cc +3 -4
- package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +13 -7
- package/vendor/abseil-cpp/absl/base/internal/spinlock.h +16 -11
- package/vendor/abseil-cpp/absl/base/internal/strerror_test.cc +2 -1
- package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +0 -9
- package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +0 -6
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -1
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +1 -1
- package/vendor/abseil-cpp/absl/base/macros.h +40 -17
- package/vendor/abseil-cpp/absl/base/nullability.h +1 -1
- package/vendor/abseil-cpp/absl/base/optimization.h +1 -3
- package/vendor/abseil-cpp/absl/base/options.h +1 -27
- package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +5 -8
- package/vendor/abseil-cpp/absl/cleanup/cleanup.h +4 -0
- package/vendor/abseil-cpp/absl/container/BUILD.bazel +195 -2
- package/vendor/abseil-cpp/absl/container/CMakeLists.txt +136 -2
- package/vendor/abseil-cpp/absl/container/btree_map.h +56 -6
- package/vendor/abseil-cpp/absl/container/btree_set.h +52 -6
- package/vendor/abseil-cpp/absl/container/btree_test.cc +107 -1
- package/vendor/abseil-cpp/absl/container/chunked_queue.h +755 -0
- package/vendor/abseil-cpp/absl/container/chunked_queue_benchmark.cc +386 -0
- package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +768 -0
- package/vendor/abseil-cpp/absl/container/fixed_array.h +4 -6
- package/vendor/abseil-cpp/absl/container/flat_hash_map.h +16 -6
- package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +1 -2
- package/vendor/abseil-cpp/absl/container/flat_hash_set.h +16 -6
- package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +0 -2
- package/vendor/abseil-cpp/absl/container/inlined_vector.h +12 -4
- package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +21 -0
- package/vendor/abseil-cpp/absl/container/internal/btree_container.h +14 -5
- package/vendor/abseil-cpp/absl/container/internal/chunked_queue.h +173 -0
- package/vendor/abseil-cpp/absl/container/internal/common.h +51 -0
- package/vendor/abseil-cpp/absl/container/internal/container_memory.h +7 -1
- package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +11 -0
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +0 -2
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +1 -2
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +0 -14
- package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +11 -8
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +3 -4
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +23 -6
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +31 -15
- package/vendor/abseil-cpp/absl/container/internal/heterogeneous_lookup_testing.h +80 -0
- package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +4 -12
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +35 -10
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +149 -23
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +120 -126
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +4 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +8 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +14 -59
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +111 -22
- package/vendor/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h +53 -112
- package/vendor/abseil-cpp/absl/container/internal/unordered_map_lookup_test.h +10 -15
- package/vendor/abseil-cpp/absl/container/internal/unordered_map_members_test.h +3 -3
- package/vendor/abseil-cpp/absl/container/internal/unordered_map_modifiers_test.h +45 -61
- package/vendor/abseil-cpp/absl/container/internal/unordered_set_constructor_test.h +53 -112
- package/vendor/abseil-cpp/absl/container/internal/unordered_set_lookup_test.h +6 -9
- package/vendor/abseil-cpp/absl/container/internal/unordered_set_members_test.h +3 -3
- package/vendor/abseil-cpp/absl/container/internal/unordered_set_modifiers_test.h +25 -31
- package/vendor/abseil-cpp/absl/container/linked_hash_map.h +666 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_map_benchmark.cc +140 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_map_test.cc +987 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_set.h +527 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_set_benchmark.cc +84 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_set_test.cc +947 -0
- package/vendor/abseil-cpp/absl/container/node_hash_map.h +17 -6
- package/vendor/abseil-cpp/absl/container/node_hash_set.h +16 -5
- package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +1 -2
- package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +79 -0
- package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +79 -0
- package/vendor/abseil-cpp/absl/copts/copts.py +17 -4
- package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +67 -13
- package/vendor/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +4 -2
- package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +31 -0
- package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +34 -0
- package/vendor/abseil-cpp/absl/debugging/failure_signal_handler.cc +2 -2
- package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +118 -0
- package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +71 -0
- package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +97 -0
- package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +2 -2
- package/vendor/abseil-cpp/absl/debugging/internal/elf_mem_image.h +4 -4
- package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +4 -0
- package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +7 -0
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +1 -1
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +0 -7
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +3 -2
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +2 -1
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
- package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +2 -2
- package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +35 -67
- package/vendor/abseil-cpp/absl/debugging/stacktrace.h +3 -0
- package/vendor/abseil-cpp/absl/debugging/stacktrace_benchmark.cc +24 -1
- package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +39 -15
- package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +4 -17
- package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +25 -40
- package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +2 -4
- package/vendor/abseil-cpp/absl/flags/BUILD.bazel +1 -0
- package/vendor/abseil-cpp/absl/flags/declare.h +9 -0
- package/vendor/abseil-cpp/absl/flags/flag.h +2 -1
- package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +1 -1
- package/vendor/abseil-cpp/absl/flags/internal/flag.cc +3 -2
- package/vendor/abseil-cpp/absl/flags/marshalling.cc +1 -16
- package/vendor/abseil-cpp/absl/flags/parse.cc +4 -2
- package/vendor/abseil-cpp/absl/flags/parse_test.cc +1 -1
- package/vendor/abseil-cpp/absl/flags/reflection.cc +4 -3
- package/vendor/abseil-cpp/absl/functional/BUILD.bazel +4 -0
- package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +4 -0
- package/vendor/abseil-cpp/absl/functional/any_invocable.h +3 -1
- package/vendor/abseil-cpp/absl/functional/function_ref.h +125 -20
- package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +122 -9
- package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +13 -2
- package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +42 -4
- package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +11 -0
- package/vendor/abseil-cpp/absl/hash/hash_test.cc +5 -2
- package/vendor/abseil-cpp/absl/hash/internal/hash.cc +184 -53
- package/vendor/abseil-cpp/absl/hash/internal/hash.h +116 -10
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +43 -4
- package/vendor/abseil-cpp/absl/log/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/log/CMakeLists.txt +35 -1
- package/vendor/abseil-cpp/absl/log/check_test_impl.inc +59 -4
- package/vendor/abseil-cpp/absl/log/die_if_null.cc +3 -1
- package/vendor/abseil-cpp/absl/log/die_if_null.h +24 -3
- package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +31 -1
- package/vendor/abseil-cpp/absl/log/internal/check_impl.h +2 -1
- package/vendor/abseil-cpp/absl/log/internal/check_op.cc +3 -1
- package/vendor/abseil-cpp/absl/log/internal/check_op.h +44 -18
- package/vendor/abseil-cpp/absl/log/internal/conditions.h +38 -35
- package/vendor/abseil-cpp/absl/log/internal/container.h +312 -0
- package/vendor/abseil-cpp/absl/log/internal/container_test.cc +254 -0
- package/vendor/abseil-cpp/absl/log/internal/log_impl.h +108 -110
- package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -2
- package/vendor/abseil-cpp/absl/log/internal/log_message.h +5 -1
- package/vendor/abseil-cpp/absl/log/internal/strip.h +30 -31
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +19 -19
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +0 -1
- package/vendor/abseil-cpp/absl/log/log.h +2 -2
- package/vendor/abseil-cpp/absl/meta/BUILD.bazel +51 -0
- package/vendor/abseil-cpp/absl/meta/CMakeLists.txt +46 -0
- package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing.h +73 -0
- package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing_test.cc +40 -0
- package/vendor/abseil-cpp/absl/meta/internal/requires.h +67 -0
- package/vendor/abseil-cpp/absl/meta/internal/requires_test.cc +66 -0
- package/vendor/abseil-cpp/absl/meta/type_traits.h +42 -1
- package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +14 -0
- package/vendor/abseil-cpp/absl/numeric/int128.h +41 -21
- package/vendor/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +16 -22
- package/vendor/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +5 -7
- package/vendor/abseil-cpp/absl/numeric/int128_test.cc +52 -5
- package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +1 -0
- package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +1 -0
- package/vendor/abseil-cpp/absl/profiling/hashtable.cc +18 -7
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +1 -0
- package/vendor/abseil-cpp/absl/random/internal/fastmath_test.cc +3 -5
- package/vendor/abseil-cpp/absl/random/internal/platform.h +0 -13
- package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +0 -1
- package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +1 -27
- package/vendor/abseil-cpp/absl/status/BUILD.bazel +17 -0
- package/vendor/abseil-cpp/absl/status/CMakeLists.txt +16 -0
- package/vendor/abseil-cpp/absl/status/internal/status_internal.h +4 -2
- package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +2 -2
- package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +2 -1
- package/vendor/abseil-cpp/absl/status/status.cc +4 -0
- package/vendor/abseil-cpp/absl/status/status.h +5 -0
- package/vendor/abseil-cpp/absl/status/status_matchers.h +48 -0
- package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +27 -0
- package/vendor/abseil-cpp/absl/status/status_test.cc +1 -0
- package/vendor/abseil-cpp/absl/status/statusor.h +1 -1
- package/vendor/abseil-cpp/absl/strings/BUILD.bazel +101 -21
- package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +99 -5
- package/vendor/abseil-cpp/absl/strings/ascii.h +9 -4
- package/vendor/abseil-cpp/absl/strings/cord.cc +15 -10
- package/vendor/abseil-cpp/absl/strings/cord.h +1 -1
- package/vendor/abseil-cpp/absl/strings/escaping.cc +126 -94
- package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
- package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite_test.cc +95 -0
- package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +2 -0
- package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree_test.cc +8 -8
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +24 -18
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +10 -16
- package/vendor/abseil-cpp/absl/strings/internal/escaping.h +9 -7
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer.cc +107 -0
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer.h +115 -0
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +423 -0
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +685 -0
- package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +0 -12
- package/vendor/abseil-cpp/absl/strings/internal/str_format/checker.h +2 -4
- package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +21 -7
- package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +495 -8
- package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +18 -15
- package/vendor/abseil-cpp/absl/strings/numbers.cc +71 -8
- package/vendor/abseil-cpp/absl/strings/numbers.h +25 -12
- package/vendor/abseil-cpp/absl/strings/numbers_test.cc +70 -0
- package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +194 -0
- package/vendor/abseil-cpp/absl/strings/resize_and_overwrite_test.cc +154 -0
- package/vendor/abseil-cpp/absl/strings/str_cat.cc +96 -91
- package/vendor/abseil-cpp/absl/strings/str_cat.h +17 -12
- package/vendor/abseil-cpp/absl/strings/str_format_test.cc +4 -4
- package/vendor/abseil-cpp/absl/strings/str_split.h +1 -1
- package/vendor/abseil-cpp/absl/strings/str_split_test.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/string_view.h +8 -718
- package/vendor/abseil-cpp/absl/strings/string_view_test.cc +1 -1265
- package/vendor/abseil-cpp/absl/strings/substitute.cc +24 -24
- package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +2 -3
- package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +1 -0
- package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -2
- package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc +15 -5
- package/vendor/abseil-cpp/absl/synchronization/mutex.cc +2 -1
- package/vendor/abseil-cpp/absl/synchronization/mutex.h +47 -23
- package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
- package/vendor/abseil-cpp/absl/time/CMakeLists.txt +2 -0
- package/vendor/abseil-cpp/absl/time/civil_time_benchmark.cc +1 -2
- package/vendor/abseil-cpp/absl/time/civil_time_test.cc +58 -103
- package/vendor/abseil-cpp/absl/time/clock.cc +18 -16
- package/vendor/abseil-cpp/absl/time/clock_test.cc +2 -2
- package/vendor/abseil-cpp/absl/time/duration_benchmark.cc +144 -0
- package/vendor/abseil-cpp/absl/time/duration_test.cc +26 -29
- package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +7 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +4 -2
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +6 -103
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +186 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/iso3166.tab +9 -9
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +12 -12
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +47 -47
- package/vendor/abseil-cpp/absl/time/time.cc +4 -4
- package/vendor/abseil-cpp/absl/time/time.h +10 -10
- package/vendor/abseil-cpp/absl/time/time_test.cc +1 -0
- package/vendor/abseil-cpp/absl/types/compare.h +62 -61
- package/vendor/abseil-cpp/absl/types/compare_test.cc +3 -3
- package/vendor/abseil-cpp/absl/types/internal/span.h +1 -0
- package/vendor/abseil-cpp/absl/types/optional.h +2 -2
- package/vendor/abseil-cpp/absl/types/span.h +10 -2
- package/vendor/abseil-cpp/absl/utility/utility.h +13 -0
- package/vendor/abseil-cpp/ci/absl_alternate_options.h +0 -1
- package/vendor/abseil-cpp/ci/cmake_common.sh +1 -1
- package/vendor/abseil-cpp/ci/cmake_install_test.sh +6 -0
- package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +2 -0
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +6 -0
- package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +6 -0
- package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +3 -2
- package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +5 -0
- package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -0
- package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -0
- package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +6 -1
- package/vendor/abseil-cpp/absl/base/internal/identity.h +0 -39
- package/vendor/abseil-cpp/absl/strings/string_view.cc +0 -257
- package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +0 -380
|
@@ -0,0 +1,118 @@
|
|
|
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
|
+
#include "absl/debugging/internal/borrowed_fixup_buffer.h"
|
|
16
|
+
|
|
17
|
+
#include <assert.h>
|
|
18
|
+
#include <limits.h>
|
|
19
|
+
#include <stddef.h>
|
|
20
|
+
#include <stdint.h>
|
|
21
|
+
|
|
22
|
+
#include <atomic>
|
|
23
|
+
#include <iterator>
|
|
24
|
+
#include <utility>
|
|
25
|
+
|
|
26
|
+
#include "absl/base/attributes.h"
|
|
27
|
+
#include "absl/base/config.h"
|
|
28
|
+
#include "absl/base/internal/low_level_alloc.h"
|
|
29
|
+
#include "absl/hash/hash.h"
|
|
30
|
+
|
|
31
|
+
namespace absl {
|
|
32
|
+
ABSL_NAMESPACE_BEGIN
|
|
33
|
+
namespace internal_stacktrace {
|
|
34
|
+
|
|
35
|
+
// A buffer for holding fix-up information for stack traces of common sizes_.
|
|
36
|
+
struct BorrowedFixupBuffer::FixupStackBuffer {
|
|
37
|
+
static constexpr size_t kMaxStackElements = 128; // Can be reduced if needed
|
|
38
|
+
std::atomic_flag in_use{};
|
|
39
|
+
uintptr_t frames[kMaxStackElements];
|
|
40
|
+
int sizes[kMaxStackElements];
|
|
41
|
+
|
|
42
|
+
ABSL_CONST_INIT static FixupStackBuffer g_instances[kNumStaticBuffers];
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
ABSL_CONST_INIT BorrowedFixupBuffer::FixupStackBuffer
|
|
46
|
+
BorrowedFixupBuffer::FixupStackBuffer::g_instances[kNumStaticBuffers] = {};
|
|
47
|
+
|
|
48
|
+
BorrowedFixupBuffer::~BorrowedFixupBuffer() {
|
|
49
|
+
if (borrowed_) {
|
|
50
|
+
std::move(*this).Unlock();
|
|
51
|
+
} else {
|
|
52
|
+
base_internal::LowLevelAlloc::Free(frames_);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
BorrowedFixupBuffer::BorrowedFixupBuffer(size_t length)
|
|
57
|
+
: borrowed_(0 < length && length <= FixupStackBuffer::kMaxStackElements
|
|
58
|
+
? TryLock()
|
|
59
|
+
: nullptr) {
|
|
60
|
+
if (borrowed_) {
|
|
61
|
+
InitViaBorrow();
|
|
62
|
+
} else {
|
|
63
|
+
InitViaAllocation(length);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
void BorrowedFixupBuffer::InitViaBorrow() {
|
|
68
|
+
assert(borrowed_);
|
|
69
|
+
frames_ = borrowed_->frames;
|
|
70
|
+
sizes_ = borrowed_->sizes;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
void BorrowedFixupBuffer::InitViaAllocation(size_t length) {
|
|
74
|
+
static_assert(alignof(decltype(*frames_)) >= alignof(decltype(*sizes_)),
|
|
75
|
+
"contiguous layout assumes decreasing alignment, otherwise "
|
|
76
|
+
"padding may be needed in the middle");
|
|
77
|
+
assert(!borrowed_);
|
|
78
|
+
|
|
79
|
+
base_internal::InitSigSafeArena();
|
|
80
|
+
void* buf = base_internal::LowLevelAlloc::AllocWithArena(
|
|
81
|
+
length * (sizeof(*frames_) + sizeof(*sizes_)),
|
|
82
|
+
base_internal::SigSafeArena());
|
|
83
|
+
|
|
84
|
+
if (buf == nullptr) {
|
|
85
|
+
frames_ = nullptr;
|
|
86
|
+
sizes_ = nullptr;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
frames_ = new (buf) uintptr_t[length];
|
|
91
|
+
sizes_ = new (static_cast<void*>(static_cast<unsigned char*>(buf) +
|
|
92
|
+
length * sizeof(*frames_))) int[length];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
[[nodiscard]] BorrowedFixupBuffer::FixupStackBuffer*
|
|
96
|
+
BorrowedFixupBuffer::TryLock() {
|
|
97
|
+
constexpr size_t kNumSlots = std::size(FixupStackBuffer::g_instances);
|
|
98
|
+
const size_t i = absl::Hash<const void*>()(this) % kNumSlots;
|
|
99
|
+
for (size_t k = 0; k < kNumSlots; ++k) {
|
|
100
|
+
auto* instance = &FixupStackBuffer::g_instances[(i + k) % kNumSlots];
|
|
101
|
+
// Use memory_order_acquire to ensure that no reads and writes on the
|
|
102
|
+
// borrowed buffer are reordered before the borrowing.
|
|
103
|
+
if (!instance->in_use.test_and_set(std::memory_order_acquire)) {
|
|
104
|
+
return instance;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return nullptr;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
void BorrowedFixupBuffer::Unlock() && {
|
|
111
|
+
// Use memory_order_release to ensure that no reads and writes on the borrowed
|
|
112
|
+
// buffer are reordered after the borrowing.
|
|
113
|
+
borrowed_->in_use.clear(std::memory_order_release);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
} // namespace internal_stacktrace
|
|
117
|
+
ABSL_NAMESPACE_END
|
|
118
|
+
} // namespace absl
|
|
@@ -0,0 +1,71 @@
|
|
|
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_BORROWED_FIXUP_BUFFER_H_
|
|
16
|
+
#define ABSL_DEBUGGING_INTERNAL_BORROWED_FIXUP_BUFFER_H_
|
|
17
|
+
|
|
18
|
+
#include <stddef.h>
|
|
19
|
+
#include <stdint.h>
|
|
20
|
+
#include <stdlib.h>
|
|
21
|
+
|
|
22
|
+
#include "absl/base/config.h"
|
|
23
|
+
|
|
24
|
+
namespace absl {
|
|
25
|
+
ABSL_NAMESPACE_BEGIN
|
|
26
|
+
namespace internal_stacktrace {
|
|
27
|
+
|
|
28
|
+
// An RAII type that temporarily acquires a buffer for stack trace fix-ups from
|
|
29
|
+
// a pool of preallocated buffers, or attempts to allocate a new buffer if no
|
|
30
|
+
// such buffer is available.
|
|
31
|
+
// When destroyed, returns the buffer to the pool if it borrowed successfully,
|
|
32
|
+
// otherwise deallocates any previously allocated buffer.
|
|
33
|
+
class BorrowedFixupBuffer {
|
|
34
|
+
public:
|
|
35
|
+
static constexpr size_t kNumStaticBuffers = 64;
|
|
36
|
+
~BorrowedFixupBuffer();
|
|
37
|
+
|
|
38
|
+
// The number of frames to allocate space for. Note that allocations can fail.
|
|
39
|
+
explicit BorrowedFixupBuffer(size_t length);
|
|
40
|
+
|
|
41
|
+
uintptr_t* frames() const { return frames_; }
|
|
42
|
+
int* sizes() const { return sizes_; }
|
|
43
|
+
|
|
44
|
+
private:
|
|
45
|
+
struct FixupStackBuffer;
|
|
46
|
+
|
|
47
|
+
uintptr_t* frames_;
|
|
48
|
+
int* sizes_;
|
|
49
|
+
|
|
50
|
+
// The borrowed pre-existing buffer, if any (if we haven't allocated our own)
|
|
51
|
+
FixupStackBuffer* const borrowed_;
|
|
52
|
+
|
|
53
|
+
void InitViaBorrow();
|
|
54
|
+
void InitViaAllocation(size_t length);
|
|
55
|
+
|
|
56
|
+
// Attempts to opportunistically borrow a small buffer in a thread- and
|
|
57
|
+
// signal-safe manner. Returns nullptr on failure.
|
|
58
|
+
[[nodiscard]] FixupStackBuffer* TryLock();
|
|
59
|
+
|
|
60
|
+
// Returns the borrowed buffer.
|
|
61
|
+
void Unlock() &&;
|
|
62
|
+
|
|
63
|
+
BorrowedFixupBuffer(const BorrowedFixupBuffer&) = delete;
|
|
64
|
+
BorrowedFixupBuffer& operator=(const BorrowedFixupBuffer&) = delete;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
} // namespace internal_stacktrace
|
|
68
|
+
ABSL_NAMESPACE_END
|
|
69
|
+
} // namespace absl
|
|
70
|
+
|
|
71
|
+
#endif // ABSL_DEBUGGING_INTERNAL_BORROWED_FIXUP_BUFFER_H_
|
|
@@ -0,0 +1,97 @@
|
|
|
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
|
+
#include "absl/debugging/internal/borrowed_fixup_buffer.h"
|
|
16
|
+
|
|
17
|
+
#include <stddef.h>
|
|
18
|
+
#include <stdint.h>
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <functional>
|
|
22
|
+
#include <memory>
|
|
23
|
+
|
|
24
|
+
#include "gtest/gtest.h"
|
|
25
|
+
#include "absl/base/config.h"
|
|
26
|
+
|
|
27
|
+
namespace absl {
|
|
28
|
+
ABSL_NAMESPACE_BEGIN
|
|
29
|
+
namespace internal_stacktrace {
|
|
30
|
+
namespace {
|
|
31
|
+
|
|
32
|
+
TEST(BorrowedFixupBuffer, ProperReuse) {
|
|
33
|
+
uintptr_t first_borrowed_frame = 0;
|
|
34
|
+
uintptr_t first_borrowed_size = 0;
|
|
35
|
+
|
|
36
|
+
// Ensure that we borrow the same buffer each time, indicating proper reuse.
|
|
37
|
+
// Disable loop unrolling. We need all iterations to match exactly, to coax
|
|
38
|
+
// reuse of the the same underlying buffer.
|
|
39
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
40
|
+
#pragma GCC unroll 1 // <= 1 disables unrolling
|
|
41
|
+
#endif
|
|
42
|
+
for (int i = 0; i < 100; ++i) {
|
|
43
|
+
BorrowedFixupBuffer buf0(0);
|
|
44
|
+
EXPECT_EQ(buf0.frames(), nullptr);
|
|
45
|
+
EXPECT_EQ(buf0.sizes(), nullptr);
|
|
46
|
+
|
|
47
|
+
BorrowedFixupBuffer buf1(1);
|
|
48
|
+
EXPECT_NE(buf1.frames(), nullptr);
|
|
49
|
+
EXPECT_NE(buf1.sizes(), nullptr);
|
|
50
|
+
if (first_borrowed_frame == 0) {
|
|
51
|
+
first_borrowed_frame = reinterpret_cast<uintptr_t>(buf1.frames());
|
|
52
|
+
} else {
|
|
53
|
+
EXPECT_EQ(reinterpret_cast<uintptr_t>(buf1.frames()),
|
|
54
|
+
first_borrowed_frame);
|
|
55
|
+
}
|
|
56
|
+
if (first_borrowed_size == 0) {
|
|
57
|
+
first_borrowed_size = reinterpret_cast<uintptr_t>(buf1.sizes());
|
|
58
|
+
} else {
|
|
59
|
+
EXPECT_EQ(reinterpret_cast<uintptr_t>(buf1.sizes()), first_borrowed_size);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
BorrowedFixupBuffer buf2(2);
|
|
63
|
+
EXPECT_NE(buf2.frames(), buf1.frames());
|
|
64
|
+
EXPECT_NE(buf2.sizes(), buf1.sizes());
|
|
65
|
+
EXPECT_NE(buf2.frames(), nullptr);
|
|
66
|
+
EXPECT_NE(buf2.sizes(), nullptr);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
TEST(BorrowedFixupBuffer, NoOverlap) {
|
|
71
|
+
using BufferPtr = std::unique_ptr<BorrowedFixupBuffer>;
|
|
72
|
+
static constexpr std::less<const void*> less;
|
|
73
|
+
static constexpr size_t kBufLen = 5;
|
|
74
|
+
static constexpr size_t kNumBuffers =
|
|
75
|
+
BorrowedFixupBuffer::kNumStaticBuffers * 37 + 1;
|
|
76
|
+
|
|
77
|
+
auto bufs = std::make_unique<BufferPtr[]>(kNumBuffers);
|
|
78
|
+
for (size_t i = 0; i < kNumBuffers; ++i) {
|
|
79
|
+
bufs[i] = std::make_unique<BorrowedFixupBuffer>(kBufLen);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
std::sort(bufs.get(), bufs.get() + kNumBuffers,
|
|
83
|
+
[](const BufferPtr& a, const BufferPtr& b) {
|
|
84
|
+
return less(a->frames(), b->frames());
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// Verify there are no overlaps
|
|
88
|
+
for (size_t i = 1; i < kNumBuffers; ++i) {
|
|
89
|
+
EXPECT_FALSE(less(bufs[i]->frames(), bufs[i - 1]->frames() + kBufLen));
|
|
90
|
+
EXPECT_FALSE(less(bufs[i]->sizes(), bufs[i - 1]->sizes() + kBufLen));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
} // namespace
|
|
95
|
+
} // namespace internal_stacktrace
|
|
96
|
+
ABSL_NAMESPACE_END
|
|
97
|
+
} // namespace absl
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
#include "absl/base/config.h"
|
|
29
29
|
#include "absl/debugging/internal/demangle_rust.h"
|
|
30
30
|
|
|
31
|
-
#
|
|
31
|
+
#ifdef ABSL_INTERNAL_HAS_CXA_DEMANGLE
|
|
32
32
|
#include <cxxabi.h>
|
|
33
33
|
#endif
|
|
34
34
|
|
|
@@ -2941,7 +2941,7 @@ std::string DemangleString(const char* mangled) {
|
|
|
2941
2941
|
std::string out;
|
|
2942
2942
|
int status = 0;
|
|
2943
2943
|
char* demangled = nullptr;
|
|
2944
|
-
#
|
|
2944
|
+
#ifdef ABSL_INTERNAL_HAS_CXA_DEMANGLE
|
|
2945
2945
|
demangled = abi::__cxa_demangle(mangled, nullptr, nullptr, &status);
|
|
2946
2946
|
#endif
|
|
2947
2947
|
if (status == 0 && demangled != nullptr) {
|
|
@@ -32,10 +32,10 @@
|
|
|
32
32
|
#error ABSL_HAVE_ELF_MEM_IMAGE cannot be directly set
|
|
33
33
|
#endif
|
|
34
34
|
|
|
35
|
-
#if defined(__ELF__) && !defined(__OpenBSD__) && !defined(__QNX__) &&
|
|
36
|
-
!defined(
|
|
37
|
-
!defined(
|
|
38
|
-
!defined(
|
|
35
|
+
#if defined(__ELF__) && !defined(__OpenBSD__) && !defined(__QNX__) && \
|
|
36
|
+
!defined(__asmjs__) && !defined(__wasm__) && !defined(__HAIKU__) && \
|
|
37
|
+
!defined(__sun) && !defined(__VXWORKS__) && !defined(__hexagon__) && \
|
|
38
|
+
!defined(__XTENSA__)
|
|
39
39
|
#define ABSL_HAVE_ELF_MEM_IMAGE 1
|
|
40
40
|
#endif
|
|
41
41
|
|
|
@@ -149,6 +149,10 @@ void RegisterDebugStackTraceHook(SymbolizeUrlEmitter hook) {
|
|
|
149
149
|
debug_stack_trace_hook = hook;
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
+
SymbolizeUrlEmitterLegacy GetDebugStackTraceHookLegacy() {
|
|
153
|
+
return debug_stack_trace_hook;
|
|
154
|
+
}
|
|
155
|
+
|
|
152
156
|
SymbolizeUrlEmitter GetDebugStackTraceHook() { return debug_stack_trace_hook; }
|
|
153
157
|
|
|
154
158
|
// Returns the program counter from signal context, nullptr if
|
|
@@ -32,12 +32,19 @@ typedef void OutputWriter(const char*, void*);
|
|
|
32
32
|
// `hook` may be called from a signal handler.
|
|
33
33
|
typedef void (*SymbolizeUrlEmitter)(void* const stack[], int depth,
|
|
34
34
|
OutputWriter* writer, void* writer_arg);
|
|
35
|
+
typedef void (*SymbolizeUrlEmitterLegacy)(void* const stack[], int depth,
|
|
36
|
+
OutputWriter* writer,
|
|
37
|
+
void* writer_arg);
|
|
35
38
|
|
|
36
39
|
// Registration of SymbolizeUrlEmitter for use inside of a signal handler.
|
|
37
40
|
// This is inherently unsafe and must be signal safe code.
|
|
38
41
|
void RegisterDebugStackTraceHook(SymbolizeUrlEmitter hook);
|
|
39
42
|
SymbolizeUrlEmitter GetDebugStackTraceHook();
|
|
40
43
|
|
|
44
|
+
// Currently exact copy of above. Needed for the 3-CL dance due to
|
|
45
|
+
// TCMallocDebugStackTraceHook dependency on this API.
|
|
46
|
+
SymbolizeUrlEmitterLegacy GetDebugStackTraceHookLegacy();
|
|
47
|
+
|
|
41
48
|
// Returns the program counter from signal context, or nullptr if
|
|
42
49
|
// unknown. `vuc` is a ucontext_t*. We use void* to avoid the use of
|
|
43
50
|
// ucontext_t on non-POSIX systems.
|
|
@@ -123,7 +123,7 @@ static void **NextStackFrame(void **old_frame_pointer, const void *uc,
|
|
|
123
123
|
// earlier in the stack than the old_frame_pointer, then use it. If it is
|
|
124
124
|
// later, then we have already unwound through it and it needs no special
|
|
125
125
|
// handling.
|
|
126
|
-
if (pre_signal_frame_pointer
|
|
126
|
+
if (pre_signal_frame_pointer > old_frame_pointer) {
|
|
127
127
|
new_frame_pointer = pre_signal_frame_pointer;
|
|
128
128
|
}
|
|
129
129
|
}
|
|
@@ -52,13 +52,6 @@ static std::atomic<bool> disable_stacktraces(true); // Disabled until healthy.
|
|
|
52
52
|
// Waiting until static initializers run seems to be late enough.
|
|
53
53
|
// This file is included into stacktrace.cc so this will only run once.
|
|
54
54
|
ABSL_ATTRIBUTE_UNUSED static int stacktraces_enabler = []() {
|
|
55
|
-
// Check if we can even create stacktraces. If not, bail early and leave
|
|
56
|
-
// disable_stacktraces set as-is.
|
|
57
|
-
// clang-format off
|
|
58
|
-
if (!EM_ASM_INT({ return (typeof wasmOffsetConverter !== 'undefined'); })) {
|
|
59
|
-
return 0;
|
|
60
|
-
}
|
|
61
|
-
// clang-format on
|
|
62
55
|
disable_stacktraces.store(false, std::memory_order_relaxed);
|
|
63
56
|
return 0;
|
|
64
57
|
}();
|
|
@@ -223,8 +223,9 @@ static int UnwindImpl(void **result, uintptr_t *frames, int *sizes,
|
|
|
223
223
|
}
|
|
224
224
|
if (sizes != nullptr) {
|
|
225
225
|
if (next_sp > sp) {
|
|
226
|
-
sizes[n] =
|
|
227
|
-
|
|
226
|
+
sizes[n] = static_cast<int>(
|
|
227
|
+
absl::debugging_internal::StripPointerMetadata(next_sp) -
|
|
228
|
+
absl::debugging_internal::StripPointerMetadata(sp));
|
|
228
229
|
} else {
|
|
229
230
|
// A frame-size of 0 is used to indicate unknown frame size.
|
|
230
231
|
sizes[n] = 0;
|
|
@@ -162,7 +162,8 @@ static int UnwindImpl(void **result, uintptr_t *frames, int *sizes,
|
|
|
162
162
|
absl::debugging_internal::StripPointerMetadata(frame_pointer);
|
|
163
163
|
}
|
|
164
164
|
if (sizes != nullptr) {
|
|
165
|
-
sizes[n] =
|
|
165
|
+
sizes[n] = static_cast<int>(
|
|
166
|
+
ComputeStackFrameSize(frame_pointer, next_frame_pointer));
|
|
166
167
|
}
|
|
167
168
|
}
|
|
168
169
|
n++;
|
|
@@ -245,6 +245,7 @@ static void **NextStackFrame(void **old_fp, const void *uc,
|
|
|
245
245
|
}
|
|
246
246
|
#endif
|
|
247
247
|
|
|
248
|
+
const size_t page_size = static_cast<size_t>(getpagesize());
|
|
248
249
|
const uintptr_t old_fp_u = reinterpret_cast<uintptr_t>(old_fp);
|
|
249
250
|
const uintptr_t new_fp_u = reinterpret_cast<uintptr_t>(new_fp);
|
|
250
251
|
|
|
@@ -273,8 +274,7 @@ static void **NextStackFrame(void **old_fp, const void *uc,
|
|
|
273
274
|
// so we assume the large frame is legit if we know the real stack bounds
|
|
274
275
|
// and are within the stack.
|
|
275
276
|
if (new_fp_u <= old_fp_u || new_fp_u - old_fp_u > kMaxFrameBytes) {
|
|
276
|
-
if (stack_high < kUnknownStackEnd &&
|
|
277
|
-
static_cast<size_t>(getpagesize()) < stack_low) {
|
|
277
|
+
if (stack_high < kUnknownStackEnd && page_size < stack_low) {
|
|
278
278
|
// Stack bounds are known.
|
|
279
279
|
if (!(stack_low < new_fp_u && new_fp_u <= stack_high)) {
|
|
280
280
|
// new_fp_u is not within the known stack.
|
|
@@ -311,7 +311,12 @@ static void **NextStackFrame(void **old_fp, const void *uc,
|
|
|
311
311
|
if (new_fp_u >= 0xffffe000) return nullptr;
|
|
312
312
|
#endif
|
|
313
313
|
#if !defined(_WIN32)
|
|
314
|
-
|
|
314
|
+
const uintptr_t old_fp_page = old_fp_u & ~(page_size - 1);
|
|
315
|
+
const uintptr_t new_fp_page = new_fp_u & ~(page_size - 1);
|
|
316
|
+
if (old_fp_page == new_fp_page && (new_fp_u & (sizeof(void*) - 1)) == 0) {
|
|
317
|
+
// We dereferenced the old_fp above, so it is safe to dereference
|
|
318
|
+
// new_fp if it's on the same page as the old_fp and is aligned.
|
|
319
|
+
} else if (!STRICT_UNWINDING) {
|
|
315
320
|
// Lax sanity checks cause a crash in 32-bit tcmalloc/crash_reason_test
|
|
316
321
|
// on AMD-based machines with VDSO-enabled kernels.
|
|
317
322
|
// Make an extra sanity check to insure new_fp is readable.
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
|
|
29
29
|
#ifdef ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE
|
|
30
30
|
#error ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE cannot be directly set
|
|
31
|
-
#elif defined(__ELF__) && defined(__GLIBC__) && !defined(
|
|
32
|
-
&& !defined(
|
|
31
|
+
#elif defined(__ELF__) && defined(__GLIBC__) && !defined(__asmjs__) \
|
|
32
|
+
&& !defined(__wasm__)
|
|
33
33
|
#define ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE 1
|
|
34
34
|
|
|
35
35
|
#include <elf.h>
|
|
@@ -42,29 +42,28 @@
|
|
|
42
42
|
|
|
43
43
|
#include <algorithm>
|
|
44
44
|
#include <atomic>
|
|
45
|
-
#include <iterator>
|
|
46
45
|
|
|
47
46
|
#include "absl/base/attributes.h"
|
|
48
47
|
#include "absl/base/config.h"
|
|
49
|
-
#include "absl/base/internal/low_level_alloc.h"
|
|
50
48
|
#include "absl/base/optimization.h"
|
|
51
49
|
#include "absl/base/port.h"
|
|
50
|
+
#include "absl/debugging/internal/borrowed_fixup_buffer.h"
|
|
52
51
|
#include "absl/debugging/internal/stacktrace_config.h"
|
|
53
52
|
|
|
54
53
|
#if defined(ABSL_STACKTRACE_INL_HEADER)
|
|
55
54
|
#include ABSL_STACKTRACE_INL_HEADER
|
|
56
55
|
#else
|
|
57
|
-
#
|
|
58
|
-
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
#
|
|
63
|
-
#
|
|
64
|
-
#
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
#
|
|
56
|
+
#error Cannot calculate stack trace: will need to write for your environment
|
|
57
|
+
|
|
58
|
+
#include "absl/debugging/internal/stacktrace_aarch64-inl.inc"
|
|
59
|
+
#include "absl/debugging/internal/stacktrace_arm-inl.inc"
|
|
60
|
+
#include "absl/debugging/internal/stacktrace_emscripten-inl.inc"
|
|
61
|
+
#include "absl/debugging/internal/stacktrace_generic-inl.inc"
|
|
62
|
+
#include "absl/debugging/internal/stacktrace_powerpc-inl.inc"
|
|
63
|
+
#include "absl/debugging/internal/stacktrace_riscv-inl.inc"
|
|
64
|
+
#include "absl/debugging/internal/stacktrace_unimplemented-inl.inc"
|
|
65
|
+
#include "absl/debugging/internal/stacktrace_win32-inl.inc"
|
|
66
|
+
#include "absl/debugging/internal/stacktrace_x86-inl.inc"
|
|
68
67
|
#endif
|
|
69
68
|
|
|
70
69
|
namespace absl {
|
|
@@ -78,29 +77,10 @@ template <bool IS_STACK_FRAMES, bool IS_WITH_CONTEXT>
|
|
|
78
77
|
ABSL_ATTRIBUTE_ALWAYS_INLINE inline int Unwind(void** result, uintptr_t* frames,
|
|
79
78
|
int* sizes, size_t max_depth,
|
|
80
79
|
int skip_count, const void* uc,
|
|
81
|
-
int* min_dropped_frames
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
static constexpr size_t kMaxStackElements =
|
|
86
|
-
(kMinPageSize / 2) / (sizeof(*frames) + sizeof(*sizes));
|
|
87
|
-
|
|
88
|
-
// Allocate a buffer dynamically, using the signal-safe allocator.
|
|
89
|
-
static constexpr auto allocate = [](size_t num_bytes) -> void* {
|
|
90
|
-
base_internal::InitSigSafeArena();
|
|
91
|
-
return base_internal::LowLevelAlloc::AllocWithArena(
|
|
92
|
-
num_bytes, base_internal::SigSafeArena());
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
uintptr_t frames_stackbuf[kMaxStackElements];
|
|
96
|
-
int sizes_stackbuf[kMaxStackElements];
|
|
97
|
-
|
|
98
|
-
// We only need to free the buffers if we allocated them with the signal-safe
|
|
99
|
-
// allocator.
|
|
100
|
-
bool must_free_frames = false;
|
|
101
|
-
bool must_free_sizes = false;
|
|
102
|
-
|
|
103
|
-
bool unwind_with_fixup = internal_stacktrace::ShouldFixUpStack();
|
|
80
|
+
int* min_dropped_frames,
|
|
81
|
+
bool unwind_with_fixup = true) {
|
|
82
|
+
unwind_with_fixup =
|
|
83
|
+
unwind_with_fixup && internal_stacktrace::ShouldFixUpStack();
|
|
104
84
|
|
|
105
85
|
#ifdef _WIN32
|
|
106
86
|
if (unwind_with_fixup) {
|
|
@@ -112,29 +92,17 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE inline int Unwind(void** result, uintptr_t* frames,
|
|
|
112
92
|
}
|
|
113
93
|
#endif
|
|
114
94
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
must_free_frames = true;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
if (sizes == nullptr) {
|
|
131
|
-
if (max_depth <= std::size(sizes_stackbuf)) {
|
|
132
|
-
sizes = sizes_stackbuf;
|
|
133
|
-
} else {
|
|
134
|
-
sizes = static_cast<int*>(allocate(max_depth * sizeof(*sizes)));
|
|
135
|
-
must_free_sizes = true;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
95
|
+
// Some implementations of FixUpStack may need to be passed frame
|
|
96
|
+
// information from Unwind, even if the caller doesn't need that
|
|
97
|
+
// information. We allocate the necessary buffers for such implementations
|
|
98
|
+
// here.
|
|
99
|
+
const internal_stacktrace::BorrowedFixupBuffer fixup_buffer(
|
|
100
|
+
unwind_with_fixup ? max_depth : 0);
|
|
101
|
+
if (frames == nullptr) {
|
|
102
|
+
frames = fixup_buffer.frames();
|
|
103
|
+
}
|
|
104
|
+
if (sizes == nullptr) {
|
|
105
|
+
sizes = fixup_buffer.sizes();
|
|
138
106
|
}
|
|
139
107
|
|
|
140
108
|
Unwinder g = custom.load(std::memory_order_acquire);
|
|
@@ -162,14 +130,6 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE inline int Unwind(void** result, uintptr_t* frames,
|
|
|
162
130
|
internal_stacktrace::FixUpStack(result, frames, sizes, max_depth, size);
|
|
163
131
|
}
|
|
164
132
|
|
|
165
|
-
if (must_free_sizes) {
|
|
166
|
-
base_internal::LowLevelAlloc::Free(sizes);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
if (must_free_frames) {
|
|
170
|
-
base_internal::LowLevelAlloc::Free(frames);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
133
|
ABSL_BLOCK_TAIL_CALL_OPTIMIZATION();
|
|
174
134
|
return static_cast<int>(size);
|
|
175
135
|
}
|
|
@@ -194,6 +154,14 @@ internal_stacktrace::GetStackFramesWithContext(void** result, uintptr_t* frames,
|
|
|
194
154
|
min_dropped_frames);
|
|
195
155
|
}
|
|
196
156
|
|
|
157
|
+
ABSL_ATTRIBUTE_NOINLINE ABSL_ATTRIBUTE_NO_TAIL_CALL int
|
|
158
|
+
internal_stacktrace::GetStackTraceNoFixup(void** result, int max_depth,
|
|
159
|
+
int skip_count) {
|
|
160
|
+
return Unwind<false, false>(result, nullptr, nullptr,
|
|
161
|
+
static_cast<size_t>(max_depth), skip_count,
|
|
162
|
+
nullptr, nullptr, /*unwind_with_fixup=*/false);
|
|
163
|
+
}
|
|
164
|
+
|
|
197
165
|
ABSL_ATTRIBUTE_NOINLINE ABSL_ATTRIBUTE_NO_TAIL_CALL int GetStackTrace(
|
|
198
166
|
void** result, int max_depth, int skip_count) {
|
|
199
167
|
return Unwind<false, false>(result, nullptr, nullptr,
|
|
@@ -69,6 +69,9 @@ extern int GetStackFramesWithContext(void** result, uintptr_t* frames,
|
|
|
69
69
|
int* sizes, int max_depth, int skip_count,
|
|
70
70
|
const void* uc, int* min_dropped_frames);
|
|
71
71
|
|
|
72
|
+
// As above, but skips fix-ups for efficiency.
|
|
73
|
+
extern int GetStackTraceNoFixup(void** result, int max_depth, int skip_count);
|
|
74
|
+
|
|
72
75
|
// Same as `absl::DefaultStackUnwinder`, but with an optional `frames` parameter
|
|
73
76
|
// to allow callers to receive the raw stack frame addresses.
|
|
74
77
|
// This is internal for now; do not depend on this externally.
|
|
@@ -12,12 +12,25 @@
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
|
|
15
|
+
#include <stddef.h>
|
|
16
|
+
#include <stdint.h>
|
|
17
|
+
|
|
15
18
|
#include "absl/base/attributes.h"
|
|
16
19
|
#include "absl/base/config.h"
|
|
17
20
|
#include "absl/base/optimization.h"
|
|
21
|
+
#include "absl/cleanup/cleanup.h"
|
|
18
22
|
#include "absl/debugging/stacktrace.h"
|
|
19
23
|
#include "benchmark/benchmark.h"
|
|
20
24
|
|
|
25
|
+
static bool g_enable_fixup = false;
|
|
26
|
+
|
|
27
|
+
#if ABSL_HAVE_ATTRIBUTE_WEAK
|
|
28
|
+
// Override these weak symbols if possible.
|
|
29
|
+
bool absl::internal_stacktrace::ShouldFixUpStack() { return g_enable_fixup; }
|
|
30
|
+
void absl::internal_stacktrace::FixUpStack(void**, uintptr_t*, int*, size_t,
|
|
31
|
+
size_t&) {}
|
|
32
|
+
#endif
|
|
33
|
+
|
|
21
34
|
namespace absl {
|
|
22
35
|
ABSL_NAMESPACE_BEGIN
|
|
23
36
|
namespace {
|
|
@@ -42,14 +55,24 @@ ABSL_ATTRIBUTE_NOINLINE void func(benchmark::State& state, int x, int depth) {
|
|
|
42
55
|
func(state, --x, depth);
|
|
43
56
|
}
|
|
44
57
|
|
|
58
|
+
template <bool EnableFixup>
|
|
45
59
|
void BM_GetStackTrace(benchmark::State& state) {
|
|
60
|
+
const Cleanup restore_state(
|
|
61
|
+
[prev = g_enable_fixup]() { g_enable_fixup = prev; });
|
|
62
|
+
g_enable_fixup = EnableFixup;
|
|
46
63
|
int depth = state.range(0);
|
|
47
64
|
for (auto s : state) {
|
|
48
65
|
func(state, depth, depth);
|
|
49
66
|
}
|
|
50
67
|
}
|
|
51
68
|
|
|
52
|
-
|
|
69
|
+
#if ABSL_HAVE_ATTRIBUTE_WEAK
|
|
70
|
+
auto& BM_GetStackTraceWithFixup = BM_GetStackTrace<true>;
|
|
71
|
+
BENCHMARK(BM_GetStackTraceWithFixup)->DenseRange(10, kMaxStackDepth, 10);
|
|
72
|
+
#endif
|
|
73
|
+
|
|
74
|
+
auto& BM_GetStackTraceWithoutFixup = BM_GetStackTrace<false>;
|
|
75
|
+
BENCHMARK(BM_GetStackTraceWithoutFixup)->DenseRange(10, kMaxStackDepth, 10);
|
|
53
76
|
} // namespace
|
|
54
77
|
ABSL_NAMESPACE_END
|
|
55
78
|
} // namespace absl
|