diff --git a/client/TracyCallstack.cpp b/client/TracyCallstack.cpp index 418b0c5a..e96c6421 100644 --- a/client/TracyCallstack.cpp +++ b/client/TracyCallstack.cpp @@ -10,6 +10,8 @@ namespace tracy { +#if defined _WIN32 || defined __CYGWIN__ + void InitCallstack() { SymInitialize( GetCurrentProcess(), nullptr, true ); @@ -64,6 +66,44 @@ CallstackEntry DecodeCallstackPtr( uint64_t ptr ) return ret; } +#elif defined _GNU_SOURCE + +CallstackEntry DecodeCallstackPtr( uint64_t ptr ) +{ + CallstackEntry ret; + + const char* symname; + auto vptr = (void*)ptr; + auto sym = backtrace_symbols( &vptr, 1 ); + if( !sym ) + { + symname = "[unknown]"; + } + else + { + symname = *sym; + free( sym ); + } + + const auto namelen = strlen( symname ); + auto name = (char*)tracy_malloc( namelen + 1 ); + memcpy( name, symname, namelen ); + name[namelen] = '\0'; + + ret.name = name; + + auto unknown = (char*)tracy_malloc( 10 ); + memcpy( unknown, "[unknown]", 9 ); + unknown[9] = '\0'; + + ret.file = unknown; + ret.line = 0; + + return ret; +} + +#endif + } #endif diff --git a/client/TracyCallstack.hpp b/client/TracyCallstack.hpp index ea65bb1e..90fc1104 100644 --- a/client/TracyCallstack.hpp +++ b/client/TracyCallstack.hpp @@ -10,8 +10,12 @@ extern "C" __declspec(dllimport) unsigned short __stdcall RtlCaptureStackBackTra extern "C" __declspec(dllimport) unsigned short __stdcall RtlCaptureStackBackTrace( unsigned long, unsigned long, void**, unsigned long* ); # endif # endif +#elif defined _GNU_SOURCE +# define TRACY_HAS_CALLSTACK +# include #endif + #ifdef TRACY_HAS_CALLSTACK #include @@ -31,10 +35,11 @@ struct CallstackEntry uint32_t line; }; +CallstackEntry DecodeCallstackPtr( uint64_t ptr ); + #if defined _WIN32 || defined __CYGWIN__ void InitCallstack(); -CallstackEntry DecodeCallstackPtr( uint64_t ptr ); static tracy_force_inline void* Callstack( int depth ) { @@ -47,6 +52,21 @@ static tracy_force_inline void* Callstack( int depth ) return trace; } +#elif defined _GNU_SOURCE + +static tracy_force_inline void InitCallstack() {} + +static tracy_force_inline void* Callstack( int depth ) +{ + assert( depth >= 1 ); + + auto trace = (uintptr_t*)tracy_malloc( ( 1 + depth ) * sizeof( uintptr_t ) ); + const auto num = backtrace( (void**)(trace+1), depth ); + *trace = num; + + return trace; +} + #endif }