|
|
|
http://code.google.com/p/google-glog/issues/detail?id=130
|
|
|
|
|
|
|
|
make the code work with all gcc targets
|
|
|
|
|
|
|
|
--- a/src/symbolize_unittest.cc
|
|
|
|
+++ b/src/symbolize_unittest.cc
|
|
|
|
@@ -60,9 +60,7 @@ using namespace GOOGLE_NAMESPACE;
|
|
|
|
# endif // __i386__
|
|
|
|
# else
|
|
|
|
# endif // __GNUC__ >= 4
|
|
|
|
-# if defined(__i386__) || defined(__x86_64__)
|
|
|
|
-# define TEST_X86_32_AND_64 1
|
|
|
|
-# endif // defined(__i386__) || defined(__x86_64__)
|
|
|
|
+# define TEST_WITH_LABEL_ADDRESSES
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// A wrapper function for Symbolize() to make the unit test simple.
|
|
|
|
@@ -289,22 +287,24 @@ TEST(Symbolize, SymbolizeWithDemanglingStackConsumption) {
|
|
|
|
extern "C" {
|
|
|
|
inline void* always_inline inline_func() {
|
|
|
|
register void *pc = NULL;
|
|
|
|
-#ifdef TEST_X86_32_AND_64
|
|
|
|
- __asm__ __volatile__("call 1f; 1: pop %0" : "=r"(pc));
|
|
|
|
+#ifdef TEST_WITH_LABEL_ADDRESSES
|
|
|
|
+ pc = &&curr_pc;
|
|
|
|
+ curr_pc:
|
|
|
|
#endif
|
|
|
|
return pc;
|
|
|
|
}
|
|
|
|
|
|
|
|
void* ATTRIBUTE_NOINLINE non_inline_func() {
|
|
|
|
register void *pc = NULL;
|
|
|
|
-#ifdef TEST_X86_32_AND_64
|
|
|
|
- __asm__ __volatile__("call 1f; 1: pop %0" : "=r"(pc));
|
|
|
|
+#ifdef TEST_WITH_LABEL_ADDRESSES
|
|
|
|
+ pc = &&curr_pc;
|
|
|
|
+ curr_pc:
|
|
|
|
#endif
|
|
|
|
return pc;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ATTRIBUTE_NOINLINE TestWithPCInsideNonInlineFunction() {
|
|
|
|
-#if defined(TEST_X86_32_AND_64) && defined(HAVE_ATTRIBUTE_NOINLINE)
|
|
|
|
+#if defined(TEST_WITH_LABEL_ADDRESSES) && defined(HAVE_ATTRIBUTE_NOINLINE)
|
|
|
|
void *pc = non_inline_func();
|
|
|
|
const char *symbol = TrySymbolize(pc);
|
|
|
|
CHECK(symbol != NULL);
|
|
|
|
@@ -314,7 +314,7 @@ void ATTRIBUTE_NOINLINE TestWithPCInsideNonInlineFunction() {
|
|
|
|
}
|
|
|
|
|
|
|
|
void ATTRIBUTE_NOINLINE TestWithPCInsideInlineFunction() {
|
|
|
|
-#if defined(TEST_X86_32_AND_64) && defined(HAVE_ALWAYS_INLINE)
|
|
|
|
+#if defined(TEST_WITH_LABEL_ADDRESSES) && defined(HAVE_ALWAYS_INLINE)
|
|
|
|
void *pc = inline_func(); // Must be inlined.
|
|
|
|
const char *symbol = TrySymbolize(pc);
|
|
|
|
CHECK(symbol != NULL);
|