PPCSymbolDB: Don't return non-const pointers
For thread safety, we shouldn't return any pointers or references that can be used to mutate the state of the PPCSymbolDB. This should be the final part of making PPCSymbolDB thread safe unless I've missed something.
This commit is contained in:
1 parent
fef77a5f20
commit
9f32562e36
15 files changed
+172
-108
No files matched your search
@@ -6,7 +6,6 @@
|
||||
#include <cstddef>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
|
||||
#include "Common/CommonTypes.h"
|
||||
@@ -104,7 +103,7 @@ public:
|
||||
{
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
virtual std::string_view GetDescription(u32 /*address*/) const = 0;
|
||||
virtual std::string GetDescription(u32 /*address*/) const = 0;
|
||||
virtual void Clear(const CPUThreadGuard& guard) = 0;
|
||||
};
|
||||
} // namespace Core
|
||||
@@ -80,7 +80,7 @@ bool GetCallstack(const Core::CPUThreadGuard& guard, std::vector<CallstackEntry>
|
||||
});
|
||||
|
||||
WalkTheStack(guard, [&output, &ppc_symbol_db](u32 func_addr) {
|
||||
std::string_view func_desc = ppc_symbol_db.GetDescription(func_addr);
|
||||
std::string func_desc = ppc_symbol_db.GetDescription(func_addr);
|
||||
if (func_desc.empty() || func_desc == "Invalid")
|
||||
func_desc = "(unknown)";
|
||||
|
||||
@@ -107,14 +107,14 @@ void PrintCallstack(const Core::CPUThreadGuard& guard, Common::Log::LogType type
|
||||
GENERIC_LOG_FMT(type, level, " LR = 0 - this is bad");
|
||||
}
|
||||
|
||||
if (const std::string_view lr_desc = ppc_symbol_db.GetDescription(LR(ppc_state));
|
||||
if (const std::string 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} ]", lr_desc, LR(ppc_state));
|
||||
}
|
||||
|
||||
WalkTheStack(guard, [type, level, &ppc_symbol_db](u32 func_addr) {
|
||||
std::string_view func_desc = ppc_symbol_db.GetDescription(func_addr);
|
||||
std::string func_desc = ppc_symbol_db.GetDescription(func_addr);
|
||||
if (func_desc.empty() || func_desc == "Invalid")
|
||||
func_desc = "(unknown)";
|
||||
GENERIC_LOG_FMT(type, level, " * {} [ addr = {:08x} ]", func_desc, func_addr);
|
||||
|
||||
@@ -439,7 +439,7 @@ u32 PPCDebugInterface::GetColor(const Core::CPUThreadGuard* guard, u32 address)
|
||||
}
|
||||
// =============
|
||||
|
||||
std::string_view PPCDebugInterface::GetDescription(u32 address) const
|
||||
std::string PPCDebugInterface::GetDescription(u32 address) const
|
||||
{
|
||||
return m_ppc_symbol_db.GetDescription(address);
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ public:
|
||||
void Step() override {}
|
||||
void RunTo(u32 address) override;
|
||||
u32 GetColor(const Core::CPUThreadGuard* guard, u32 address) const override;
|
||||
std::string_view GetDescription(u32 address) const override;
|
||||
std::string GetDescription(u32 address) const override;
|
||||
|
||||
std::shared_ptr<Core::NetworkCaptureLogger> NetworkLogger();
|
||||
|
||||
|
||||
@@ -381,7 +381,7 @@ void RSOView::Apply(const Core::CPUThreadGuard& guard, PPCSymbolDB* symbol_db) c
|
||||
u32 address = GetExportAddress(rso_export);
|
||||
if (address != 0)
|
||||
{
|
||||
Common::Symbol* symbol = symbol_db->AddFunction(guard, address);
|
||||
const Common::Symbol* symbol = symbol_db->AddFunction(guard, address);
|
||||
if (!symbol)
|
||||
symbol = symbol_db->GetSymbolFromAddr(address);
|
||||
|
||||
@@ -389,8 +389,7 @@ void RSOView::Apply(const Core::CPUThreadGuard& guard, PPCSymbolDB* symbol_db) c
|
||||
if (symbol)
|
||||
{
|
||||
// Function symbol
|
||||
symbol->Rename(export_name);
|
||||
symbol->object_name = rso_name;
|
||||
symbol_db->RenameSymbol(*symbol, export_name, rso_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -187,7 +187,7 @@ void JitBaseBlockCache::FinalizeBlock(JitBlock& block, bool block_link,
|
||||
LinkBlock(block);
|
||||
}
|
||||
|
||||
Common::Symbol* symbol = nullptr;
|
||||
const Common::Symbol* symbol = nullptr;
|
||||
if (Common::JitRegister::IsEnabled() &&
|
||||
(symbol = m_jit.m_ppc_symbol_db.GetSymbolFromAddr(block.effectiveAddress)) != nullptr)
|
||||
{
|
||||
|
||||
@@ -346,10 +346,10 @@ static void FindFunctionsFromHandlers(const Core::CPUThreadGuard& guard, PPCSymb
|
||||
if (read_result.valid && PPCTables::IsValidInstruction(read_result.hex, entry.first))
|
||||
{
|
||||
// Check if this function is already mapped
|
||||
Common::Symbol* f = func_db->AddFunction(guard, entry.first);
|
||||
const Common::Symbol* f = func_db->AddFunction(guard, entry.first);
|
||||
if (!f)
|
||||
continue;
|
||||
f->Rename(entry.second);
|
||||
func_db->RenameSymbol(*f, entry.second);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -359,8 +359,8 @@ static void FindFunctionsAfterReturnInstruction(const Core::CPUThreadGuard& guar
|
||||
{
|
||||
std::vector<u32> funcAddrs;
|
||||
|
||||
for (const auto& func : func_db->Symbols())
|
||||
funcAddrs.push_back(func.second.address + func.second.size);
|
||||
func_db->ForEachSymbol(
|
||||
[&](const Common::Symbol& symbol) { funcAddrs.push_back(symbol.address + symbol.size); });
|
||||
|
||||
auto& mmu = guard.GetSystem().GetMMU();
|
||||
for (u32& location : funcAddrs)
|
||||
@@ -380,7 +380,7 @@ static void FindFunctionsAfterReturnInstruction(const Core::CPUThreadGuard& guar
|
||||
if (read_result.valid && PPCTables::IsValidInstruction(read_result.hex, location))
|
||||
{
|
||||
// check if this function is already mapped
|
||||
Common::Symbol* f = func_db->AddFunction(guard, location);
|
||||
const Common::Symbol* f = func_db->AddFunction(guard, location);
|
||||
if (!f)
|
||||
break;
|
||||
else
|
||||
@@ -407,45 +407,45 @@ void FindFunctions(const Core::CPUThreadGuard& guard, u32 startAddr, u32 endAddr
|
||||
int numLeafs = 0, numNice = 0, numUnNice = 0;
|
||||
int numTimer = 0, numRFI = 0, numStraightLeaf = 0;
|
||||
int leafSize = 0, niceSize = 0, unniceSize = 0;
|
||||
for (auto& func : func_db->AccessSymbols())
|
||||
{
|
||||
if (func.second.address == 4)
|
||||
func_db->ForEachSymbolWithMutation([&](Common::Symbol& f) {
|
||||
if (f.address == 4)
|
||||
{
|
||||
WARN_LOG_FMT(SYMBOLS, "Weird function");
|
||||
continue;
|
||||
}
|
||||
AnalyzeFunction2(func_db, &(func.second));
|
||||
Common::Symbol& f = func.second;
|
||||
if (f.name.substr(0, 3) == "zzz")
|
||||
{
|
||||
if (f.flags & Common::FFLAG_LEAF)
|
||||
f.Rename(f.name + "_leaf");
|
||||
if (f.flags & Common::FFLAG_STRAIGHT)
|
||||
f.Rename(f.name + "_straight");
|
||||
}
|
||||
if (f.flags & Common::FFLAG_LEAF)
|
||||
{
|
||||
numLeafs++;
|
||||
leafSize += f.size;
|
||||
}
|
||||
else if (f.flags & Common::FFLAG_ONLYCALLSNICELEAFS)
|
||||
{
|
||||
numNice++;
|
||||
niceSize += f.size;
|
||||
}
|
||||
else
|
||||
{
|
||||
numUnNice++;
|
||||
unniceSize += f.size;
|
||||
}
|
||||
AnalyzeFunction2(func_db, &f);
|
||||
if (f.name.substr(0, 3) == "zzz")
|
||||
{
|
||||
if (f.flags & Common::FFLAG_LEAF)
|
||||
f.Rename(f.name + "_leaf");
|
||||
if (f.flags & Common::FFLAG_STRAIGHT)
|
||||
f.Rename(f.name + "_straight");
|
||||
}
|
||||
if (f.flags & Common::FFLAG_LEAF)
|
||||
{
|
||||
numLeafs++;
|
||||
leafSize += f.size;
|
||||
}
|
||||
else if (f.flags & Common::FFLAG_ONLYCALLSNICELEAFS)
|
||||
{
|
||||
numNice++;
|
||||
niceSize += f.size;
|
||||
}
|
||||
else
|
||||
{
|
||||
numUnNice++;
|
||||
unniceSize += f.size;
|
||||
}
|
||||
|
||||
if (f.flags & Common::FFLAG_TIMERINSTRUCTIONS)
|
||||
numTimer++;
|
||||
if (f.flags & Common::FFLAG_RFI)
|
||||
numRFI++;
|
||||
if ((f.flags & Common::FFLAG_STRAIGHT) && (f.flags & Common::FFLAG_LEAF))
|
||||
numStraightLeaf++;
|
||||
}
|
||||
if (f.flags & Common::FFLAG_TIMERINSTRUCTIONS)
|
||||
numTimer++;
|
||||
if (f.flags & Common::FFLAG_RFI)
|
||||
numRFI++;
|
||||
if ((f.flags & Common::FFLAG_STRAIGHT) && (f.flags & Common::FFLAG_LEAF))
|
||||
numStraightLeaf++;
|
||||
}
|
||||
});
|
||||
if (numLeafs == 0)
|
||||
leafSize = 0;
|
||||
else
|
||||
|
||||
@@ -35,7 +35,7 @@ PPCSymbolDB::PPCSymbolDB() = default;
|
||||
PPCSymbolDB::~PPCSymbolDB() = default;
|
||||
|
||||
// Adds the function to the list, unless it's already there
|
||||
Common::Symbol* PPCSymbolDB::AddFunction(const Core::CPUThreadGuard& guard, u32 start_addr)
|
||||
const Common::Symbol* PPCSymbolDB::AddFunction(const Core::CPUThreadGuard& guard, u32 start_addr)
|
||||
{
|
||||
std::lock_guard lock(m_mutex);
|
||||
|
||||
@@ -158,7 +158,7 @@ void PPCSymbolDB::DetermineNoteLayers(XNoteMap* notes)
|
||||
}
|
||||
}
|
||||
|
||||
Common::Symbol* PPCSymbolDB::GetSymbolFromAddr(u32 addr)
|
||||
const Common::Symbol* PPCSymbolDB::GetSymbolFromAddr(u32 addr) const
|
||||
{
|
||||
std::lock_guard lock(m_mutex);
|
||||
if (m_functions.empty())
|
||||
@@ -183,7 +183,7 @@ Common::Symbol* PPCSymbolDB::GetSymbolFromAddr(u32 addr)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Common::Note* PPCSymbolDB::GetNoteFromAddr(u32 addr)
|
||||
const Common::Note* PPCSymbolDB::GetNoteFromAddr(u32 addr) const
|
||||
{
|
||||
std::lock_guard lock(m_mutex);
|
||||
if (m_notes.empty())
|
||||
@@ -226,7 +226,7 @@ void PPCSymbolDB::DeleteNote(u32 start_address)
|
||||
m_notes.erase(start_address);
|
||||
}
|
||||
|
||||
std::string_view PPCSymbolDB::GetDescription(u32 addr)
|
||||
std::string PPCSymbolDB::GetDescription(u32 addr) const
|
||||
{
|
||||
if (const Common::Symbol* const symbol = GetSymbolFromAddr(addr))
|
||||
return symbol->name;
|
||||
|
||||
@@ -21,20 +21,20 @@ public:
|
||||
PPCSymbolDB();
|
||||
~PPCSymbolDB() override;
|
||||
|
||||
Common::Symbol* AddFunction(const Core::CPUThreadGuard& guard, u32 start_addr) override;
|
||||
const Common::Symbol* AddFunction(const Core::CPUThreadGuard& guard, u32 start_addr) override;
|
||||
void AddKnownSymbol(const Core::CPUThreadGuard& guard, u32 startAddr, u32 size,
|
||||
const std::string& name, const std::string& object_name,
|
||||
Common::Symbol::Type type = Common::Symbol::Type::Function);
|
||||
void AddKnownNote(u32 start_addr, u32 size, const std::string& name);
|
||||
|
||||
Common::Symbol* GetSymbolFromAddr(u32 addr) override;
|
||||
const Common::Symbol* GetSymbolFromAddr(u32 addr) const override;
|
||||
bool NoteExists() const { return !m_notes.empty(); }
|
||||
Common::Note* GetNoteFromAddr(u32 addr);
|
||||
const Common::Note* GetNoteFromAddr(u32 addr) const;
|
||||
void DetermineNoteLayers();
|
||||
void DeleteFunction(u32 start_address);
|
||||
void DeleteNote(u32 start_address);
|
||||
|
||||
std::string_view GetDescription(u32 addr);
|
||||
std::string GetDescription(u32 addr) const;
|
||||
|
||||
void FillInCallers();
|
||||
|
||||
|
||||
@@ -160,20 +160,18 @@ bool MEGASignatureDB::Save(const std::string& file_path) const
|
||||
|
||||
void MEGASignatureDB::Apply(const Core::CPUThreadGuard& guard, PPCSymbolDB* symbol_db) const
|
||||
{
|
||||
for (auto& it : symbol_db->AccessSymbols())
|
||||
{
|
||||
auto& symbol = it.second;
|
||||
symbol_db->ForEachSymbol([&](const Common::Symbol& symbol) {
|
||||
for (const auto& sig : m_signatures)
|
||||
{
|
||||
if (Compare(guard, symbol.address, symbol.size, sig))
|
||||
{
|
||||
symbol.name = sig.name;
|
||||
symbol_db->RenameSymbol(symbol, sig.name);
|
||||
INFO_LOG_FMT(SYMBOLS, "Found {} at {:08x} (size: {:08x})!", sig.name, symbol.address,
|
||||
symbol.size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
symbol_db->Index();
|
||||
}
|
||||
|
||||
|
||||
@@ -128,7 +128,7 @@ void HashSignatureDB::Apply(const Core::CPUThreadGuard& guard, PPCSymbolDB* symb
|
||||
for (const auto& function : symbol_db->GetSymbolsFromHash(entry.first))
|
||||
{
|
||||
// Found the function. Let's rename it according to the symbol file.
|
||||
function->Rename(entry.second.name);
|
||||
symbol_db->RenameSymbol(*function, entry.second.name);
|
||||
if (entry.second.size == static_cast<unsigned int>(function->size))
|
||||
{
|
||||
INFO_LOG_FMT(SYMBOLS, "Found {} at {:08x} (size: {:08x})!", entry.second.name,
|
||||
@@ -146,18 +146,17 @@ void HashSignatureDB::Apply(const Core::CPUThreadGuard& guard, PPCSymbolDB* symb
|
||||
|
||||
void HashSignatureDB::Populate(const PPCSymbolDB* symbol_db, const std::string& filter)
|
||||
{
|
||||
for (const auto& symbol : symbol_db->Symbols())
|
||||
{
|
||||
if ((filter.empty() && (!symbol.second.name.empty()) &&
|
||||
symbol.second.name.substr(0, 3) != "zz_" && symbol.second.name.substr(0, 1) != ".") ||
|
||||
((!filter.empty()) && symbol.second.name.substr(0, filter.size()) == filter))
|
||||
symbol_db->ForEachSymbol([&](const Common::Symbol& symbol) {
|
||||
if ((filter.empty() && (!symbol.name.empty()) && symbol.name.substr(0, 3) != "zz_" &&
|
||||
symbol.name.substr(0, 1) != ".") ||
|
||||
((!filter.empty()) && symbol.name.substr(0, filter.size()) == filter))
|
||||
{
|
||||
DBFunc temp_dbfunc;
|
||||
temp_dbfunc.name = symbol.second.name;
|
||||
temp_dbfunc.size = symbol.second.size;
|
||||
m_database[symbol.second.hash] = temp_dbfunc;
|
||||
temp_dbfunc.name = symbol.name;
|
||||
temp_dbfunc.size = symbol.size;
|
||||
m_database[symbol.hash] = temp_dbfunc;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
u32 HashSignatureDB::ComputeCodeChecksum(const Core::CPUThreadGuard& guard, u32 offsetStart,
|
||||
|
||||
Reference in new issue
Block a user