Update webrtc's abseil-cpp
Copy external/abseil-cpp into webrtc to update to version 20211102.0 to pick up changes that fix compiling against musl libc. Bug: 190084016 Test: m USE_HOST_MUSL=true host-native Test: m checkbuild Change-Id: I0ab600cd8db93a55eda8358cdbecd21c2f78d8fb
This commit is contained in:
@ -27,11 +27,13 @@
|
||||
#include "gtest/gtest.h"
|
||||
#include "absl/base/attributes.h"
|
||||
#include "absl/base/casts.h"
|
||||
#include "absl/base/config.h"
|
||||
#include "absl/base/internal/per_thread_tls.h"
|
||||
#include "absl/base/internal/raw_logging.h"
|
||||
#include "absl/base/optimization.h"
|
||||
#include "absl/debugging/internal/stack_consumption.h"
|
||||
#include "absl/memory/memory.h"
|
||||
#include "absl/strings/string_view.h"
|
||||
|
||||
using testing::Contains;
|
||||
|
||||
@ -144,7 +146,22 @@ static const char *TrySymbolize(void *pc) {
|
||||
return TrySymbolizeWithLimit(pc, sizeof(try_symbolize_buffer));
|
||||
}
|
||||
|
||||
#ifdef ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE
|
||||
#if defined(ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE) || \
|
||||
defined(ABSL_INTERNAL_HAVE_DARWIN_SYMBOLIZE) || \
|
||||
defined(ABSL_INTERNAL_HAVE_EMSCRIPTEN_SYMBOLIZE)
|
||||
|
||||
// Test with a return address.
|
||||
void ABSL_ATTRIBUTE_NOINLINE TestWithReturnAddress() {
|
||||
#if defined(ABSL_HAVE_ATTRIBUTE_NOINLINE)
|
||||
void *return_address = __builtin_return_address(0);
|
||||
const char *symbol = TrySymbolize(return_address);
|
||||
ABSL_RAW_CHECK(symbol != nullptr, "TestWithReturnAddress failed");
|
||||
ABSL_RAW_CHECK(strcmp(symbol, "main") == 0, "TestWithReturnAddress failed");
|
||||
std::cout << "TestWithReturnAddress passed" << std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef ABSL_INTERNAL_HAVE_EMSCRIPTEN_SYMBOLIZE
|
||||
|
||||
TEST(Symbolize, Cached) {
|
||||
// Compilers should give us pointers to them.
|
||||
@ -218,8 +235,8 @@ static const char *SymbolizeStackConsumption(void *pc, int *stack_consumed) {
|
||||
static int GetStackConsumptionUpperLimit() {
|
||||
// Symbolize stack consumption should be within 2kB.
|
||||
int stack_consumption_upper_limit = 2048;
|
||||
#if defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || \
|
||||
defined(THREAD_SANITIZER)
|
||||
#if defined(ABSL_HAVE_ADDRESS_SANITIZER) || \
|
||||
defined(ABSL_HAVE_MEMORY_SANITIZER) || defined(ABSL_HAVE_THREAD_SANITIZER)
|
||||
// Account for sanitizer instrumentation requiring additional stack space.
|
||||
stack_consumption_upper_limit *= 5;
|
||||
#endif
|
||||
@ -258,6 +275,7 @@ TEST(Symbolize, SymbolizeWithDemanglingStackConsumption) {
|
||||
|
||||
#endif // ABSL_INTERNAL_HAVE_DEBUGGING_STACK_CONSUMPTION
|
||||
|
||||
#ifndef ABSL_INTERNAL_HAVE_DARWIN_SYMBOLIZE
|
||||
// Use a 64K page size for PPC.
|
||||
const size_t kPageSize = 64 << 10;
|
||||
// We place a read-only symbols into the .text section and verify that we can
|
||||
@ -399,8 +417,8 @@ TEST(Symbolize, ForEachSection) {
|
||||
|
||||
std::vector<std::string> sections;
|
||||
ASSERT_TRUE(absl::debugging_internal::ForEachSection(
|
||||
fd, [§ions](const std::string &name, const ElfW(Shdr) &) {
|
||||
sections.push_back(name);
|
||||
fd, [§ions](const absl::string_view name, const ElfW(Shdr) &) {
|
||||
sections.emplace_back(name);
|
||||
return true;
|
||||
}));
|
||||
|
||||
@ -413,6 +431,8 @@ TEST(Symbolize, ForEachSection) {
|
||||
|
||||
close(fd);
|
||||
}
|
||||
#endif // !ABSL_INTERNAL_HAVE_DARWIN_SYMBOLIZE
|
||||
#endif // !ABSL_INTERNAL_HAVE_EMSCRIPTEN_SYMBOLIZE
|
||||
|
||||
// x86 specific tests. Uses some inline assembler.
|
||||
extern "C" {
|
||||
@ -461,17 +481,46 @@ void ABSL_ATTRIBUTE_NOINLINE TestWithPCInsideInlineFunction() {
|
||||
}
|
||||
}
|
||||
|
||||
// Test with a return address.
|
||||
void ABSL_ATTRIBUTE_NOINLINE TestWithReturnAddress() {
|
||||
#if defined(__arm__) && ABSL_HAVE_ATTRIBUTE(target)
|
||||
// Test that we correctly identify bounds of Thumb functions on ARM.
|
||||
//
|
||||
// Thumb functions have the lowest-order bit set in their addresses in the ELF
|
||||
// symbol table. This requires some extra logic to properly compute function
|
||||
// bounds. To test this logic, nudge a Thumb function right up against an ARM
|
||||
// function and try to symbolize the ARM function.
|
||||
//
|
||||
// A naive implementation will simply use the Thumb function's entry point as
|
||||
// written in the symbol table and will therefore treat the Thumb function as
|
||||
// extending one byte further in the instruction stream than it actually does.
|
||||
// When asked to symbolize the start of the ARM function, it will identify an
|
||||
// overlap between the Thumb and ARM functions, and it will return the name of
|
||||
// the Thumb function.
|
||||
//
|
||||
// A correct implementation, on the other hand, will null out the lowest-order
|
||||
// bit in the Thumb function's entry point. It will correctly compute the end of
|
||||
// the Thumb function, it will find no overlap between the Thumb and ARM
|
||||
// functions, and it will return the name of the ARM function.
|
||||
|
||||
__attribute__((target("thumb"))) int ArmThumbOverlapThumb(int x) {
|
||||
return x * x * x;
|
||||
}
|
||||
|
||||
__attribute__((target("arm"))) int ArmThumbOverlapArm(int x) {
|
||||
return x * x * x;
|
||||
}
|
||||
|
||||
void ABSL_ATTRIBUTE_NOINLINE TestArmThumbOverlap() {
|
||||
#if defined(ABSL_HAVE_ATTRIBUTE_NOINLINE)
|
||||
void *return_address = __builtin_return_address(0);
|
||||
const char *symbol = TrySymbolize(return_address);
|
||||
ABSL_RAW_CHECK(symbol != nullptr, "TestWithReturnAddress failed");
|
||||
ABSL_RAW_CHECK(strcmp(symbol, "main") == 0, "TestWithReturnAddress failed");
|
||||
std::cout << "TestWithReturnAddress passed" << std::endl;
|
||||
const char *symbol = TrySymbolize((void *)&ArmThumbOverlapArm);
|
||||
ABSL_RAW_CHECK(symbol != nullptr, "TestArmThumbOverlap failed");
|
||||
ABSL_RAW_CHECK(strcmp("ArmThumbOverlapArm()", symbol) == 0,
|
||||
"TestArmThumbOverlap failed");
|
||||
std::cout << "TestArmThumbOverlap passed" << std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // defined(__arm__) && ABSL_HAVE_ATTRIBUTE(target)
|
||||
|
||||
#elif defined(_WIN32)
|
||||
#if !defined(ABSL_CONSUME_DLL)
|
||||
|
||||
@ -514,7 +563,6 @@ TEST(Symbolize, SymbolizeWithDemangling) {
|
||||
|
||||
#endif // !defined(ABSL_CONSUME_DLL)
|
||||
#else // Symbolizer unimplemented
|
||||
|
||||
TEST(Symbolize, Unimplemented) {
|
||||
char buf[64];
|
||||
EXPECT_FALSE(absl::Symbolize((void *)(&nonstatic_func), buf, sizeof(buf)));
|
||||
@ -541,10 +589,14 @@ int main(int argc, char **argv) {
|
||||
absl::InitializeSymbolizer(argv[0]);
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
#ifdef ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE
|
||||
#if defined(ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE) || \
|
||||
defined(ABSL_INTERNAL_HAVE_DARWIN_SYMBOLIZE)
|
||||
TestWithPCInsideInlineFunction();
|
||||
TestWithPCInsideNonInlineFunction();
|
||||
TestWithReturnAddress();
|
||||
#if defined(__arm__) && ABSL_HAVE_ATTRIBUTE(target)
|
||||
TestArmThumbOverlap();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return RUN_ALL_TESTS();
|
||||
|
||||
Reference in New Issue
Block a user