Export of internal Abseil changes

--
b008f3aaab60f1f0eb5987b50336543cca7151be by Martijn Vels <mvels@google.com>:

Enable Cord Btree as the default Cord implementation.

The Cord Btree implementation has been extensively tested by google. This changes makes the Cord Btree implementation the default implementation. This change should have no impact on current use cases and does not effect any public API or behavior.

PiperOrigin-RevId: 403966449

--
3d82052b5819d1244942c59d5cb4e51d75ada287 by Derek Mauro <dmauro@google.com>:

Add missing CMake alias for gmock_main.
Remove unused variable ABSL_TEST_COMMON_LIBRARIES

Fixes #709
Fixes #1043

PiperOrigin-RevId: 403950358

--
86695f6d06915b56d807303c37ee81487998cd58 by Abseil Team <absl-team@google.com>:

FunctionRef is cheaper to construct than a std::function, and the argument is only used during the call, so this is safe. This has the added advantage of allowing the caller to provide a non-movable callable, which can't be converted to a std::function.

PiperOrigin-RevId: 403457615

--
196c1109ba519d4ff00c856bbb4bff754468359f by Abseil Team <absl-team@google.com>:

Internal optimization.

PiperOrigin-RevId: 403413291
GitOrigin-RevId: b008f3aaab60f1f0eb5987b50336543cca7151be
Change-Id: I1665f0efd484f53e0ed22d8940ef2fa60b03cc5b
pull/1045/head
Abseil Team 4 years ago committed by Derek Mauro
parent 7e446075d4
commit a2f52e1177
  1. 10
      CMakeLists.txt
  2. 25
      absl/debugging/internal/stacktrace_x86-inl.inc
  3. 1
      absl/status/BUILD.bazel
  4. 1
      absl/status/CMakeLists.txt
  5. 2
      absl/status/status.cc
  6. 3
      absl/status/status.h
  7. 2
      absl/strings/internal/cord_internal.h

@ -160,22 +160,16 @@ if(BUILD_TESTING)
if (NOT ABSL_FIND_GOOGLETEST) if (NOT ABSL_FIND_GOOGLETEST)
# When Google Test is included directly rather than through find_package, the aliases are missing. # When Google Test is included directly rather than through find_package, the aliases are missing.
add_library(GTest::gtest_main ALIAS gtest_main)
add_library(GTest::gtest ALIAS gtest) add_library(GTest::gtest ALIAS gtest)
add_library(GTest::gtest_main ALIAS gtest_main)
add_library(GTest::gmock ALIAS gmock) add_library(GTest::gmock ALIAS gmock)
add_library(GTest::gmock_main ALIAS gmock_main)
endif() endif()
check_target(GTest::gtest) check_target(GTest::gtest)
check_target(GTest::gtest_main) check_target(GTest::gtest_main)
check_target(GTest::gmock) check_target(GTest::gmock)
check_target(GTest::gmock_main) check_target(GTest::gmock_main)
list(APPEND ABSL_TEST_COMMON_LIBRARIES
GTest::gtest_main
GTest::gtest
GTest::gmock
${CMAKE_THREAD_LIBS_INIT}
)
endif() endif()
add_subdirectory(absl) add_subdirectory(absl)

@ -27,6 +27,7 @@
#include <cassert> #include <cassert>
#include <cstdint> #include <cstdint>
#include <limits>
#include "absl/base/macros.h" #include "absl/base/macros.h"
#include "absl/base/port.h" #include "absl/base/port.h"
@ -158,7 +159,8 @@ static uintptr_t GetFP(const void *vuc) {
template <bool STRICT_UNWINDING, bool WITH_CONTEXT> template <bool STRICT_UNWINDING, bool WITH_CONTEXT>
ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS // May read random elements from stack. ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS // May read random elements from stack.
ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY // May read random elements from stack. ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY // May read random elements from stack.
static void **NextStackFrame(void **old_fp, const void *uc) { static void **NextStackFrame(void **old_fp, const void *uc,
size_t stack_low, size_t stack_high) {
void **new_fp = (void **)*old_fp; void **new_fp = (void **)*old_fp;
#if defined(__linux__) && defined(__i386__) #if defined(__linux__) && defined(__i386__)
@ -257,6 +259,18 @@ static void **NextStackFrame(void **old_fp, const void *uc) {
// at a greater address that the current one. // at a greater address that the current one.
if (new_fp_u <= old_fp_u) return nullptr; if (new_fp_u <= old_fp_u) return nullptr;
if (new_fp_u - old_fp_u > kMaxFrameBytes) return nullptr; if (new_fp_u - old_fp_u > kMaxFrameBytes) return nullptr;
if (stack_low < old_fp_u && old_fp_u <= stack_high) {
// Old BP was in the expected stack region...
if (!(stack_low < new_fp_u && new_fp_u <= stack_high)) {
// ... but new BP is outside of expected stack region.
// It is most likely bogus.
return nullptr;
}
} else {
// We may be here if we are executing in a co-routine with a
// separate stack. We can't do safety checks in this case.
}
} else { } else {
if (new_fp == nullptr) return nullptr; // skip AddressIsReadable() below if (new_fp == nullptr) return nullptr; // skip AddressIsReadable() below
// In the non-strict mode, allow discontiguous stack frames. // In the non-strict mode, allow discontiguous stack frames.
@ -296,13 +310,17 @@ static int UnwindImpl(void **result, int *sizes, int max_depth, int skip_count,
int n = 0; int n = 0;
void **fp = reinterpret_cast<void **>(__builtin_frame_address(0)); void **fp = reinterpret_cast<void **>(__builtin_frame_address(0));
size_t stack_low = getpagesize(); // Assume that the first page is not stack.
size_t stack_high = std::numeric_limits<size_t>::max() - sizeof(void *);
while (fp && n < max_depth) { while (fp && n < max_depth) {
if (*(fp + 1) == reinterpret_cast<void *>(0)) { if (*(fp + 1) == reinterpret_cast<void *>(0)) {
// In 64-bit code, we often see a frame that // In 64-bit code, we often see a frame that
// points to itself and has a return address of 0. // points to itself and has a return address of 0.
break; break;
} }
void **next_fp = NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(fp, ucp); void **next_fp = NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(
fp, ucp, stack_low, stack_high);
if (skip_count > 0) { if (skip_count > 0) {
skip_count--; skip_count--;
} else { } else {
@ -325,7 +343,8 @@ static int UnwindImpl(void **result, int *sizes, int max_depth, int skip_count,
const int kMaxUnwind = 1000; const int kMaxUnwind = 1000;
int j = 0; int j = 0;
for (; fp != nullptr && j < kMaxUnwind; j++) { for (; fp != nullptr && j < kMaxUnwind; j++) {
fp = NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(fp, ucp); fp = NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(fp, ucp, stack_low,
stack_high);
} }
*min_dropped_frames = j; *min_dropped_frames = j;
} }

@ -47,6 +47,7 @@ cc_library(
"//absl/container:inlined_vector", "//absl/container:inlined_vector",
"//absl/debugging:stacktrace", "//absl/debugging:stacktrace",
"//absl/debugging:symbolize", "//absl/debugging:symbolize",
"//absl/functional:function_ref",
"//absl/strings", "//absl/strings",
"//absl/strings:cord", "//absl/strings:cord",
"//absl/strings:str_format", "//absl/strings:str_format",

@ -29,6 +29,7 @@ absl_cc_library(
absl::atomic_hook absl::atomic_hook
absl::config absl::config
absl::core_headers absl::core_headers
absl::function_ref
absl::raw_logging_internal absl::raw_logging_internal
absl::inlined_vector absl::inlined_vector
absl::stacktrace absl::stacktrace

@ -161,7 +161,7 @@ bool Status::ErasePayload(absl::string_view type_url) {
} }
void Status::ForEachPayload( void Status::ForEachPayload(
const std::function<void(absl::string_view, const absl::Cord&)>& visitor) absl::FunctionRef<void(absl::string_view, const absl::Cord&)> visitor)
const { const {
if (auto* payloads = GetPayloads()) { if (auto* payloads = GetPayloads()) {
bool in_reverse = bool in_reverse =

@ -55,6 +55,7 @@
#include <string> #include <string>
#include "absl/container/inlined_vector.h" #include "absl/container/inlined_vector.h"
#include "absl/functional/function_ref.h"
#include "absl/status/internal/status_internal.h" #include "absl/status/internal/status_internal.h"
#include "absl/strings/cord.h" #include "absl/strings/cord.h"
#include "absl/strings/string_view.h" #include "absl/strings/string_view.h"
@ -590,7 +591,7 @@ class Status final {
// NOTE: Any mutation on the same 'absl::Status' object during visitation is // NOTE: Any mutation on the same 'absl::Status' object during visitation is
// forbidden and could result in undefined behavior. // forbidden and could result in undefined behavior.
void ForEachPayload( void ForEachPayload(
const std::function<void(absl::string_view, const absl::Cord&)>& visitor) absl::FunctionRef<void(absl::string_view, const absl::Cord&)> visitor)
const; const;
private: private:

@ -37,7 +37,7 @@ class CordzInfo;
// Default feature enable states for cord ring buffers // Default feature enable states for cord ring buffers
enum CordFeatureDefaults { enum CordFeatureDefaults {
kCordEnableBtreeDefault = false, kCordEnableBtreeDefault = true,
kCordEnableRingBufferDefault = false, kCordEnableRingBufferDefault = false,
kCordShallowSubcordsDefault = false kCordShallowSubcordsDefault = false
}; };

Loading…
Cancel
Save