diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/config.h.cmake.in | 3 | ||||
-rw-r--r-- | src/symbolize.cc | 12 | ||||
-rw-r--r-- | src/symbolize.h | 6 | ||||
-rw-r--r-- | src/symbolize_unittest.cc | 14 | ||||
-rw-r--r-- | src/utilities.h | 2 |
5 files changed, 27 insertions, 10 deletions
diff --git a/src/config.h.cmake.in b/src/config.h.cmake.in index 9d87d37..e15c737 100644 --- a/src/config.h.cmake.in +++ b/src/config.h.cmake.in @@ -130,6 +130,9 @@ /* define if your compiler has __sync_val_compare_and_swap */ #cmakedefine HAVE___SYNC_VAL_COMPARE_AND_SWAP +/* define if symbolize support is available */ +#cmakedefine HAVE_SYMBOLIZE + /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #cmakedefine LT_OBJDIR diff --git a/src/symbolize.cc b/src/symbolize.cc index 98a754f..61fe2ff 100644 --- a/src/symbolize.cc +++ b/src/symbolize.cc @@ -844,18 +844,22 @@ static ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void *pc, char *out, _END_GOOGLE_NAMESPACE_ -#elif defined(OS_WINDOWS) +#elif defined(OS_WINDOWS) || defined(OS_CYGWIN) +#include <windows.h> #include <DbgHelp.h> + +#ifdef _MSC_VER #pragma comment(lib, "DbgHelp") +#endif _START_GOOGLE_NAMESPACE_ class SymInitializer { public: - HANDLE process = NULL; - bool ready = false; - SymInitializer() { + HANDLE process; + bool ready; + SymInitializer() : process(NULL), ready(false) { // Initialize the symbol handler. // https://msdn.microsoft.com/en-us/library/windows/desktop/ms680344(v=vs.85).aspx process = GetCurrentProcess(); diff --git a/src/symbolize.h b/src/symbolize.h index 86f0c79..9ff16c1 100644 --- a/src/symbolize.h +++ b/src/symbolize.h @@ -130,9 +130,9 @@ void InstallSymbolizeCallback(SymbolizeCallback callback); // file is opened successfully, returns the file descriptor. Otherwise, // returns -1. |out_file_name_size| is the size of the file name buffer // (including the null-terminator). -typedef int (*SymbolizeOpenObjectFileCallback)(uint64_t pc, - uint64_t &start_address, - uint64_t &base_address, +typedef int (*SymbolizeOpenObjectFileCallback)(uint64 pc, + uint64 &start_address, + uint64 &base_address, char *out_file_name, int out_file_name_size); void InstallSymbolizeOpenObjectFileCallback( diff --git a/src/symbolize_unittest.cc b/src/symbolize_unittest.cc index a0a9737..413161b 100644 --- a/src/symbolize_unittest.cc +++ b/src/symbolize_unittest.cc @@ -357,10 +357,12 @@ void ATTRIBUTE_NOINLINE TestWithReturnAddress() { #endif } -# elif defined(OS_WINDOWS) +# elif defined(OS_WINDOWS) || defined(OS_CYGWIN) +#ifdef _MSC_VER #include <intrin.h> #pragma intrinsic(_ReturnAddress) +#endif struct Foo { static void func(int x); @@ -378,7 +380,13 @@ TEST(Symbolize, SymbolizeWithDemangling) { } __declspec(noinline) void TestWithReturnAddress() { - void *return_address = _ReturnAddress(); + void *return_address = +#ifdef __GNUC__ // Cygwin and MinGW support + __builtin_return_address(0) +#else + _ReturnAddress() +#endif + ; const char *symbol = TrySymbolize(return_address); CHECK(symbol != NULL); CHECK_STREQ(symbol, "main"); @@ -401,7 +409,7 @@ int main(int argc, char **argv) { TestWithPCInsideNonInlineFunction(); TestWithReturnAddress(); return RUN_ALL_TESTS(); -# elif defined(OS_WINDOWS) +# elif defined(OS_WINDOWS) || defined(OS_CYGWIN) TestWithReturnAddress(); return RUN_ALL_TESTS(); # else // OS_WINDOWS diff --git a/src/utilities.h b/src/utilities.h index be2cff4..ca21cfb 100644 --- a/src/utilities.h +++ b/src/utilities.h @@ -127,6 +127,7 @@ # define HAVE_STACKTRACE #endif +#ifndef HAVE_SYMBOLIZE // defined by gcc #if defined(__ELF__) && defined(OS_LINUX) # define HAVE_SYMBOLIZE @@ -137,6 +138,7 @@ // Use DbgHelp to symbolize # define HAVE_SYMBOLIZE #endif +#endif // !defined(HAVE_SYMBOLIZE) #ifndef ARRAYSIZE // There is a better way, but this is good enough for our purpose. |