|
|
|
@ -35,10 +35,29 @@ |
|
|
|
|
|
|
|
|
|
using testing::Contains; |
|
|
|
|
|
|
|
|
|
#ifdef _WIN32 |
|
|
|
|
#define ABSL_SYMBOLIZE_TEST_NOINLINE __declspec(noinline) |
|
|
|
|
#else |
|
|
|
|
#define ABSL_SYMBOLIZE_TEST_NOINLINE ABSL_ATTRIBUTE_NOINLINE |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// Functions to symbolize. Use C linkage to avoid mangled names.
|
|
|
|
|
extern "C" { |
|
|
|
|
void nonstatic_func() { ABSL_BLOCK_TAIL_CALL_OPTIMIZATION(); } |
|
|
|
|
static void static_func() { ABSL_BLOCK_TAIL_CALL_OPTIMIZATION(); } |
|
|
|
|
ABSL_SYMBOLIZE_TEST_NOINLINE void nonstatic_func() { |
|
|
|
|
// The next line makes this a unique function to prevent the compiler from
|
|
|
|
|
// folding identical functions together.
|
|
|
|
|
volatile int x = __LINE__; |
|
|
|
|
static_cast<void>(x); |
|
|
|
|
ABSL_BLOCK_TAIL_CALL_OPTIMIZATION(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ABSL_SYMBOLIZE_TEST_NOINLINE static void static_func() { |
|
|
|
|
// The next line makes this a unique function to prevent the compiler from
|
|
|
|
|
// folding identical functions together.
|
|
|
|
|
volatile int x = __LINE__; |
|
|
|
|
static_cast<void>(x); |
|
|
|
|
ABSL_BLOCK_TAIL_CALL_OPTIMIZATION(); |
|
|
|
|
} |
|
|
|
|
} // extern "C"
|
|
|
|
|
|
|
|
|
|
struct Foo { |
|
|
|
@ -46,7 +65,11 @@ struct Foo { |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// A C++ method that should have a mangled name.
|
|
|
|
|
void ABSL_ATTRIBUTE_NOINLINE Foo::func(int) { |
|
|
|
|
ABSL_SYMBOLIZE_TEST_NOINLINE void Foo::func(int) { |
|
|
|
|
// The next line makes this a unique function to prevent the compiler from
|
|
|
|
|
// folding identical functions together.
|
|
|
|
|
volatile int x = __LINE__; |
|
|
|
|
static_cast<void>(x); |
|
|
|
|
ABSL_BLOCK_TAIL_CALL_OPTIMIZATION(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -449,14 +472,14 @@ void ABSL_ATTRIBUTE_NOINLINE TestWithReturnAddress() { |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#elif defined(_WIN32) && defined(_DEBUG) |
|
|
|
|
#elif defined(_WIN32) |
|
|
|
|
|
|
|
|
|
TEST(Symbolize, Basics) { |
|
|
|
|
EXPECT_STREQ("nonstatic_func", TrySymbolize((void *)(&nonstatic_func))); |
|
|
|
|
|
|
|
|
|
// The name of an internal linkage symbol is not specified; allow either a
|
|
|
|
|
// mangled or an unmangled name here.
|
|
|
|
|
const char* static_func_symbol = TrySymbolize((void *)(&static_func)); |
|
|
|
|
const char *static_func_symbol = TrySymbolize((void *)(&static_func)); |
|
|
|
|
ASSERT_TRUE(static_func_symbol != nullptr); |
|
|
|
|
EXPECT_TRUE(strstr(static_func_symbol, "static_func") != nullptr); |
|
|
|
|
|
|
|
|
@ -483,7 +506,7 @@ TEST(Symbolize, Truncation) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(Symbolize, SymbolizeWithDemangling) { |
|
|
|
|
const char* result = TrySymbolize((void *)(&Foo::func)); |
|
|
|
|
const char *result = TrySymbolize((void *)(&Foo::func)); |
|
|
|
|
ASSERT_TRUE(result != nullptr); |
|
|
|
|
EXPECT_TRUE(strstr(result, "Foo::func") != nullptr) << result; |
|
|
|
|
} |
|
|
|
|