Queue and progress treat the statically linked D3DX9 block and byte-matched library functions as library

This commit is contained in:
KeelrLeek committed 2026-10-05 14:32:17 -05:00
1 parent 7b03642f90
commit 4da2eb93e3
1 file changed
+16 -2
+16 -2
View File
@@ -112,6 +112,18 @@ class FunctionQueue:
return frozenset(int(m["address"], 16) for c in data.get("clusters", []) for m in c.get("members", []) return frozenset(int(m["address"], 16) for c in data.get("clusters", []) for m in c.get("members", [])
if m.get("best_readable") and m.get("status") != "readable") if m.get("best_readable") and m.get("status") != "readable")
def library_ranges(self):
"""[(start, end)] of statically linked library blocks (the [reverse] library_ranges csv)."""
path = self.config.get("library_ranges")
if not path or not Path(path).exists():
return []
with open(path, encoding="utf-8") as f:
return [(int(r["start"], 16), int(r["end"], 16)) for r in csv.DictReader(f)
if r.get("verdict", "").startswith("D3DX")]
def is_library(self, addr, library, ranges):
return addr in library or any(lo <= addr < hi for lo, hi in ranges)
# ------------------------------------------------------------------ queue # ------------------------------------------------------------------ queue
def score(self, addr, facts, named, rejected, similar_readable=frozenset()): def score(self, addr, facts, named, rejected, similar_readable=frozenset()):
d = facts[addr] d = facts[addr]
@@ -145,11 +157,12 @@ class FunctionQueue:
statuses, deferred, rejected = self.statuses(), self.deferrals(), self.rejections() statuses, deferred, rejected = self.statuses(), self.deferrals(), self.rejections()
facts, named = self.r._facts(), self._named() facts, named = self.r._facts(), self._named()
library = self._results("library_results") library = self._results("library_results")
ranges = self.library_ranges()
ranked = [] ranked = []
for addr in facts: for addr in facts:
if not any(lo <= addr <= hi for lo, hi in bands) or any(lo <= addr <= hi for lo, hi in taken): if not any(lo <= addr <= hi for lo, hi in bands) or any(lo <= addr <= hi for lo, hi in taken):
continue continue
if statuses.get(addr, ("raw",))[0] == "readable" or addr in deferred or addr in library: if statuses.get(addr, ("raw",))[0] == "readable" or addr in deferred or self.is_library(addr, library, ranges):
continue continue
if rejected.get(addr, 0) >= self.cap: if rejected.get(addr, 0) >= self.cap:
continue continue
@@ -181,12 +194,13 @@ class FunctionQueue:
exact = {a for a, row in self._results("match_results").items() if str(row.get("status")) == "match"} exact = {a for a, row in self._results("match_results").items() if str(row.get("status")) == "match"}
verified = {a for a, row in self._results("diffrun_results").items() if str(row.get("verdict")) == "same"} verified = {a for a, row in self._results("diffrun_results").items() if str(row.get("verdict")) == "same"}
library = set(self._results("library_results")) library = set(self._results("library_results"))
ranges = self.library_ranges()
tiers = {t: {"functions": 0, "bytes": 0} for t in TIER_ORDER + ("library", "engine")} tiers = {t: {"functions": 0, "bytes": 0} for t in TIER_ORDER + ("library", "engine")}
for addr, d in facts.items(): for addr, d in facts.items():
size = int(d.get("size") or 0) size = int(d.get("size") or 0)
category = self._category(addr) category = self._category(addr)
readable = statuses.get(addr, ("raw",))[0] == "readable" readable = statuses.get(addr, ("raw",))[0] == "readable"
if addr in library or category in ("library", "platform"): if self.is_library(addr, library, ranges) or category in ("library", "platform", "crt"):
tier = "library" tier = "library"
elif category == "engine" and not readable: elif category == "engine" and not readable:
tier = "engine" tier = "engine"