feat(phase-21): T2 — fuel prefetch, Ghidra-C cache complete for the ROI pool

- headless DecompileFunctions over 263 uncached ROI-pool fns (MCP stopped, R23):
  263 ok / 0 fail / 0 no-func. cache 300 -> 563. ROI-pool fuel now 325/325 cached
  (28/28 giants, 310/310 reach-134, 7/7 capped) -> the unattended run never needs MCP.
- FIX DecompileFunctions.java: key output by entry address func_<UPPERHEX>.c (Ghidra's
  raw-import default is FUN_<lowerhex>, which every consumer + the existing 300 files
  miss). Renamed the 263; the tool fix makes re-prefetch reproducible.
- build_fuel_manifest.py --emit-prefetch: reproducible uncached-ROI-pool addr-list
  (for the T7 runbook). 349 reach-1 x1-leverage fns intentionally excluded (P9).
- ghidra/ db churn is the MCP-stop no-op save (R23 restart-noise, not staged).
This commit is contained in:
Drew T
2026-06-21 12:00:47 -06:00
parent 971f95f7c8
commit 5674587bcb
3 changed files with 29 additions and 2 deletions
+6 -1
View File
@@ -45,7 +45,12 @@ public class DecompileFunctions extends GhidraScript {
out = "// DECOMPILE FAILED: " + (res != null ? res.getErrorMessage() : "null result");
fail++;
}
Files.write(Paths.get(outDir, f.getName() + ".c"), out.getBytes());
// Key the cache file by the function's ENTRY ADDRESS as func_<UPPERHEX>.c — the
// convention every consumer uses (derive_canonical_sigs.py, gen_wave.py, the
// fuel manifest). Ghidra's default raw-import name is FUN_<lowerhex>, so naming by
// f.getName() would miss the cache; keying by address is reproducible + correct.
String fname = "func_" + Long.toHexString(f.getEntryPoint().getOffset()).toUpperCase() + ".c";
Files.write(Paths.get(outDir, fname), out.getBytes());
}
di.dispose();
println("DecompileFunctions: " + ok + " ok, " + fail + " decompile-fail, " + nofunc