import struct,bisect
exec(open('/tmp/claude-0/-root-ants/f0a0d69c-fbe4-4887-8c0d-a5302a0da398/scratchpad/x86bridge.py').read().split("print('\\n--- registration")[0])
CODEREG=0x1d3728c
mpCount=u32(CODEREG); mpPtr=u32(CODEREG+4)
MP=struct.unpack_from('<%dI'%mpCount,B,va2off(mpPtr))
sm=open(SYM,'rb').read(); n,=struct.unpack_from('<I',sm,0)
starts=[];size={}
for i in range(n):
    a,s=struct.unpack_from('<QI',sm,4+i*12); starts.append(a); size[a]=s
starts.sort()
def owner(va):
    i=bisect.bisect_right(starts,va)-1
    return starts[i] if i>=0 else 0
def maddr(mi): return MP[mi] if 0<=mi<mpCount else 0
A2N={}
for ti,t in enumerate(TYPES):
    ns,nm=S(t[1]),S(t[0]); cls=(ns+'.' if ns else '')+nm
    for k in range(t[20]):
        m=METHODS[t[13]+k]
        a=maddr(m[6])
        if a: A2N.setdefault(a,'%s::%s'%(cls,S(m[0])))
info=set()
for ti,t in enumerate(TYPES):
    if S(t[1])!='Gu3' or S(t[0])!='Debug': continue
    for k in range(t[20]):
        m=METHODS[t[13]+k]
        if S(m[0]) in ('Info','Infof'): info.add(maddr(m[6]))
    break
o=TO; callers={}
for k in range(TS-5):
    if B[o+k]!=0xE8: continue
    rel,=struct.unpack_from('<i',B,o+k+1)
    if (TA+k+5+rel)&0xFFFFFFFF in info:
        callers.setdefault(owner(TA+k),0)
        callers[owner(TA+k)]+=1
print('methods that emit Info/Infof (the only observable checkpoints):\n')
for a,c in sorted(callers.items(), key=lambda x:-x[1]):
    print('  %-3d %s'%(c, A2N.get(a,'sub_%x'%a)))
