import struct,sys
sys.path.insert(0,'/tmp/claude-0/-root-ants/f0a0d69c-fbe4-4887-8c0d-a5302a0da398/scratchpad')
from bridge import *
M32=0xFFFFFFFF
def word(va):
    o=va2off(va)
    return struct.unpack_from('<I',B,o)[0] if o is not None else None

def globals_ref(addr,size):
    """A32 PIC patterns:
       LDR Rt,[pc,#imm]      -> Rt = pcrel offset (from literal pool)
       ADD Rd,pc,Rm          -> Rd = pc+8+off              (direct global)
       LDR Rt,[pc,Rm]        -> Rt = *(pc+8+off)  GOT slot (global address)
    """
    o=va2off(addr)
    if o is None or size<=0: return []
    regs={}; out=[]
    for k in range(0,size&~3,4):
        va=addr+k
        w,=struct.unpack_from('<I',B,o+k)
        if (w&0xFFFF0000)==0xE59F0000:                    # LDR Rt,[pc,#imm]
            Rt=(w>>12)&0xF; lv=word(va+8+(w&0xFFF))
            regs[Rt]=lv; continue
        if (w&0xFFFF0FF0)==0xE08F0000:                    # ADD Rd,pc,Rm
            Rd=(w>>12)&0xF; Rm=w&0xF
            if regs.get(Rm) is not None:
                t=(va+8+regs[Rm])&M32; out.append(t); regs[Rd]=None
            continue
        if (w&0xFFFF0FF0)==0xE79F0000:                    # LDR Rt,[pc,Rm]
            Rt=(w>>12)&0xF; Rm=w&0xF
            if regs.get(Rm) is not None:
                g=word((va+8+regs[Rm])&M32)
                if g is not None: out.append(g)
                regs[Rt]=None
            continue
    return out

def method_lits(addr,size):
    seen=set(); r=[]
    for g in globals_ref(addr,size):
        if g in slot2lit:
            s=literal(slot2lit[g])
            if s not in seen: seen.add(s); r.append(s)
    return r
