SPU Debugger: Implement viewing block hash on request

This commit is contained in:
Eladash 2024-04-03 11:47:32 +03:00 committed by Elad Ashkenazi
parent 3c46388be5
commit 33eeee0ff2
3 changed files with 35 additions and 0 deletions

View file

@ -5199,3 +5199,25 @@ std::unique_ptr<spu_recompiler_base> spu_recompiler_base::make_fast_llvm_recompi
{
return std::make_unique<spu_fast>();
}
extern std::string format_spu_func_info(u32 addr, cpu_thread* spu)
{
spu_thread* _spu = static_cast<spu_thread*>(spu);
std::unique_ptr<spu_recompiler_base> compiler = spu_recompiler_base::make_asmjit_recompiler();
compiler->init();
auto func = compiler->analyse(reinterpret_cast<const be_t<u32>*>(_spu->ls), addr);
std::string info;
{
sha1_context ctx;
u8 output[20];
sha1_starts(&ctx);
sha1_update(&ctx, reinterpret_cast<const u8*>(func.data.data()), func.data.size() * 4);
sha1_finish(&ctx, output);
fmt::append(info, "size=%d, end=0x%x, hash=%s", func.data.size(), addr + func.data.size() * 4, fmt::base57(output));
}
return info;
}

View file

@ -15,6 +15,8 @@ constexpr auto qstr = QString::fromStdString;
extern bool ppu_patch(u32 addr, u32 value);
extern std::string format_spu_func_info(u32 addr, cpu_thread* spu);
instruction_editor_dialog::instruction_editor_dialog(QWidget *parent, u32 _pc, CPUDisAsm* _disasm, std::function<cpu_thread*()> func)
: QDialog(parent)
, m_pc(_pc)
@ -58,6 +60,16 @@ instruction_editor_dialog::instruction_editor_dialog(QWidget *parent, u32 _pc, C
vbox_right_panel->addWidget(m_instr);
vbox_right_panel->addWidget(m_preview);
if (cpu && cpu->id_type() == 2)
{
// Print block information as if this instruction is its beginning
vbox_left_panel->addWidget(new QLabel(tr("Block Info: ")));
m_func_info = new QLabel("", this);
vbox_right_panel->addWidget(m_func_info);
m_func_info->setText(qstr(format_spu_func_info(m_pc, cpu)));
}
if (cpu && cpu->id_type() == 2)
{
const auto& spu = static_cast<spu_thread&>(*cpu);

View file

@ -20,6 +20,7 @@ private:
std::shared_ptr<CPUDisAsm> m_disasm; // shared in order to allow an incomplete type
QLineEdit* m_instr;
QLabel* m_preview;
QLabel* m_func_info = nullptr;
QCheckBox* m_apply_for_spu_group = nullptr;
const std::function<cpu_thread*()> m_get_cpu;