1
0
mirror of https://github.com/wolfpld/tracy synced 2025-04-29 12:23:53 +00:00

Add custom demangler interface.

This commit is contained in:
Bartosz Taudul 2021-12-22 18:17:48 +01:00
parent 6b59ccfe4d
commit e368266837
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3

View File

@ -545,6 +545,18 @@ CallstackEntryData DecodeCallstackPtr( uint64_t ptr )
#elif TRACY_HAS_CALLSTACK == 2 || TRACY_HAS_CALLSTACK == 3 || TRACY_HAS_CALLSTACK == 4 || TRACY_HAS_CALLSTACK == 6 #elif TRACY_HAS_CALLSTACK == 2 || TRACY_HAS_CALLSTACK == 3 || TRACY_HAS_CALLSTACK == 4 || TRACY_HAS_CALLSTACK == 6
extern "C" int ___tracy_demangle( const char* mangled, char* out, size_t len );
#ifndef TRACY_DEMANGLE
extern "C" int ___tracy_demangle( const char* mangled, char* out, size_t len )
{
if( !mangled || mangled[0] != '_' ) return 0;
int status;
abi::__cxa_demangle( mangled, out, &len, &status );
return status == 0;
}
#endif
enum { MaxCbTrace = 16 }; enum { MaxCbTrace = 16 };
struct backtrace_state* cb_bts; struct backtrace_state* cb_bts;
@ -783,17 +795,7 @@ static int CallstackDataCb( void* /*data*/, uintptr_t pc, uintptr_t lowaddr, con
{ {
symname = dlinfo.dli_sname; symname = dlinfo.dli_sname;
symoff = (char*)pc - (char*)dlinfo.dli_saddr; symoff = (char*)pc - (char*)dlinfo.dli_saddr;
if( ___tracy_demangle( symname, demangled, DemangleBufLen ) ) symname = demangled;
if( symname && symname[0] == '_' )
{
size_t len = DemangleBufLen;
int status;
abi::__cxa_demangle( symname, demangled, &len, &status );
if( status == 0 )
{
symname = demangled;
}
}
} }
if( !symname ) symname = "[unknown]"; if( !symname ) symname = "[unknown]";
@ -824,18 +826,9 @@ static int CallstackDataCb( void* /*data*/, uintptr_t pc, uintptr_t lowaddr, con
{ {
function = "[unknown]"; function = "[unknown]";
} }
else else if( ___tracy_demangle( function, demangled, DemangleBufLen ) )
{ {
if( function[0] == '_' ) function = demangled;
{
size_t len = DemangleBufLen;
int status;
abi::__cxa_demangle( function, demangled, &len, &status );
if( status == 0 )
{
function = demangled;
}
}
} }
cb_data[cb_num].name = CopyStringFast( function ); cb_data[cb_num].name = CopyStringFast( function );
@ -967,7 +960,9 @@ CallstackEntryData DecodeCallstackPtr( uint64_t ptr )
static CallstackEntry cb; static CallstackEntry cb;
cb.line = 0; cb.line = 0;
char* demangled = nullptr; enum { DemangleBufLen = 64*1024 };
char demangled[DemangleBufLen];
const char* symname = nullptr; const char* symname = nullptr;
const char* symloc = nullptr; const char* symloc = nullptr;
auto vptr = (void*)ptr; auto vptr = (void*)ptr;
@ -981,17 +976,7 @@ CallstackEntryData DecodeCallstackPtr( uint64_t ptr )
symname = dlinfo.dli_sname; symname = dlinfo.dli_sname;
symoff = (char*)ptr - (char*)dlinfo.dli_saddr; symoff = (char*)ptr - (char*)dlinfo.dli_saddr;
symaddr = dlinfo.dli_saddr; symaddr = dlinfo.dli_saddr;
if( ___tracy_demangle( symname, demangled, DemangleBufLen ) ) symname = demangled;
if( symname && symname[0] == '_' )
{
size_t len = 0;
int status;
demangled = abi::__cxa_demangle( symname, nullptr, &len, &status );
if( status == 0 )
{
symname = demangled;
}
}
} }
if( !symname ) symname = "[unknown]"; if( !symname ) symname = "[unknown]";
@ -1017,8 +1002,6 @@ CallstackEntryData DecodeCallstackPtr( uint64_t ptr )
cb.symLen = 0; cb.symLen = 0;
cb.symAddr = (uint64_t)symaddr; cb.symAddr = (uint64_t)symaddr;
if( demangled ) free( demangled );
return { &cb, 1, symloc }; return { &cb, 1, symloc };
} }