Initial commit

This commit is contained in:
InoriRus
2021-12-01 19:29:27 +10:00
parent b1e7dcdc5d
commit 43f49c8763
1843 changed files with 1111694 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
#include "Emulator/SymbolDatabase.h"
#include "Kyty/Core/File.h"
#include "Kyty/Core/MagicEnum.h"
#include "Kyty/Core/Vector.h"
#ifdef KYTY_EMU_ENABLED
namespace Kyty::Loader {
constexpr char32_t LIB_PREFIX[] = {0x0000006c, 0x00000069, 0x00000062, 0x00000053, 0x00000063, 0x00000065, 0};
constexpr char32_t LIB_OLD[] = {0x00000047, 0x0000006e, 0x0000006d, 0};
constexpr char32_t LIB_NEW[] = {0x00000047, 0x00000072, 0x00000061, 0x00000070, 0x00000068, 0x00000069, 0x00000063, 0x00000073, 0};
static String update_name(const String& str)
{
auto ret = (str.StartsWith(LIB_PREFIX) ? str.RemoveFirst(6) : str);
return ret.ReplaceStr(LIB_OLD, LIB_NEW);
}
String SymbolDatabase::GenerateName(const SymbolResolve& s)
{
auto library = update_name(s.library);
auto module = update_name(s.module);
return String::FromPrintf("%s[%s_v%d][%s_v%d.%d][%s]", s.name.C_Str(), library.C_Str(), s.library_version, module.C_Str(),
s.module_version_major, s.module_version_minor, Core::EnumName(s.type).C_Str());
}
void SymbolDatabase::Add(const SymbolResolve& s, uint64_t vaddr)
{
SymbolRecord r {};
r.name = GenerateName(s);
r.vaddr = vaddr;
m_map.Put(r.name, m_symbols.Size());
m_symbols.Add(r);
}
void SymbolDatabase::Add(const SymbolResolve& s, uint64_t vaddr, const String& dbg_name)
{
SymbolRecord r {};
r.name = GenerateName(s);
r.vaddr = vaddr;
r.dbg_name = dbg_name;
m_map.Put(r.name, m_symbols.Size());
m_symbols.Add(r);
}
void SymbolDatabase::DbgDump(const String& folder, const String& file_name)
{
auto folder_str = folder.FixDirectorySlash();
Core::File::CreateDirectories(folder_str);
Core::File f;
f.Create(folder_str + file_name);
for (const auto& sym: m_symbols)
{
f.Printf("%" PRIx64 " %s\n", sym.vaddr, sym.name.C_Str());
}
f.Close();
}
const SymbolRecord* SymbolDatabase::Find(const SymbolResolve& s) const
{
auto index = m_map.Get(GenerateName(s), uint32_t(-1));
if (!m_symbols.IndexValid(index))
{
return nullptr;
}
return &m_symbols.At(index);
}
} // namespace Kyty::Loader
#endif // KYTY_EMU_ENABLED