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

Hackish support for LEA variants.

This commit is contained in:
Bartosz Taudul 2020-04-27 00:49:37 +02:00
parent 70605fc8ed
commit abd00e28b8
2 changed files with 76 additions and 8 deletions

View File

@ -365,7 +365,40 @@ bool SourceView::Disassemble( uint64_t symAddr, const Worker& worker )
assert( false ); assert( false );
break; break;
} }
m_asm.emplace_back( AsmLine { op.address, jumpAddr, op.mnemonic, op.op_str, (uint8_t)op.size, std::move( params ) } ); LeaData leaData = LeaData::none;
if( ( m_cpuArch == CpuArchX64 || m_cpuArch == CpuArchX86 ) && op.id == X86_INS_LEA )
{
assert( op.detail->x86.op_count == 2 );
assert( op.detail->x86.operands[1].type == X86_OP_MEM );
auto& mem = op.detail->x86.operands[1].mem;
if( mem.base == X86_REG_INVALID )
{
if( mem.index == X86_REG_INVALID )
{
leaData = LeaData::d;
}
else
{
leaData = mem.disp == 0 ? LeaData::i : LeaData::id;
}
}
else if( mem.base == X86_REG_RIP )
{
leaData = mem.disp == 0 ? LeaData::r : LeaData::rd;
}
else
{
if( mem.index == X86_REG_INVALID )
{
leaData = mem.disp == 0 ? LeaData::b : LeaData::bd;
}
else
{
leaData = mem.disp == 0 ? LeaData::bi : LeaData::bid;
}
}
}
m_asm.emplace_back( AsmLine { op.address, jumpAddr, op.mnemonic, op.op_str, (uint8_t)op.size, leaData, std::move( params ) } );
const auto mLen = strlen( op.mnemonic ); const auto mLen = strlen( op.mnemonic );
if( mLen > mLenMax ) mLenMax = mLen; if( mLen > mLenMax ) mLenMax = mLen;
if( op.size > bytesMax ) bytesMax = op.size; if( op.size > bytesMax ) bytesMax = op.size;
@ -1748,7 +1781,13 @@ void SourceView::RenderAsmLine( const AsmLine& line, uint32_t ipcnt, uint32_t ip
tmp[i] = c; tmp[i] = c;
} }
tmp[line.mnemonic.size()] = '\0'; tmp[line.mnemonic.size()] = '\0';
auto it = m_microArchOpMap.find( tmp ); const char* mnemonic = tmp;
if( strcmp( mnemonic, "LEA" ) == 0 )
{
static constexpr const char* LeaTable[] = { "LEA", "LEA_B", "LEA_BD", "LEA_BI", "LEA_BID", "LEA_D", "LEA_I", "LEA_ID", "LEA_R", "LEA_RD" };
mnemonic = LeaTable[(int)line.leaData];
}
auto it = m_microArchOpMap.find( mnemonic );
if( it != m_microArchOpMap.end() ) if( it != m_microArchOpMap.end() )
{ {
const auto opid = it->second; const auto opid = it->second;
@ -1836,17 +1875,17 @@ void SourceView::RenderAsmLine( const AsmLine& line, uint32_t ipcnt, uint32_t ip
bool first = true; bool first = true;
for( int i=0; i<var.descNum; i++ ) for( int i=0; i<var.descNum; i++ )
{ {
char t = '?'; const char* t = "?";
switch( var.desc[i].type ) switch( var.desc[i].type )
{ {
case 0: case 0:
t = 'I'; t = "Imm";
break; break;
case 1: case 1:
t = 'R'; t = "Reg";
break; break;
case 2: case 2:
t = 'M'; t = var.desc[i].width == 0 ? "AGen" : "Mem";
break; break;
default: default:
assert( false ); assert( false );
@ -1855,12 +1894,26 @@ void SourceView::RenderAsmLine( const AsmLine& line, uint32_t ipcnt, uint32_t ip
if( first ) if( first )
{ {
first = false; first = false;
ImGui::Text( "%c%i", t, var.desc[i].width ); if( var.desc[i].width == 0 )
{
ImGui::TextUnformatted( t );
}
else
{
ImGui::Text( "%s%i", t, var.desc[i].width );
}
} }
else else
{ {
ImGui::SameLine( 0, 0 ); ImGui::SameLine( 0, 0 );
ImGui::Text( ", %c%i", t, var.desc[i].width ); if( var.desc[i].width == 0 )
{
ImGui::Text( ", %s", t );
}
else
{
ImGui::Text( ", %s%i", t, var.desc[i].width );
}
} }
} }
ImGui::EndTooltip(); ImGui::EndTooltip();

View File

@ -53,6 +53,20 @@ class SourceView
uint16_t width; uint16_t width;
}; };
enum class LeaData : uint8_t
{
none,
b,
bd,
bi,
bid,
d,
i,
id,
r,
rd
};
struct AsmLine struct AsmLine
{ {
uint64_t addr; uint64_t addr;
@ -60,6 +74,7 @@ class SourceView
std::string mnemonic; std::string mnemonic;
std::string operands; std::string operands;
uint8_t len; uint8_t len;
LeaData leaData;
std::vector<AsmOpParams> params; std::vector<AsmOpParams> params;
}; };