Only chase after continious branches

This commit is contained in:
Sajid 2024-09-10 02:42:20 +06:00
parent cbfcdc3ebc
commit 05b23d2ad8

View File

@ -124,9 +124,8 @@ Function Function::Analyze(const void* code, size_t size, size_t base)
{ {
blockStack.pop_back(); blockStack.pop_back();
// single block with a branch means it'd be a tail call // Keep analyzing if we have continuity
// we don't have to analyze the target in that case if (op == PPC_OP_B)
if (op == PPC_OP_B && blocks.size() != 1)
{ {
const auto branchBase = insn.operands[0] - base; const auto branchBase = insn.operands[0] - base;
const auto branchBlock = fn.SearchBlock(insn.operands[0]); const auto branchBlock = fn.SearchBlock(insn.operands[0]);
@ -138,12 +137,12 @@ Function Function::Analyze(const void* code, size_t size, size_t base)
if (isContinious && curBlock.projectedSize != -1) if (isContinious && curBlock.projectedSize != -1)
{ {
sizeProjection = curBlock.projectedSize - curBlock.size; sizeProjection = curBlock.projectedSize - curBlock.size;
}
if (branchBlock == -1) if (branchBlock == -1)
{ {
blocks.emplace_back(branchBase, 0, sizeProjection); blocks.emplace_back(branchBase, 0, sizeProjection);
blockStack.emplace_back(blocks.size() - 1); blockStack.emplace_back(blocks.size() - 1);
}
} }
} }