#!/usr/bin/env python3 """Regenerate the committed ISL artefacts under `docs/re/data/`. isl_report.py calls -> the call-site census + a listing The artefact was produced by an uncommitted one-off, so it drifted out of date twice: once when operand staging was fixed (calls printed with too few arguments) and once when three built-in names were corrected. Keeping the generator in the tree is the point of this file. `data/isl-stage02-conditions.txt` still has no generator here. A first attempt is not committed because it printed most sites as bare `builtinN`: neither `isl.resync` (it gives up far from a valid start) nor a naive linear decode from the phase base reaches every call site, so producing that listing faithfully needs the coroutine entry points, which `start_coroutine`'s operand carries and this tool does not yet follow. """ import collections import sys import isl def census(b): cs = isl.call_sites(b) return cs, collections.Counter(bid for _, bid, _ in cs) def emit_calls(b, path): cs, h = census(b) s1, s2 = isl.symbols(b, 1), isl.symbols(b, 2) print('# %s — ISL disassembly artefacts' % path) print() print('Generated by `tools/re-capture/isl_report.py calls`.') print() print('%d call sites, %d distinct built-ins' % (len(cs), len(h))) for bid, n in h.most_common(): print(' builtin %-4d %5d site(s)' % (bid, n)) print() print('## phase-control sites') for bid, nm in ((6, 'END_PHASE'), (62, 'FORCE_END_PHASE'), (39, 'MARK_LAST_PHASE'), (40, 'mark_not_last')): offs = [off for off, b2, _ in cs if b2 == bid] print('%-3d %-18s %2d: %s' % (bid, nm, len(offs), ' '.join('0x%x' % o for o in offs))) print() print('## named built-ins used, by traffic') for bid, n in h.most_common(): nm = isl.BUILTIN.get(bid) if nm: print(' %-3d %-24s %4d' % (bid, nm, n)) print() print('## phase code bases') print('Each phase has its OWN base; the file header offset is not it.') print(' ' + ' '.join('0x%x' % x for x in isl.phase_bases(b))) print() print('## disassembly into the first END_PHASE') target = [off for off, bid, _ in cs if bid == 6][0] start = isl.resync(b, target) print('resync from 0x%X' % start) for line in isl.dis(b, start, 64, code_base=0x24, sym2=s2, sym1=s1): print(line) def main(): path = sys.argv[1] b = isl.load(path) name = path.replace('\\', '/').split('/')[-1] {'calls': emit_calls}[sys.argv[2]](b, name) if __name__ == '__main__': main()