PPU Analyzer: Move ppu_function::callers to lower sizeof(ppu_function)

This commit is contained in:
Elad 2025-01-16 12:30:50 +02:00
parent ff89a08ee4
commit 5a5e475c6e
3 changed files with 20 additions and 17 deletions

View File

@ -548,12 +548,22 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
// Known TOCs (usually only 1) // Known TOCs (usually only 1)
std::unordered_set<u32> TOCs; std::unordered_set<u32> TOCs;
struct ppu_function_ext : ppu_function
{
//u32 stack_frame = 0;
u32 single_target = 0;
u32 trampoline = 0;
bs_t<ppu_attr> attr{};
std::set<u32> callers{};
};
// Known functions // Known functions
std::map<u32, ppu_function> fmap; std::map<u32, ppu_function_ext> fmap;
std::set<u32> known_functions; std::set<u32> known_functions;
// Function analysis workload // Function analysis workload
std::vector<std::reference_wrapper<ppu_function>> func_queue; std::vector<std::reference_wrapper<ppu_function_ext>> func_queue;
// Known references (within segs, addr and value alignment = 4) // Known references (within segs, addr and value alignment = 4)
std::set<u32> addr_heap; std::set<u32> addr_heap;
@ -607,9 +617,9 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
}; };
// Register new function // Register new function
auto add_func = [&](u32 addr, u32 toc, u32 caller) -> ppu_function& auto add_func = [&](u32 addr, u32 toc, u32 caller) -> ppu_function_ext&
{ {
ppu_function& func = fmap[addr]; ppu_function_ext& func = fmap[addr];
if (caller) if (caller)
{ {
@ -998,7 +1008,7 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
return false; return false;
} }
ppu_function& func = func_queue[i]; ppu_function_ext& func = func_queue[i];
// Fixup TOCs // Fixup TOCs
if (func.toc && func.toc != umax) if (func.toc && func.toc != umax)
@ -1006,7 +1016,7 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
// Fixup callers // Fixup callers
for (u32 addr : func.callers) for (u32 addr : func.callers)
{ {
ppu_function& caller = fmap[addr]; ppu_function_ext& caller = fmap[addr];
if (!caller.toc) if (!caller.toc)
{ {
@ -1035,7 +1045,7 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
{ {
if (target < func.addr || target >= func.addr + func.size) if (target < func.addr || target >= func.addr + func.size)
{ {
ppu_function& callee = fmap[target]; ppu_function_ext& callee = fmap[target];
if (!callee.toc) if (!callee.toc)
{ {
@ -1062,7 +1072,7 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
// For trampoline functions // For trampoline functions
if (func.single_target) if (func.single_target)
{ {
ppu_function& callee = fmap[func.single_target]; ppu_function_ext& callee = fmap[func.single_target];
if (!callee.toc) if (!callee.toc)
{ {
@ -2128,7 +2138,7 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
// Convert map to vector (destructive) // Convert map to vector (destructive)
for (auto it = fmap.begin(); it != fmap.end(); it = fmap.begin()) for (auto it = fmap.begin(); it != fmap.end(); it = fmap.begin())
{ {
ppu_function block = std::move(fmap.extract(it).mapped()); ppu_function_ext block = std::move(fmap.extract(it).mapped());
if (block.attr & ppu_attr::no_size && block.size > 4 && !used_fallback) if (block.attr & ppu_attr::no_size && block.size > 4 && !used_fallback)
{ {
@ -2140,7 +2150,6 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
i.addr = addr; i.addr = addr;
i.size = 4; i.size = 4;
i.toc = block.toc; i.toc = block.toc;
i.attr = ppu_attr::no_size;
} }
per_instruction_bytes += block.size; per_instruction_bytes += block.size;

View File

@ -30,14 +30,8 @@ struct ppu_function
u32 addr = 0; u32 addr = 0;
u32 toc = 0; u32 toc = 0;
u32 size = 0; u32 size = 0;
bs_t<ppu_attr> attr{};
//u32 stack_frame = 0;
u32 single_target = 0;
u32 trampoline = 0;
std::map<u32, u32> blocks{}; // Basic blocks: addr -> size std::map<u32, u32> blocks{}; // Basic blocks: addr -> size
std::set<u32> callers{};
struct iterator struct iterator
{ {

View File

@ -188,7 +188,7 @@ Function* PPUTranslator::Translate(const ppu_function& info)
// Instruction address is (m_addr + base) // Instruction address is (m_addr + base)
const u64 base = m_reloc ? m_reloc->addr : 0; const u64 base = m_reloc ? m_reloc->addr : 0;
m_addr = info.addr - base; m_addr = info.addr - base;
m_attr = m_info.attr + info.attr; m_attr = m_info.attr;
m_function = m_module->getFunction(fmt::format("__0x%x", m_addr)); m_function = m_module->getFunction(fmt::format("__0x%x", m_addr));