Merge pull request #2810 from Sonicadvance1/disassembler_improv
Have the disassembler show the PC next to host instructions.
This commit is contained in:
commit
3e9dac3910
|
@ -24,7 +24,7 @@ public:
|
||||||
private:
|
private:
|
||||||
disassembler m_disasm;
|
disassembler m_disasm;
|
||||||
|
|
||||||
std::string DisassembleHostBlock(const u8* code_start, const u32 code_size, u32* host_instructions_count) override;
|
std::string DisassembleHostBlock(const u8* code_start, const u32 code_size, u32* host_instructions_count, u64 starting_pc) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(HAS_LLVM)
|
#if defined(HAS_LLVM)
|
||||||
|
@ -43,7 +43,7 @@ private:
|
||||||
LLVMDisasmContextRef m_llvm_context;
|
LLVMDisasmContextRef m_llvm_context;
|
||||||
int m_instruction_size;
|
int m_instruction_size;
|
||||||
|
|
||||||
std::string DisassembleHostBlock(const u8* code_start, const u32 code_size, u32* host_instructions_count) override;
|
std::string DisassembleHostBlock(const u8* code_start, const u32 code_size, u32* host_instructions_count, u64 starting_pc) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
HostDisassemblerLLVM::HostDisassemblerLLVM(const std::string& host_disasm, int inst_size, const std::string& cpu)
|
HostDisassemblerLLVM::HostDisassemblerLLVM(const std::string& host_disasm, int inst_size, const std::string& cpu)
|
||||||
|
@ -66,7 +66,7 @@ HostDisassemblerLLVM::HostDisassemblerLLVM(const std::string& host_disasm, int i
|
||||||
m_can_disasm = true;
|
m_can_disasm = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string HostDisassemblerLLVM::DisassembleHostBlock(const u8* code_start, const u32 code_size, u32 *host_instructions_count)
|
std::string HostDisassemblerLLVM::DisassembleHostBlock(const u8* code_start, const u32 code_size, u32 *host_instructions_count, u64 starting_pc)
|
||||||
{
|
{
|
||||||
if (!m_can_disasm)
|
if (!m_can_disasm)
|
||||||
return "(No LLVM context)";
|
return "(No LLVM context)";
|
||||||
|
@ -78,7 +78,9 @@ std::string HostDisassemblerLLVM::DisassembleHostBlock(const u8* code_start, con
|
||||||
while ((u8*)disasmPtr < end)
|
while ((u8*)disasmPtr < end)
|
||||||
{
|
{
|
||||||
char inst_disasm[256];
|
char inst_disasm[256];
|
||||||
size_t inst_size = LLVMDisasmInstruction(m_llvm_context, disasmPtr, (u64)(end - disasmPtr), (u64)disasmPtr, inst_disasm, 256);
|
size_t inst_size = LLVMDisasmInstruction(m_llvm_context, disasmPtr, (u64)(end - disasmPtr), starting_pc, inst_disasm, 256);
|
||||||
|
|
||||||
|
x86_disasm << "0x" << std::hex << starting_pc << "\t";
|
||||||
if (!inst_size)
|
if (!inst_size)
|
||||||
{
|
{
|
||||||
x86_disasm << "Invalid inst:";
|
x86_disasm << "Invalid inst:";
|
||||||
|
@ -110,6 +112,7 @@ std::string HostDisassemblerLLVM::DisassembleHostBlock(const u8* code_start, con
|
||||||
{
|
{
|
||||||
x86_disasm << inst_disasm << std::endl;
|
x86_disasm << inst_disasm << std::endl;
|
||||||
disasmPtr += inst_size;
|
disasmPtr += inst_size;
|
||||||
|
starting_pc += inst_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*host_instructions_count)++;
|
(*host_instructions_count)++;
|
||||||
|
@ -124,7 +127,7 @@ HostDisassemblerX86::HostDisassemblerX86()
|
||||||
m_disasm.set_syntax_intel();
|
m_disasm.set_syntax_intel();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string HostDisassemblerX86::DisassembleHostBlock(const u8* code_start, const u32 code_size, u32* host_instructions_count)
|
std::string HostDisassemblerX86::DisassembleHostBlock(const u8* code_start, const u32 code_size, u32* host_instructions_count, u64 starting_pc)
|
||||||
{
|
{
|
||||||
u64 disasmPtr = (u64)code_start;
|
u64 disasmPtr = (u64)code_start;
|
||||||
const u8* end = code_start + code_size;
|
const u8* end = code_start + code_size;
|
||||||
|
@ -172,5 +175,5 @@ std::string DisassembleBlock(HostDisassembler* disasm, u32* address, u32* host_i
|
||||||
host_instructions_count = 0;
|
host_instructions_count = 0;
|
||||||
return "(No translation)";
|
return "(No translation)";
|
||||||
}
|
}
|
||||||
return disasm->DisassembleHostBlock(code, *code_size, host_instructions_count);
|
return disasm->DisassembleHostBlock(code, *code_size, host_instructions_count, (u64)code);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ class HostDisassembler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~HostDisassembler() {}
|
virtual ~HostDisassembler() {}
|
||||||
virtual std::string DisassembleHostBlock(const u8* code_start, const u32 code_size, u32* host_instructions_count) { return "(No disassembler)"; }
|
virtual std::string DisassembleHostBlock(const u8* code_start, const u32 code_size, u32* host_instructions_count, u64 starting_pc) { return "(No disassembler)"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
HostDisassembler* GetNewDisassembler(const std::string& arch);
|
HostDisassembler* GetNewDisassembler(const std::string& arch);
|
||||||
|
|
Loading…
Reference in New Issue