2018-06-18 23:17:19 +00:00
|
|
|
#ifndef __TRACYCALLSTACK_HPP__
|
|
|
|
#define __TRACYCALLSTACK_HPP__
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
# define TRACY_HAS_CALLSTACK
|
|
|
|
# ifndef MAXLONG
|
|
|
|
extern "C" __declspec(dllimport) unsigned short __stdcall RtlCaptureStackBackTrace( unsigned long, unsigned long, void**, unsigned long* );
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef TRACY_HAS_CALLSTACK
|
|
|
|
|
2018-06-19 16:49:13 +00:00
|
|
|
#include <assert.h>
|
2018-06-18 23:17:19 +00:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "../common/TracyAlloc.hpp"
|
|
|
|
#include "../common/TracyForceInline.hpp"
|
|
|
|
|
|
|
|
namespace tracy
|
|
|
|
{
|
|
|
|
|
|
|
|
struct CallstackEntry
|
|
|
|
{
|
|
|
|
const char* name;
|
|
|
|
const char* file;
|
|
|
|
uint32_t line;
|
|
|
|
};
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
|
|
|
void InitCallstack();
|
|
|
|
CallstackEntry DecodeCallstackPtr( uint64_t ptr );
|
|
|
|
|
2018-06-19 16:49:13 +00:00
|
|
|
static tracy_force_inline void* Callstack( int depth )
|
2018-06-18 23:17:19 +00:00
|
|
|
{
|
2018-06-19 16:49:13 +00:00
|
|
|
assert( depth >= 1 && depth <= 63 );
|
2018-06-18 23:17:19 +00:00
|
|
|
|
2018-06-19 16:49:13 +00:00
|
|
|
auto trace = (uintptr_t*)tracy_malloc( ( 1 + depth ) * sizeof( uintptr_t ) );
|
|
|
|
const auto num = RtlCaptureStackBackTrace( 0, depth, (void**)( trace+1 ), nullptr );
|
2018-06-18 23:17:19 +00:00
|
|
|
*trace = num;
|
|
|
|
|
2018-06-19 15:27:03 +00:00
|
|
|
return trace;
|
2018-06-18 23:17:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|