pcsx2/pcsx2-qt/Debugger/ModuleModel.cpp

134 lines
3.8 KiB
C++

// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
#include "ModuleModel.h"
#include "QtUtils.h"
#include "fmt/format.h"
ModuleModel::ModuleModel(DebugInterface& cpu, QObject* parent)
: QAbstractTableModel(parent)
, m_cpu(cpu)
{
}
int ModuleModel::rowCount(const QModelIndex&) const
{
return m_cpu.GetModuleList().size();
}
int ModuleModel::columnCount(const QModelIndex&) const
{
return ModuleModel::COLUMN_COUNT;
}
QVariant ModuleModel::data(const QModelIndex& index, int role) const
{
size_t row = static_cast<size_t>(index.row());
if (row >= m_modules.size())
return QVariant();
const IopMod* mod = &m_modules[row];
if (role == Qt::DisplayRole)
{
switch (index.column())
{
case ModuleModel::ModuleColumns::NAME:
return mod->name.c_str();
case ModuleModel::ModuleColumns::VERSION:
return fmt::format("{}.{}", mod->version >> 8, mod->version & 0xff).c_str();
case ModuleModel::ModuleColumns::ENTRY:
return QtUtils::FilledQStringFromValue(mod->entry, 16);
case ModuleModel::ModuleColumns::GP:
return QtUtils::FilledQStringFromValue(mod->gp, 16);
case ModuleModel::ModuleColumns::TEXT_SECTION:
{
return QString("[%1 - %2]").arg(QtUtils::FilledQStringFromValue(mod->text_addr, 16), QtUtils::FilledQStringFromValue(mod->text_addr + mod->text_size - 1, 16));
}
case ModuleModel::ModuleColumns::DATA_SECTION:
{
u32 addr = mod->text_addr + mod->text_size;
return QString("[%1 - %2]").arg(QtUtils::FilledQStringFromValue(addr, 16), QtUtils::FilledQStringFromValue(addr + mod->data_size - 1, 16));
}
case ModuleModel::ModuleColumns::BSS_SECTION:
{
if (mod->bss_size == 0)
{
return "";
}
u32 addr = mod->text_addr + mod->text_size + mod->data_size;
return QString("[%1 - %2]").arg(QtUtils::FilledQStringFromValue(addr, 16), QtUtils::FilledQStringFromValue(addr + mod->bss_size - 1, 16));
}
}
}
else if (role == Qt::UserRole)
{
switch (index.column())
{
case ModuleModel::ModuleColumns::NAME:
return mod->name.c_str();
case ModuleModel::ModuleColumns::VERSION:
return mod->version;
case ModuleModel::ModuleColumns::ENTRY:
return mod->entry;
case ModuleModel::ModuleColumns::GP:
return mod->gp;
case ModuleModel::ModuleColumns::TEXT_SECTION:
return mod->text_addr;
case ModuleModel::ModuleColumns::DATA_SECTION:
return mod->text_addr + mod->text_size;
case ModuleModel::ModuleColumns::BSS_SECTION:
{
if (mod->bss_size == 0)
{
return 0;
}
return mod->text_addr + mod->text_size + mod->data_size;
}
}
}
return QVariant();
}
QVariant ModuleModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole && orientation == Qt::Horizontal)
{
switch (section)
{
case ModuleColumns::NAME:
//: Warning: short space limit. Abbreviate if needed.
return tr("NAME");
case ModuleColumns::VERSION:
//: Warning: short space limit. Abbreviate if needed.
return tr("VERSION");
case ModuleColumns::ENTRY:
//: Warning: short space limit. Abbreviate if needed. // Entrypoint of the executable
return tr("ENTRY");
case ModuleColumns::GP:
//: Warning: short space limit. Abbreviate if needed.
return tr("GP");
case ModuleColumns::TEXT_SECTION:
//: Warning: short space limit. Abbreviate if needed. // Text section of the executable
return tr("TEXT");
case ModuleColumns::DATA_SECTION:
//: Warning: short space limit. Abbreviate if needed. // Data section of the executable
return tr("DATA");
case ModuleColumns::BSS_SECTION:
//: Warning: short space limit. Abbreviate if needed. // BSS section of the executable
return tr("BSS");
default:
return QVariant();
}
}
return QVariant();
}
void ModuleModel::refreshData()
{
beginResetModel();
m_modules = m_cpu.GetModuleList();
endResetModel();
}