From 5a5e475c6ea99b09191d307178c0701ffa2602a3 Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Thu, 16 Jan 2025 12:30:50 +0200 Subject: [PATCH] PPU Analyzer: Move ppu_function::callers to lower sizeof(ppu_function) --- rpcs3/Emu/Cell/PPUAnalyser.cpp | 29 +++++++++++++++++++---------- rpcs3/Emu/Cell/PPUAnalyser.h | 6 ------ rpcs3/Emu/Cell/PPUTranslator.cpp | 2 +- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUAnalyser.cpp b/rpcs3/Emu/Cell/PPUAnalyser.cpp index f5372970b8..2d0a6ffdbf 100644 --- a/rpcs3/Emu/Cell/PPUAnalyser.cpp +++ b/rpcs3/Emu/Cell/PPUAnalyser.cpp @@ -548,12 +548,22 @@ bool ppu_module::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con // Known TOCs (usually only 1) std::unordered_set TOCs; + struct ppu_function_ext : ppu_function + { + //u32 stack_frame = 0; + u32 single_target = 0; + u32 trampoline = 0; + bs_t attr{}; + + std::set callers{}; + }; + // Known functions - std::map fmap; + std::map fmap; std::set known_functions; // Function analysis workload - std::vector> func_queue; + std::vector> func_queue; // Known references (within segs, addr and value alignment = 4) std::set addr_heap; @@ -607,9 +617,9 @@ bool ppu_module::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con }; // 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) { @@ -998,7 +1008,7 @@ bool ppu_module::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con return false; } - ppu_function& func = func_queue[i]; + ppu_function_ext& func = func_queue[i]; // Fixup TOCs if (func.toc && func.toc != umax) @@ -1006,7 +1016,7 @@ bool ppu_module::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con // Fixup callers for (u32 addr : func.callers) { - ppu_function& caller = fmap[addr]; + ppu_function_ext& caller = fmap[addr]; if (!caller.toc) { @@ -1035,7 +1045,7 @@ bool ppu_module::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con { if (target < func.addr || target >= func.addr + func.size) { - ppu_function& callee = fmap[target]; + ppu_function_ext& callee = fmap[target]; if (!callee.toc) { @@ -1062,7 +1072,7 @@ bool ppu_module::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con // For trampoline functions if (func.single_target) { - ppu_function& callee = fmap[func.single_target]; + ppu_function_ext& callee = fmap[func.single_target]; if (!callee.toc) { @@ -2128,7 +2138,7 @@ bool ppu_module::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con // Convert map to vector (destructive) 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) { @@ -2140,7 +2150,6 @@ bool ppu_module::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con i.addr = addr; i.size = 4; i.toc = block.toc; - i.attr = ppu_attr::no_size; } per_instruction_bytes += block.size; diff --git a/rpcs3/Emu/Cell/PPUAnalyser.h b/rpcs3/Emu/Cell/PPUAnalyser.h index 4d7b765ebb..7661743872 100644 --- a/rpcs3/Emu/Cell/PPUAnalyser.h +++ b/rpcs3/Emu/Cell/PPUAnalyser.h @@ -30,14 +30,8 @@ struct ppu_function u32 addr = 0; u32 toc = 0; u32 size = 0; - bs_t attr{}; - - //u32 stack_frame = 0; - u32 single_target = 0; - u32 trampoline = 0; std::map blocks{}; // Basic blocks: addr -> size - std::set callers{}; struct iterator { diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 28eb844d7c..36819b1940 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -188,7 +188,7 @@ Function* PPUTranslator::Translate(const ppu_function& info) // Instruction address is (m_addr + base) const u64 base = m_reloc ? m_reloc->addr : 0; 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));