fix: skip empty functions, relax jump-threading to handle multi-instr jmp stubs

This commit is contained in:
x86byte
2026-06-30 09:28:52 +01:00
parent 5c31095555
commit 8565b45c08
2 changed files with 11 additions and 51 deletions
+10 -2
View File
@@ -458,12 +458,19 @@ CFG CFGBuilder::build()
set<addr_t> built;
queue<addr_t> pending;
auto isEmpty = [](const Function& f) -> bool {
for (const auto& b : f.blocks)
if (!b.instructions.empty()) return false;
return true;
};
auto process = [&](addr_t addr, const string& name)
{
if (built.count(addr)) return;
built.insert(addr);
auto func = buildFunction(addr, name);
if (isEmpty(func)) return;
cfg.functions.push_back(func);
for (const auto& b : func.blocks)
@@ -513,6 +520,7 @@ CFG CFGBuilder::build()
built.insert(a);
auto func = buildFunction(a, name);
if (isEmpty(func)) continue;
cfg.functions.push_back(func);
for (const auto& b : func.blocks)
@@ -616,8 +624,8 @@ static void jumpThread(CFG& cfg)
if (addr_to_func[t] != &func) continue;
BasicBlock* target = it->second;
if (target->instructions.size() == 1 &&
target->instructions[0].mnemonic == "jmp" &&
if (!target->instructions.empty() &&
target->instructions.back().mnemonic == "jmp" &&
target->successors.size() == 1)
{
addr_t redirect = target->successors[0];