tests: Use Zydis for disassembly
This commit is contained in:
parent
f33bd69ec2
commit
59fb568b27
8 changed files with 20 additions and 29 deletions
|
@ -18,8 +18,8 @@
|
||||||
#include "dynarmic/common/assert.h"
|
#include "dynarmic/common/assert.h"
|
||||||
#include "dynarmic/common/cast_util.h"
|
#include "dynarmic/common/cast_util.h"
|
||||||
#include "dynarmic/common/common_types.h"
|
#include "dynarmic/common/common_types.h"
|
||||||
#include "dynarmic/common/llvm_disassemble.h"
|
|
||||||
#include "dynarmic/common/scope_exit.h"
|
#include "dynarmic/common/scope_exit.h"
|
||||||
|
#include "dynarmic/common/x64_disassemble.h"
|
||||||
#include "dynarmic/frontend/A32/translate/translate.h"
|
#include "dynarmic/frontend/A32/translate/translate.h"
|
||||||
#include "dynarmic/interface/A32/a32.h"
|
#include "dynarmic/interface/A32/a32.h"
|
||||||
#include "dynarmic/interface/A32/context.h"
|
#include "dynarmic/interface/A32/context.h"
|
||||||
|
@ -91,13 +91,6 @@ struct Jit::Impl {
|
||||||
jit_state.exclusive_state = 0;
|
jit_state.exclusive_state = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Disassemble(const IR::LocationDescriptor& descriptor) {
|
|
||||||
auto block = GetBasicBlock(descriptor);
|
|
||||||
std::string result = fmt::format("address: {}\nsize: {} bytes\n", block.entrypoint, block.size);
|
|
||||||
result += Common::DisassembleX64(block.entrypoint, reinterpret_cast<const char*>(block.entrypoint) + block.size);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PerformCacheInvalidation() {
|
void PerformCacheInvalidation() {
|
||||||
if (invalidate_entire_cache) {
|
if (invalidate_entire_cache) {
|
||||||
jit_state.ResetRSB();
|
jit_state.ResetRSB();
|
||||||
|
@ -324,8 +317,9 @@ void Jit::LoadContext(const Context& ctx) {
|
||||||
impl->jit_state.TransferJitState(ctx.impl->jit_state, reset_rsb);
|
impl->jit_state.TransferJitState(ctx.impl->jit_state, reset_rsb);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Jit::Disassemble() const {
|
void Jit::DumpDisassembly() const {
|
||||||
return Common::DisassembleX64(impl->block_of_code.GetCodeBegin(), impl->block_of_code.getCurr());
|
const size_t size = (const char*)impl->block_of_code.getCurr() - (const char*)impl->block_of_code.GetCodeBegin();
|
||||||
|
Common::DumpDisassembledX64(impl->block_of_code.GetCodeBegin(), size);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Dynarmic::A32
|
} // namespace Dynarmic::A32
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
#include "dynarmic/backend/x64/devirtualize.h"
|
#include "dynarmic/backend/x64/devirtualize.h"
|
||||||
#include "dynarmic/backend/x64/jitstate_info.h"
|
#include "dynarmic/backend/x64/jitstate_info.h"
|
||||||
#include "dynarmic/common/assert.h"
|
#include "dynarmic/common/assert.h"
|
||||||
#include "dynarmic/common/llvm_disassemble.h"
|
|
||||||
#include "dynarmic/common/scope_exit.h"
|
#include "dynarmic/common/scope_exit.h"
|
||||||
|
#include "dynarmic/common/x64_disassemble.h"
|
||||||
#include "dynarmic/frontend/A64/translate/translate.h"
|
#include "dynarmic/frontend/A64/translate/translate.h"
|
||||||
#include "dynarmic/interface/A64/a64.h"
|
#include "dynarmic/interface/A64/a64.h"
|
||||||
#include "dynarmic/ir/basic_block.h"
|
#include "dynarmic/ir/basic_block.h"
|
||||||
|
@ -199,8 +199,9 @@ public:
|
||||||
return is_executing;
|
return is_executing;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Disassemble() const {
|
void DumpDisassembly() const {
|
||||||
return Common::DisassembleX64(block_of_code.GetCodeBegin(), block_of_code.getCurr());
|
const size_t size = (const char*)block_of_code.getCurr() - (const char*)block_of_code.GetCodeBegin();
|
||||||
|
Common::DumpDisassembledX64(block_of_code.GetCodeBegin(), size);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -397,8 +398,8 @@ bool Jit::IsExecuting() const {
|
||||||
return impl->IsExecuting();
|
return impl->IsExecuting();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Jit::Disassemble() const {
|
void Jit::DumpDisassembly() const {
|
||||||
return impl->Disassemble();
|
return impl->DumpDisassembly();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Dynarmic::A64
|
} // namespace Dynarmic::A64
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "dynarmic/common/assert.h"
|
#include "dynarmic/common/assert.h"
|
||||||
|
#include "dynarmic/common/cast_util.h"
|
||||||
#include "dynarmic/common/common_types.h"
|
#include "dynarmic/common/common_types.h"
|
||||||
#include "dynarmic/common/llvm_disassemble.h"
|
#include "dynarmic/common/llvm_disassemble.h"
|
||||||
|
|
||||||
|
@ -48,7 +49,7 @@ std::string DisassembleX64(const void* begin, const void* end) {
|
||||||
LLVMDisasmDispose(llvm_ctx);
|
LLVMDisasmDispose(llvm_ctx);
|
||||||
#else
|
#else
|
||||||
result += fmt::format("(recompile with DYNARMIC_USE_LLVM=ON to disassemble the generated x86_64 code)\n");
|
result += fmt::format("(recompile with DYNARMIC_USE_LLVM=ON to disassemble the generated x86_64 code)\n");
|
||||||
result += fmt::format("start: {:016x}, end: {:016x}\n", begin, end);
|
result += fmt::format("start: {:016x}, end: {:016x}\n", BitCast<u64>(begin), BitCast<u64>(end));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -88,11 +88,8 @@ public:
|
||||||
return is_executing;
|
return is_executing;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/// Debugging: Dump a disassembly all compiled code to the console.
|
||||||
* Debugging: Disassemble all of compiled code.
|
void DumpDisassembly() const;
|
||||||
* @return A string containing disassembly of all host machine code produced.
|
|
||||||
*/
|
|
||||||
std::string Disassemble() const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool is_executing = false;
|
bool is_executing = false;
|
||||||
|
|
|
@ -114,11 +114,8 @@ public:
|
||||||
*/
|
*/
|
||||||
bool IsExecuting() const;
|
bool IsExecuting() const;
|
||||||
|
|
||||||
/**
|
/// Debugging: Dump a disassembly all of compiled code to the console.
|
||||||
* Debugging: Disassemble all of compiled code.
|
void DumpDisassembly() const;
|
||||||
* @return A string containing disassembly of all host machine code produced.
|
|
||||||
*/
|
|
||||||
std::string Disassemble() const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Impl;
|
struct Impl;
|
||||||
|
|
|
@ -372,7 +372,7 @@ static void RunTestInstance(Dynarmic::A32::Jit& jit,
|
||||||
fmt::print("\n");
|
fmt::print("\n");
|
||||||
|
|
||||||
fmt::print("x86_64:\n");
|
fmt::print("x86_64:\n");
|
||||||
fmt::print("{}\n", jit.Disassemble());
|
jit.DumpDisassembly();
|
||||||
|
|
||||||
fmt::print("Interrupts:\n");
|
fmt::print("Interrupts:\n");
|
||||||
for (const auto& i : uni_env.interrupts) {
|
for (const auto& i : uni_env.interrupts) {
|
||||||
|
|
|
@ -183,7 +183,8 @@ static void RunInstance(size_t run_number, ThumbTestEnv& test_env, A32Unicorn<Th
|
||||||
Optimization::DeadCodeElimination(ir_block);
|
Optimization::DeadCodeElimination(ir_block);
|
||||||
Optimization::VerificationPass(ir_block);
|
Optimization::VerificationPass(ir_block);
|
||||||
printf("\n\nIR:\n%s", IR::DumpBlock(ir_block).c_str());
|
printf("\n\nIR:\n%s", IR::DumpBlock(ir_block).c_str());
|
||||||
printf("\n\nx86_64:\n%s", jit.Disassemble().c_str());
|
printf("\n\nx86_64:\n");
|
||||||
|
jit.DumpDisassembly();
|
||||||
num_insts += ir_block.CycleCount();
|
num_insts += ir_block.CycleCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -276,7 +276,7 @@ static void RunTestInstance(Dynarmic::A64::Jit& jit, A64Unicorn& uni, A64TestEnv
|
||||||
fmt::print("{}\n", IR::DumpBlock(ir_block));
|
fmt::print("{}\n", IR::DumpBlock(ir_block));
|
||||||
|
|
||||||
fmt::print("x86_64:\n");
|
fmt::print("x86_64:\n");
|
||||||
fmt::print("{}\n", jit.Disassemble());
|
jit.DumpDisassembly();
|
||||||
|
|
||||||
fmt::print("Interrupts:\n");
|
fmt::print("Interrupts:\n");
|
||||||
for (auto& i : uni_env.interrupts) {
|
for (auto& i : uni_env.interrupts) {
|
||||||
|
|
Loading…
Reference in a new issue