1#!/usr/bin/python 2# print out all registers from LLVM GenRegisterInfo.inc for Capstone disassembler. 3# NOTE: the list then must be filtered, manually. 4# by Nguyen Anh Quynh, 2019 5 6import sys 7 8if len(sys.argv) == 1: 9 print("Syntax: %s <GenRegisterInfo.inc> <architecture>" %sys.argv[0]) 10 sys.exit(1) 11 12f = open(sys.argv[1]) 13lines = f.readlines() 14f.close() 15 16arch = sys.argv[2].upper() 17 18enum_count = 0 19 20# 1st enum is register enum 21for line in lines: 22 line = line.rstrip() 23 24 if len(line.strip()) == 0: 25 continue 26 27 if line.strip() == 'enum {': 28 enum_count += 1 29 continue 30 31 if enum_count == 1: 32 if line == '};': 33 # done with first enum 34 break 35 else: 36 # enum items 37 if 'NoRegister' in line or 'TARGET_REGS' in line: 38 continue 39 reg = line.strip().split('=')[0].strip() 40 if reg.startswith('H') or reg.endswith('PH') or or reg.endswith('IH') or or reg.endswith('WH'): 41 print(" %s_REG_%s = REMOVE," %(arch, reg)) 42 elif 'K' in reg or 'BND' in reg: 43 print(" %s_REG_%s = REMOVE," %(arch, reg)) 44 elif reg in ('DF', 'SSP', 'R8BH', 'R9BH', 'R10BH', 'R11BH', 'R12BH', 'R13BH', 'R14BH', 'R15BH'): 45 print(" %s_REG_%s = REMOVE," %(arch, reg)) 46 else: 47 print(" %s_REG_%s," %(arch, reg)) 48 49