mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-29 22:20:48 +00:00
PPU Analyzer: Remove ppu_function::calls to lower sizeof(ppu_function)
Use blocks to get calls.
This commit is contained in:
parent
f5487e9137
commit
ff89a08ee4
@ -1003,6 +1003,7 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
|
|||||||
// Fixup TOCs
|
// Fixup TOCs
|
||||||
if (func.toc && func.toc != umax)
|
if (func.toc && func.toc != umax)
|
||||||
{
|
{
|
||||||
|
// Fixup callers
|
||||||
for (u32 addr : func.callers)
|
for (u32 addr : func.callers)
|
||||||
{
|
{
|
||||||
ppu_function& caller = fmap[addr];
|
ppu_function& caller = fmap[addr];
|
||||||
@ -1013,13 +1014,59 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (u32 addr : func.calls)
|
// Fixup callees
|
||||||
|
auto for_callee = [&](u32 addr)
|
||||||
{
|
{
|
||||||
ppu_function& callee = fmap[addr];
|
if (addr < func.addr || addr >= func.addr + func.size)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const u32 iaddr = addr;
|
||||||
|
|
||||||
|
const ppu_opcode_t op{get_ref<u32>(iaddr)};
|
||||||
|
const ppu_itype::type type = s_ppu_itype.decode(op.opcode);
|
||||||
|
|
||||||
|
if (type == ppu_itype::B || type == ppu_itype::BC)
|
||||||
|
{
|
||||||
|
const u32 target = (op.aa ? 0 : iaddr) + (type == ppu_itype::B ? +op.bt24 : +op.bt14);
|
||||||
|
|
||||||
|
if (target >= start && target < end && (!op.aa || verify_func(iaddr)))
|
||||||
|
{
|
||||||
|
if (target < func.addr || target >= func.addr + func.size)
|
||||||
|
{
|
||||||
|
ppu_function& callee = fmap[target];
|
||||||
|
|
||||||
|
if (!callee.toc)
|
||||||
|
{
|
||||||
|
add_func(target, func.toc + func.trampoline, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const auto& [addr, size] : func.blocks)
|
||||||
|
{
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
for_callee(addr + size - 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (func.size)
|
||||||
|
{
|
||||||
|
for_callee(func.addr + func.size - 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For trampoline functions
|
||||||
|
if (func.single_target)
|
||||||
|
{
|
||||||
|
ppu_function& callee = fmap[func.single_target];
|
||||||
|
|
||||||
if (!callee.toc)
|
if (!callee.toc)
|
||||||
{
|
{
|
||||||
add_func(addr, func.toc + func.trampoline, 0);
|
add_func(func.single_target, func.toc + func.trampoline, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1060,7 +1107,7 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
|
|||||||
func.size = 0x4;
|
func.size = 0x4;
|
||||||
func.blocks.emplace(func.addr, func.size);
|
func.blocks.emplace(func.addr, func.size);
|
||||||
func.attr += new_func.attr & ppu_attr::no_return;
|
func.attr += new_func.attr & ppu_attr::no_return;
|
||||||
func.calls.emplace(target);
|
func.single_target = target;
|
||||||
func.trampoline = 0;
|
func.trampoline = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1088,7 +1135,7 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
|
|||||||
func.size = 0x10;
|
func.size = 0x10;
|
||||||
func.blocks.emplace(func.addr, func.size);
|
func.blocks.emplace(func.addr, func.size);
|
||||||
func.attr += new_func.attr & ppu_attr::no_return;
|
func.attr += new_func.attr & ppu_attr::no_return;
|
||||||
func.calls.emplace(target);
|
func.single_target = target;
|
||||||
func.trampoline = 0;
|
func.trampoline = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1176,7 +1223,7 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
|
|||||||
func.size = 0x1C;
|
func.size = 0x1C;
|
||||||
func.blocks.emplace(func.addr, func.size);
|
func.blocks.emplace(func.addr, func.size);
|
||||||
func.attr += new_func.attr & ppu_attr::no_return;
|
func.attr += new_func.attr & ppu_attr::no_return;
|
||||||
func.calls.emplace(target);
|
func.single_target = target;
|
||||||
func.trampoline = toc_add;
|
func.trampoline = toc_add;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1223,7 +1270,7 @@ bool ppu_module<lv2_obj>::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con
|
|||||||
func.size = 0x10;
|
func.size = 0x10;
|
||||||
func.blocks.emplace(func.addr, func.size);
|
func.blocks.emplace(func.addr, func.size);
|
||||||
func.attr += new_func.attr & ppu_attr::no_return;
|
func.attr += new_func.attr & ppu_attr::no_return;
|
||||||
func.calls.emplace(target);
|
func.single_target = target;
|
||||||
func.trampoline = toc_add;
|
func.trampoline = toc_add;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1562,7 +1609,6 @@ 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)
|
||||||
{
|
{
|
||||||
func.calls.emplace(target);
|
|
||||||
add_func(target, func.toc ? func.toc + func.trampoline : 0, func.addr);
|
add_func(target, func.toc ? func.toc + func.trampoline : 0, func.addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,11 +32,11 @@ struct ppu_function
|
|||||||
u32 size = 0;
|
u32 size = 0;
|
||||||
bs_t<ppu_attr> attr{};
|
bs_t<ppu_attr> attr{};
|
||||||
|
|
||||||
u32 stack_frame = 0;
|
//u32 stack_frame = 0;
|
||||||
|
u32 single_target = 0;
|
||||||
u32 trampoline = 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> calls{}; // Set of called functions
|
|
||||||
std::set<u32> callers{};
|
std::set<u32> callers{};
|
||||||
|
|
||||||
struct iterator
|
struct iterator
|
||||||
|
Loading…
x
Reference in New Issue
Block a user