Print Arm machine code as a 4-byte number would be printed.

This commit is contained in:
Bartosz Taudul 2020-11-28 13:24:56 +01:00
parent 7dfdad2e02
commit 3495a5a678

View File

@ -1652,9 +1652,10 @@ void SourceView::RenderSymbolSourceView( uint32_t iptotal, unordered_flat_map<ui
} }
} }
static int PrintHexBytes( char* buf, const uint8_t* bytes, size_t len )
{
static constexpr char HexPrint[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; static constexpr char HexPrint[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
static int PrintHexBytesRaw( char* buf, const uint8_t* bytes, size_t len )
{
const auto start = buf; const auto start = buf;
for( size_t i=0; i<len; i++ ) for( size_t i=0; i<len; i++ )
{ {
@ -1667,6 +1668,37 @@ static int PrintHexBytes( char* buf, const uint8_t* bytes, size_t len )
return buf - start; return buf - start;
} }
static int PrintHexBytesArm( char* buf, const uint8_t* bytes )
{
const auto start = buf;
for( int i=3; i>=0; i-- )
{
const auto byte = bytes[i];
*buf++ = HexPrint[byte >> 4];
*buf++ = HexPrint[byte & 0xF];
*buf++ = ' ';
}
*--buf = '\0';
return buf - start;
}
static int PrintHexBytes( char* buf, const uint8_t* bytes, size_t len, CpuArchitecture arch )
{
switch( arch )
{
case CpuArchX86:
case CpuArchX64:
return PrintHexBytesRaw( buf, bytes, len );
case CpuArchArm32:
case CpuArchArm64:
assert( len == 4 );
return PrintHexBytesArm( buf, bytes );
default:
assert( false );
return 0;
}
}
uint64_t SourceView::RenderSymbolAsmView( uint32_t iptotal, unordered_flat_map<uint64_t, uint32_t> ipcount, uint32_t ipmax, const Worker& worker, View& view ) uint64_t SourceView::RenderSymbolAsmView( uint32_t iptotal, unordered_flat_map<uint64_t, uint32_t> ipcount, uint32_t ipmax, const Worker& worker, View& view )
{ {
if( m_disasmFail >= 0 ) if( m_disasmFail >= 0 )
@ -1686,7 +1718,7 @@ uint64_t SourceView::RenderSymbolAsmView( uint32_t iptotal, unordered_flat_map<u
auto bytesLeft = std::min( 16u, m_codeLen - m_disasmFail ); auto bytesLeft = std::min( 16u, m_codeLen - m_disasmFail );
auto code = worker.GetSymbolCode( m_baseAddr, m_codeLen ); auto code = worker.GetSymbolCode( m_baseAddr, m_codeLen );
assert( code ); assert( code );
PrintHexBytes( tmp, (const uint8_t*)code, bytesLeft ); PrintHexBytesRaw( tmp, (const uint8_t*)code, bytesLeft );
TextFocused( "Failure bytes:", tmp ); TextFocused( "Failure bytes:", tmp );
TextDisabledUnformatted( "Click to copy to clipboard." ); TextDisabledUnformatted( "Click to copy to clipboard." );
ImGui::EndTooltip(); ImGui::EndTooltip();
@ -2639,7 +2671,7 @@ void SourceView::RenderAsmLine( AsmLine& line, uint32_t ipcnt, uint32_t iptotal,
auto code = (const uint8_t*)worker.GetSymbolCode( m_baseAddr, m_codeLen ); auto code = (const uint8_t*)worker.GetSymbolCode( m_baseAddr, m_codeLen );
assert( code ); assert( code );
char tmp[64]; char tmp[64];
const auto len = PrintHexBytes( tmp, code + line.addr - m_baseAddr, line.len ); const auto len = PrintHexBytes( tmp, code + line.addr - m_baseAddr, line.len, worker.GetCpuArch() );
ImGui::SameLine(); ImGui::SameLine();
TextColoredUnformatted( ImVec4( 0.5, 0.5, 1, 1 ), tmp ); TextColoredUnformatted( ImVec4( 0.5, 0.5, 1, 1 ), tmp );
ImGui::SameLine( 0, 0 ); ImGui::SameLine( 0, 0 );