PPCSymbolDB: GetDescription by std::string_view

Should save a lot of deep copies.
This commit is contained in:
mitaclaw 2024-04-12 23:25:03 -07:00
parent 1bfeeb8a63
commit 672be6a8cf
12 changed files with 49 additions and 29 deletions

View File

@ -6,6 +6,7 @@
#include <cstddef> #include <cstddef>
#include <optional> #include <optional>
#include <string> #include <string>
#include <string_view>
#include <vector> #include <vector>
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
@ -103,7 +104,7 @@ public:
{ {
return 0xFFFFFFFF; return 0xFFFFFFFF;
} }
virtual std::string GetDescription(u32 /*address*/) const = 0; virtual std::string_view GetDescription(u32 /*address*/) const = 0;
virtual void Clear(const CPUThreadGuard& guard) = 0; virtual void Clear(const CPUThreadGuard& guard) = 0;
}; };
} // namespace Core } // namespace Core

View File

@ -79,7 +79,7 @@ bool GetCallstack(const Core::CPUThreadGuard& guard, std::vector<CallstackEntry>
}); });
WalkTheStack(guard, [&output, &ppc_symbol_db](u32 func_addr) { WalkTheStack(guard, [&output, &ppc_symbol_db](u32 func_addr) {
std::string func_desc = ppc_symbol_db.GetDescription(func_addr); std::string_view func_desc = ppc_symbol_db.GetDescription(func_addr);
if (func_desc.empty() || func_desc == "Invalid") if (func_desc.empty() || func_desc == "Invalid")
func_desc = "(unknown)"; func_desc = "(unknown)";
@ -106,14 +106,14 @@ void PrintCallstack(const Core::CPUThreadGuard& guard, Common::Log::LogType type
GENERIC_LOG_FMT(type, level, " LR = 0 - this is bad"); GENERIC_LOG_FMT(type, level, " LR = 0 - this is bad");
} }
if (ppc_symbol_db.GetDescription(ppc_state.pc) != ppc_symbol_db.GetDescription(LR(ppc_state))) if (const std::string_view lr_desc = ppc_symbol_db.GetDescription(LR(ppc_state));
lr_desc != ppc_symbol_db.GetDescription(ppc_state.pc))
{ {
GENERIC_LOG_FMT(type, level, " * {} [ LR = {:08x} ]", GENERIC_LOG_FMT(type, level, " * {} [ LR = {:08x} ]", lr_desc, LR(ppc_state));
ppc_symbol_db.GetDescription(LR(ppc_state)), LR(ppc_state));
} }
WalkTheStack(guard, [type, level, &ppc_symbol_db](u32 func_addr) { WalkTheStack(guard, [type, level, &ppc_symbol_db](u32 func_addr) {
std::string func_desc = ppc_symbol_db.GetDescription(func_addr); std::string_view func_desc = ppc_symbol_db.GetDescription(func_addr);
if (func_desc.empty() || func_desc == "Invalid") if (func_desc.empty() || func_desc == "Invalid")
func_desc = "(unknown)"; func_desc = "(unknown)";
GENERIC_LOG_FMT(type, level, " * {} [ addr = {:08x} ]", func_desc, func_addr); GENERIC_LOG_FMT(type, level, " * {} [ addr = {:08x} ]", func_desc, func_addr);

View File

@ -442,7 +442,7 @@ u32 PPCDebugInterface::GetColor(const Core::CPUThreadGuard* guard, u32 address)
} }
// ============= // =============
std::string PPCDebugInterface::GetDescription(u32 address) const std::string_view PPCDebugInterface::GetDescription(u32 address) const
{ {
return m_ppc_symbol_db.GetDescription(address); return m_ppc_symbol_db.GetDescription(address);
} }

View File

@ -102,7 +102,7 @@ public:
void Step() override {} void Step() override {}
void RunToBreakpoint() override; void RunToBreakpoint() override;
u32 GetColor(const Core::CPUThreadGuard* guard, u32 address) const override; u32 GetColor(const Core::CPUThreadGuard* guard, u32 address) const override;
std::string GetDescription(u32 address) const override; std::string_view GetDescription(u32 address) const override;
std::shared_ptr<Core::NetworkCaptureLogger> NetworkLogger(); std::shared_ptr<Core::NetworkCaptureLogger> NetworkLogger();

View File

@ -108,12 +108,10 @@ Common::Symbol* PPCSymbolDB::GetSymbolFromAddr(u32 addr)
return nullptr; return nullptr;
} }
std::string PPCSymbolDB::GetDescription(u32 addr) std::string_view PPCSymbolDB::GetDescription(u32 addr)
{ {
Common::Symbol* symbol = GetSymbolFromAddr(addr); if (const Common::Symbol* const symbol = GetSymbolFromAddr(addr))
if (symbol)
return symbol->name; return symbol->name;
else
return " --- "; return " --- ";
} }

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <string> #include <string>
#include <string_view>
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/SymbolDB.h" #include "Common/SymbolDB.h"
@ -27,7 +28,7 @@ public:
Common::Symbol* GetSymbolFromAddr(u32 addr) override; Common::Symbol* GetSymbolFromAddr(u32 addr) override;
std::string GetDescription(u32 addr); std::string_view GetDescription(u32 addr);
void FillInCallers(); void FillInCallers();

View File

@ -303,6 +303,7 @@ add_executable(dolphin-emu
QtUtils/ElidedButton.h QtUtils/ElidedButton.h
QtUtils/FileOpenEventFilter.cpp QtUtils/FileOpenEventFilter.cpp
QtUtils/FileOpenEventFilter.h QtUtils/FileOpenEventFilter.h
QtUtils/FromStdString.h
QtUtils/ImageConverter.cpp QtUtils/ImageConverter.cpp
QtUtils/ImageConverter.h QtUtils/ImageConverter.h
QtUtils/ModalMessageBox.cpp QtUtils/ModalMessageBox.cpp

View File

@ -193,11 +193,8 @@ void BreakpointWidget::Update()
m_table->setItem(i, 0, active); m_table->setItem(i, 0, active);
m_table->setItem(i, 1, create_item(QStringLiteral("BP"))); m_table->setItem(i, 1, create_item(QStringLiteral("BP")));
if (ppc_symbol_db.GetSymbolFromAddr(bp.address)) if (const Common::Symbol* const symbol = ppc_symbol_db.GetSymbolFromAddr(bp.address))
{ m_table->setItem(i, 2, create_item(QString::fromStdString(symbol->name)));
m_table->setItem(
i, 2, create_item(QString::fromStdString(ppc_symbol_db.GetDescription(bp.address))));
}
m_table->setItem(i, 3, m_table->setItem(i, 3,
create_item(QStringLiteral("%1").arg(bp.address, 8, 16, QLatin1Char('0')))); create_item(QStringLiteral("%1").arg(bp.address, 8, 16, QLatin1Char('0'))));
@ -234,12 +231,8 @@ void BreakpointWidget::Update()
m_table->setItem(i, 0, active); m_table->setItem(i, 0, active);
m_table->setItem(i, 1, create_item(QStringLiteral("MBP"))); m_table->setItem(i, 1, create_item(QStringLiteral("MBP")));
if (ppc_symbol_db.GetSymbolFromAddr(mbp.start_address)) if (const Common::Symbol* const symbol = ppc_symbol_db.GetSymbolFromAddr(mbp.start_address))
{ m_table->setItem(i, 2, create_item(QString::fromStdString(symbol->name)));
m_table->setItem(
i, 2,
create_item(QString::fromStdString(ppc_symbol_db.GetDescription(mbp.start_address))));
}
if (mbp.is_ranged) if (mbp.is_ranged)
{ {

View File

@ -38,6 +38,7 @@
#include "DolphinQt/Debugger/AssembleInstructionDialog.h" #include "DolphinQt/Debugger/AssembleInstructionDialog.h"
#include "DolphinQt/Debugger/PatchInstructionDialog.h" #include "DolphinQt/Debugger/PatchInstructionDialog.h"
#include "DolphinQt/Host.h" #include "DolphinQt/Host.h"
#include "DolphinQt/QtUtils/FromStdString.h"
#include "DolphinQt/QtUtils/SetWindowDecorations.h" #include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Resources.h" #include "DolphinQt/Resources.h"
#include "DolphinQt/Settings.h" #include "DolphinQt/Settings.h"
@ -326,7 +327,7 @@ void CodeViewWidget::Update(const Core::CPUThreadGuard* guard)
std::string ins = (split == std::string::npos ? disas : disas.substr(0, split)); std::string ins = (split == std::string::npos ? disas : disas.substr(0, split));
std::string param = (split == std::string::npos ? "" : disas.substr(split + 1)); std::string param = (split == std::string::npos ? "" : disas.substr(split + 1));
std::string desc = debug_interface.GetDescription(addr); const std::string_view desc = debug_interface.GetDescription(addr);
// Adds whitespace and a minimum size to ins and param. Helps to prevent frequent resizing while // Adds whitespace and a minimum size to ins and param. Helps to prevent frequent resizing while
// scrolling. // scrolling.
@ -334,7 +335,7 @@ void CodeViewWidget::Update(const Core::CPUThreadGuard* guard)
QStringLiteral("%1").arg(QString::fromStdString(ins), -7, QLatin1Char(' ')); QStringLiteral("%1").arg(QString::fromStdString(ins), -7, QLatin1Char(' '));
const QString param_formatted = const QString param_formatted =
QStringLiteral("%1").arg(QString::fromStdString(param), -19, QLatin1Char(' ')); QStringLiteral("%1").arg(QString::fromStdString(param), -19, QLatin1Char(' '));
const QString desc_formatted = QStringLiteral("%1 ").arg(QString::fromStdString(desc)); const QString desc_formatted = QStringLiteral("%1 ").arg(QtUtils::FromStdString(desc));
auto* ins_item = new QTableWidgetItem(ins_formatted); auto* ins_item = new QTableWidgetItem(ins_formatted);
auto* param_item = new QTableWidgetItem(param_formatted); auto* param_item = new QTableWidgetItem(param_formatted);
@ -374,7 +375,7 @@ void CodeViewWidget::Update(const Core::CPUThreadGuard* guard)
branch.is_link = IsBranchInstructionWithLink(ins); branch.is_link = IsBranchInstructionWithLink(ins);
description_item->setText( description_item->setText(
tr("--> %1").arg(QString::fromStdString(debug_interface.GetDescription(branch_addr)))); tr("--> %1").arg(QtUtils::FromStdString(debug_interface.GetDescription(branch_addr))));
param_item->setForeground(dark_theme ? QColor(255, 135, 255) : Qt::magenta); param_item->setForeground(dark_theme ? QColor(255, 135, 255) : Qt::magenta);
} }

View File

@ -17,6 +17,7 @@
#include "Core/PowerPC/PowerPC.h" #include "Core/PowerPC/PowerPC.h"
#include "Core/System.h" #include "Core/System.h"
#include "DolphinQt/Host.h" #include "DolphinQt/Host.h"
#include "DolphinQt/QtUtils/FromStdString.h"
#include "DolphinQt/Settings.h" #include "DolphinQt/Settings.h"
ThreadWidget::ThreadWidget(QWidget* parent) : QDockWidget(parent) ThreadWidget::ThreadWidget(QWidget* parent) : QDockWidget(parent)
@ -461,7 +462,7 @@ void ThreadWidget::UpdateThreadCallstack(const Core::CPUThreadGuard& guard,
m_callstack_table->setItem(i, 2, new QTableWidgetItem(format_hex(lr_save))); m_callstack_table->setItem(i, 2, new QTableWidgetItem(format_hex(lr_save)));
m_callstack_table->setItem( m_callstack_table->setItem(
i, 3, i, 3,
new QTableWidgetItem(QString::fromStdString( new QTableWidgetItem(QtUtils::FromStdString(
guard.GetSystem().GetPowerPC().GetDebugInterface().GetDescription(lr_save)))); guard.GetSystem().GetPowerPC().GetDebugInterface().GetDescription(lr_save))));
} }
else else

View File

@ -396,6 +396,7 @@
<QtMoc Include="QtUtils\DoubleClickEventFilter.h" /> <QtMoc Include="QtUtils\DoubleClickEventFilter.h" />
<QtMoc Include="QtUtils\ElidedButton.h" /> <QtMoc Include="QtUtils\ElidedButton.h" />
<QtMoc Include="QtUtils\FileOpenEventFilter.h" /> <QtMoc Include="QtUtils\FileOpenEventFilter.h" />
<ClInclude Include="QtUtils\FromStdString.h" />
<QtMoc Include="QtUtils\ParallelProgressDialog.h" /> <QtMoc Include="QtUtils\ParallelProgressDialog.h" />
<QtMoc Include="QtUtils\PartiallyClosableTabWidget.h" /> <QtMoc Include="QtUtils\PartiallyClosableTabWidget.h" />
<ClInclude Include="QtUtils\SetWindowDecorations.h" /> <ClInclude Include="QtUtils\SetWindowDecorations.h" />

View File

@ -0,0 +1,23 @@
// Copyright 2024 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <QString>
#include <string_view>
namespace QtUtils
{
inline QString FromStdString(std::string_view s)
{
return QString::fromUtf8(s.data(), s.size());
}
inline QString FromStdString(std::u8string_view s)
{
return QString::fromUtf8(s.data(), s.size());
}
inline QString FromStdString(std::u16string_view s)
{
return QString::fromUtf16(s.data(), s.size());
}
} // namespace QtUtils