common.py (1657B)
1 from collections import namedtuple 2 3 4 ArchDef = namedtuple( 5 'ArchDef', 6 'name word_bytes stack_align syscall_numbers encoders start_stub', 7 ) 8 9 Banner = namedtuple('Banner', 'text') 10 Literal = namedtuple('Literal', 'name hex_by_arch') 11 Nullary = namedtuple('Nullary', 'name kind') 12 Li = namedtuple('Li', 'name rd') 13 La = namedtuple('La', 'name rd') 14 LaBr = namedtuple('LaBr', 'name') 15 Mov = namedtuple('Mov', 'name rd rs') 16 Rrr = namedtuple('Rrr', 'name op rd ra rb') 17 AddI = namedtuple('AddI', 'name rd ra imm') 18 LogI = namedtuple('LogI', 'name op rd ra imm') 19 ShiftI = namedtuple('ShiftI', 'name op rd ra imm') 20 Mem = namedtuple('Mem', 'name op rt rn off') 21 LdArg = namedtuple('LdArg', 'name rd slot') 22 BranchReg = namedtuple('BranchReg', 'name kind rs') 23 CondB = namedtuple('CondB', 'name op ra rb') 24 CondBZ = namedtuple('CondBZ', 'name op ra') 25 Enter = namedtuple('Enter', 'name size') 26 27 28 ARCH_REGISTRY = {} 29 30 31 def register_arch(arch): 32 if arch.name in ARCH_REGISTRY: 33 raise RuntimeError(f'duplicate arch registration: {arch.name}') 34 ARCH_REGISTRY[arch.name] = arch 35 36 37 def get_arch(name): 38 return ARCH_REGISTRY[name] 39 40 41 def registered_arches(): 42 return tuple(sorted(ARCH_REGISTRY)) 43 44 45 def byte(n): 46 return f'{n & 0xFF:02X}' 47 48 49 def le32(n): 50 return (n & 0xFFFFFFFF).to_bytes(4, 'little').hex().upper() 51 52 53 def le64(n): 54 return (n & 0xFFFFFFFFFFFFFFFF).to_bytes(8, 'little').hex().upper() 55 56 57 def word_hex(word_bytes, n): 58 if word_bytes == 4: 59 return le32(n) 60 if word_bytes == 8: 61 return le64(n) 62 raise ValueError(f'unsupported word size: {word_bytes}') 63 64 65 def round_up(align, n): 66 return ((n + align - 1) // align) * align