This commit is contained in:
Amber Brault 2024-11-12 11:31:14 +01:00 committed by GitHub
commit 213ce6ac36
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 73 additions and 19 deletions

View File

@ -44,6 +44,7 @@ struct Symbol
std::string name; std::string name;
std::string function_name; // stripped function name std::string function_name; // stripped function name
std::string object_name; // name of object/source file symbol belongs to
std::vector<SCall> callers; // addresses of functions that call this function std::vector<SCall> callers; // addresses of functions that call this function
std::vector<SCall> calls; // addresses of functions that are called by this function std::vector<SCall> calls; // addresses of functions that are called by this function
u32 hash = 0; // use for HLE function finding u32 hash = 0; // use for HLE function finding

View File

@ -605,7 +605,9 @@ bool CBoot::BootUp(Core::System& system, const Core::CPUThreadGuard& guard,
ppc_state.pc = executable.reader->GetEntryPoint(); ppc_state.pc = executable.reader->GetEntryPoint();
if (executable.reader->LoadSymbols(guard, system.GetPPCSymbolDB())) const std::string filename = PathToFileName(executable.path);
if (executable.reader->LoadSymbols(guard, system.GetPPCSymbolDB(), filename))
{ {
Host_PPCSymbolsChanged(); Host_PPCSymbolsChanged();
HLE::PatchFunctions(system); HLE::PatchFunctions(system);

View File

@ -215,7 +215,8 @@ public:
virtual bool IsValid() const = 0; virtual bool IsValid() const = 0;
virtual bool IsWii() const = 0; virtual bool IsWii() const = 0;
virtual bool LoadIntoMemory(Core::System& system, bool only_in_mem1 = false) const = 0; virtual bool LoadIntoMemory(Core::System& system, bool only_in_mem1 = false) const = 0;
virtual bool LoadSymbols(const Core::CPUThreadGuard& guard, PPCSymbolDB& ppc_symbol_db) const = 0; virtual bool LoadSymbols(const Core::CPUThreadGuard& guard, PPCSymbolDB& ppc_symbol_db,
const std::string& filename) const = 0;
protected: protected:
std::vector<u8> m_bytes; std::vector<u8> m_bytes;

View File

@ -27,7 +27,8 @@ public:
bool IsAncast() const { return m_is_ancast; } bool IsAncast() const { return m_is_ancast; }
u32 GetEntryPoint() const override { return m_dolheader.entryPoint; } u32 GetEntryPoint() const override { return m_dolheader.entryPoint; }
bool LoadIntoMemory(Core::System& system, bool only_in_mem1 = false) const override; bool LoadIntoMemory(Core::System& system, bool only_in_mem1 = false) const override;
bool LoadSymbols(const Core::CPUThreadGuard& guard, PPCSymbolDB& ppc_symbol_db) const override bool LoadSymbols(const Core::CPUThreadGuard& guard, PPCSymbolDB& ppc_symbol_db,
const std::string& filename) const override
{ {
return false; return false;
} }

View File

@ -180,7 +180,8 @@ SectionID ElfReader::GetSectionByName(const char* name, int firstSection) const
return -1; return -1;
} }
bool ElfReader::LoadSymbols(const Core::CPUThreadGuard& guard, PPCSymbolDB& ppc_symbol_db) const bool ElfReader::LoadSymbols(const Core::CPUThreadGuard& guard, PPCSymbolDB& ppc_symbol_db,
const std::string& filename) const
{ {
bool hasSymbols = false; bool hasSymbols = false;
SectionID sec = GetSectionByName(".symtab"); SectionID sec = GetSectionByName(".symtab");
@ -218,7 +219,7 @@ bool ElfReader::LoadSymbols(const Core::CPUThreadGuard& guard, PPCSymbolDB& ppc_
default: default:
continue; continue;
} }
ppc_symbol_db.AddKnownSymbol(guard, value, size, name, symtype); ppc_symbol_db.AddKnownSymbol(guard, value, size, name, filename, symtype);
hasSymbols = true; hasSymbols = true;
} }
} }

View File

@ -36,7 +36,8 @@ public:
u32 GetEntryPoint() const override { return entryPoint; } u32 GetEntryPoint() const override { return entryPoint; }
u32 GetFlags() const { return (u32)(header->e_flags); } u32 GetFlags() const { return (u32)(header->e_flags); }
bool LoadIntoMemory(Core::System& system, bool only_in_mem1 = false) const override; bool LoadIntoMemory(Core::System& system, bool only_in_mem1 = false) const override;
bool LoadSymbols(const Core::CPUThreadGuard& guard, PPCSymbolDB& ppc_symbol_db) const override; bool LoadSymbols(const Core::CPUThreadGuard& guard, PPCSymbolDB& ppc_symbol_db,
const std::string& filename) const override;
// TODO: actually check for validity. // TODO: actually check for validity.
bool IsValid() const override { return true; } bool IsValid() const override { return true; }
bool IsWii() const override; bool IsWii() const override;

View File

@ -375,6 +375,7 @@ void RSOView::LoadAll(const Core::CPUThreadGuard& guard, u32 address)
void RSOView::Apply(const Core::CPUThreadGuard& guard, PPCSymbolDB* symbol_db) const void RSOView::Apply(const Core::CPUThreadGuard& guard, PPCSymbolDB* symbol_db) const
{ {
const std::string rso_name = GetName();
for (const RSOExport& rso_export : GetExports()) for (const RSOExport& rso_export : GetExports())
{ {
u32 address = GetExportAddress(rso_export); u32 address = GetExportAddress(rso_export);
@ -389,15 +390,17 @@ void RSOView::Apply(const Core::CPUThreadGuard& guard, PPCSymbolDB* symbol_db) c
{ {
// Function symbol // Function symbol
symbol->Rename(export_name); symbol->Rename(export_name);
symbol->object_name = rso_name;
} }
else else
{ {
// Data symbol // Data symbol
symbol_db->AddKnownSymbol(guard, address, 0, export_name, Common::Symbol::Type::Data); symbol_db->AddKnownSymbol(guard, address, 0, export_name, rso_name,
Common::Symbol::Type::Data);
} }
} }
} }
DEBUG_LOG_FMT(SYMBOLS, "RSO({}): {} symbols applied", GetName(), GetExportsCount()); DEBUG_LOG_FMT(SYMBOLS, "RSO({}): {} symbols applied", rso_name, GetExportsCount());
} }
u32 RSOView::GetNextEntry() const u32 RSOView::GetNextEntry() const

View File

@ -49,7 +49,8 @@ Common::Symbol* PPCSymbolDB::AddFunction(const Core::CPUThreadGuard& guard, u32
} }
void PPCSymbolDB::AddKnownSymbol(const Core::CPUThreadGuard& guard, u32 startAddr, u32 size, void PPCSymbolDB::AddKnownSymbol(const Core::CPUThreadGuard& guard, u32 startAddr, u32 size,
const std::string& name, Common::Symbol::Type type) const std::string& name, const std::string& object_name,
Common::Symbol::Type type)
{ {
auto iter = m_functions.find(startAddr); auto iter = m_functions.find(startAddr);
if (iter != m_functions.end()) if (iter != m_functions.end())
@ -57,6 +58,7 @@ void PPCSymbolDB::AddKnownSymbol(const Core::CPUThreadGuard& guard, u32 startAdd
// already got it, let's just update name, checksum & size to be sure. // already got it, let's just update name, checksum & size to be sure.
Common::Symbol* tempfunc = &iter->second; Common::Symbol* tempfunc = &iter->second;
tempfunc->Rename(name); tempfunc->Rename(name);
tempfunc->object_name = object_name;
tempfunc->hash = HashSignatureDB::ComputeCodeChecksum(guard, startAddr, startAddr + size - 4); tempfunc->hash = HashSignatureDB::ComputeCodeChecksum(guard, startAddr, startAddr + size - 4);
tempfunc->type = type; tempfunc->type = type;
tempfunc->size = size; tempfunc->size = size;
@ -65,6 +67,7 @@ void PPCSymbolDB::AddKnownSymbol(const Core::CPUThreadGuard& guard, u32 startAdd
{ {
// new symbol. run analyze. // new symbol. run analyze.
auto& new_symbol = m_functions.emplace(startAddr, name).first->second; auto& new_symbol = m_functions.emplace(startAddr, name).first->second;
new_symbol.object_name = object_name;
new_symbol.type = type; new_symbol.type = type;
new_symbol.address = startAddr; new_symbol.address = startAddr;
@ -399,6 +402,13 @@ bool PPCSymbolDB::LoadMap(const Core::CPUThreadGuard& guard, const std::string&
if (name[strlen(name) - 1] == '\r') if (name[strlen(name) - 1] == '\r')
name[strlen(name) - 1] = 0; name[strlen(name) - 1] = 0;
// Split the current name string into separate parts, and get the object name
// if it exists.
const std::vector<std::string> parts = SplitString(name, '\t');
const std::string name_string(StripWhitespace(parts[0]));
const std::string object_filename_string =
parts.size() > 1 ? std::string(StripWhitespace(parts[1])) : "";
// Check if this is a valid entry. // Check if this is a valid entry.
if (strlen(name) > 0) if (strlen(name) > 0)
{ {
@ -435,7 +445,7 @@ bool PPCSymbolDB::LoadMap(const Core::CPUThreadGuard& guard, const std::string&
if (good) if (good)
{ {
++good_count; ++good_count;
AddKnownSymbol(guard, vaddress, size, name, type); AddKnownSymbol(guard, vaddress, size, name_string, object_filename_string, type);
} }
else else
{ {
@ -473,8 +483,13 @@ bool PPCSymbolDB::SaveSymbolMap(const std::string& filename) const
for (const auto& symbol : function_symbols) for (const auto& symbol : function_symbols)
{ {
// Write symbol address, size, virtual address, alignment, name // Write symbol address, size, virtual address, alignment, name
f.WriteString(fmt::format("{0:08x} {1:08x} {2:08x} {3} {4}\n", symbol->address, symbol->size, std::string line = fmt::format("{0:08x} {1:06x} {2:08x} {3} {4}", symbol->address, symbol->size,
symbol->address, 0, symbol->name)); symbol->address, 0, symbol->name);
// Also write the object name if it exists
if (!symbol->object_name.empty())
line += fmt::format(" \t{0}", symbol->object_name);
line += "\n";
f.WriteString(line);
} }
// Write .data section // Write .data section
@ -482,8 +497,13 @@ bool PPCSymbolDB::SaveSymbolMap(const std::string& filename) const
for (const auto& symbol : data_symbols) for (const auto& symbol : data_symbols)
{ {
// Write symbol address, size, virtual address, alignment, name // Write symbol address, size, virtual address, alignment, name
f.WriteString(fmt::format("{0:08x} {1:08x} {2:08x} {3} {4}\n", symbol->address, symbol->size, std::string line = fmt::format("{0:08x} {1:06x} {2:08x} {3} {4}", symbol->address, symbol->size,
symbol->address, 0, symbol->name)); symbol->address, 0, symbol->name);
// Also write the object name if it exists
if (!symbol->object_name.empty())
line += fmt::format(" \t{0}", symbol->object_name);
line += "\n";
f.WriteString(line);
} }
return true; return true;

View File

@ -23,7 +23,7 @@ public:
Common::Symbol* AddFunction(const Core::CPUThreadGuard& guard, u32 start_addr) override; Common::Symbol* AddFunction(const Core::CPUThreadGuard& guard, u32 start_addr) override;
void AddKnownSymbol(const Core::CPUThreadGuard& guard, u32 startAddr, u32 size, void AddKnownSymbol(const Core::CPUThreadGuard& guard, u32 startAddr, u32 size,
const std::string& name, const std::string& name, const std::string& object_name,
Common::Symbol::Type type = Common::Symbol::Type::Function); Common::Symbol::Type type = Common::Symbol::Type::Function);
Common::Symbol* GetSymbolFromAddr(u32 addr) override; Common::Symbol* GetSymbolFromAddr(u32 addr) override;

View File

@ -379,6 +379,12 @@ void CodeWidget::UpdateSymbols()
{ {
QString name = QString::fromStdString(symbol.second.name); QString name = QString::fromStdString(symbol.second.name);
// If the symbol has an object name, add it to the entry name.
if (!symbol.second.object_name.empty())
{
name += QString::fromStdString(fmt::format(" ({})", symbol.second.object_name));
}
auto* item = new QListWidgetItem(name); auto* item = new QListWidgetItem(name);
if (name == selection) if (name == selection)
item->setSelected(true); item->setSelected(true);
@ -408,8 +414,17 @@ void CodeWidget::UpdateFunctionCalls(const Common::Symbol* symbol)
if (call_symbol) if (call_symbol)
{ {
const QString name = QString name;
QString::fromStdString(fmt::format("> {} ({:08x})", call_symbol->name, addr));
if (!call_symbol->object_name.empty())
{
name = QString::fromStdString(
fmt::format("< {} ({}, {:08x})", call_symbol->name, call_symbol->object_name, addr));
}
else
{
name = QString::fromStdString(fmt::format("< {} ({:08x})", call_symbol->name, addr));
}
if (!name.contains(filter, Qt::CaseInsensitive)) if (!name.contains(filter, Qt::CaseInsensitive))
continue; continue;
@ -433,8 +448,17 @@ void CodeWidget::UpdateFunctionCallers(const Common::Symbol* symbol)
if (caller_symbol) if (caller_symbol)
{ {
const QString name = QString name;
QString::fromStdString(fmt::format("< {} ({:08x})", caller_symbol->name, addr));
if (!caller_symbol->object_name.empty())
{
name = QString::fromStdString(fmt::format("< {} ({}, {:08x})", caller_symbol->name,
caller_symbol->object_name, addr));
}
else
{
name = QString::fromStdString(fmt::format("< {} ({:08x})", caller_symbol->name, addr));
}
if (!name.contains(filter, Qt::CaseInsensitive)) if (!name.contains(filter, Qt::CaseInsensitive))
continue; continue;