diff --git a/server/TracySourceView.cpp b/server/TracySourceView.cpp index f305bcfd..cbbb805c 100644 --- a/server/TracySourceView.cpp +++ b/server/TracySourceView.cpp @@ -1,6 +1,8 @@ #include #include +#include + #include "../imgui/imgui.h" #include "TracyImGui.hpp" #include "TracyPrint.hpp" @@ -26,7 +28,7 @@ SourceView::~SourceView() delete[] m_data; } -void SourceView::Open( const char* fileName, int line, uint64_t symAddr ) +void SourceView::Open( const char* fileName, int line, uint64_t symAddr, const Worker& worker ) { m_targetLine = line; m_selectedLine = line; @@ -70,6 +72,47 @@ void SourceView::Open( const char* fileName, int line, uint64_t symAddr ) txt = end; } } + + m_asm.clear(); + if( symAddr == 0 ) return; + const auto arch = worker.GetCpuArch(); + if( arch == CpuArchUnknown ) return; + uint32_t len; + auto code = worker.GetSymbolCode( symAddr, len ); + if( !code ) return; + csh handle; + cs_err rval; + switch( arch ) + { + case CpuArchX86: + rval = cs_open( CS_ARCH_X86, CS_MODE_32, &handle ); + break; + case CpuArchX64: + rval = cs_open( CS_ARCH_X86, CS_MODE_64, &handle ); + break; + case CpuArchArm32: + rval = cs_open( CS_ARCH_ARM, CS_MODE_ARM, &handle ); + break; + case CpuArchArm64: + rval = cs_open( CS_ARCH_ARM64, CS_MODE_ARM, &handle ); + break; + default: + assert( false ); + break; + } + if( rval != CS_ERR_OK ) return; + cs_insn* insn; + size_t cnt = cs_disasm( handle, (const uint8_t*)code, len, symAddr, 0, &insn ); + if( cnt > 0 ) + { + m_asm.reserve( cnt ); + for( size_t i=0; i #include struct ImFont; @@ -15,11 +16,18 @@ class SourceView const char* end; }; + struct AsmLine + { + uint64_t addr; + std::string mnemonic; + std::string operands; + }; + public: SourceView( ImFont* font ); ~SourceView(); - void Open( const char* fileName, int line, uint64_t symAddr ); + void Open( const char* fileName, int line, uint64_t symAddr, const Worker& worker ); void Render( const Worker& worker ); private: @@ -34,6 +42,7 @@ private: int m_selectedLine; std::vector m_lines; + std::vector m_asm; }; } diff --git a/server/TracyView.cpp b/server/TracyView.cpp index ef50790f..69746a3e 100644 --- a/server/TracyView.cpp +++ b/server/TracyView.cpp @@ -196,7 +196,7 @@ void View::InitTextEditor( ImFont* font ) void View::SetTextEditorFile( const char* fileName, int line, uint64_t symAddr ) { m_sourceViewFile = fileName; - m_sourceView->Open( fileName, line, symAddr ); + m_sourceView->Open( fileName, line, symAddr, m_worker ); } const char* View::ShortenNamespace( const char* name ) const