#!/usr/bin/python # convert LLVM GenSystemRegister.inc for Capstone disassembler. # by Nguyen Anh Quynh, 2019 import sys if len(sys.argv) == 1: print("Syntax: %s " %sys.argv[0]) sys.exit(1) f = open(sys.argv[1]) lines = f.readlines() f.close() #arch = sys.argv[2].upper() print(""" /* Capstone Disassembly Engine, http://www.capstone-engine.org */ /* By Nguyen Anh Quynh , 2013-2019 */ /*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ |* *| |* GenSystemRegister Source Fragment *| |* *| |* Automatically generated file, do not edit! *| |* *| \*===----------------------------------------------------------------------===*/ """) # extract BankedRegValues enum count = 0 for line in lines: line = line.rstrip() if len(line.strip()) == 0: continue if line.strip() == 'enum BankedRegValues {': count += 1 print(line.strip()) continue line = line.strip() if count == 1: if line == '};': # done with first enum break else: # skip pseudo instructions print("\t%s" %(line)) print('};\n') # extract MClassSysRegsList count = 0 for line in lines: line = line.rstrip() if len(line.strip()) == 0: continue if 'MClassSysRegsList[]' in line: count += 1 print('static const MClassSysReg MClassSysRegsList[] = {') continue if count == 1: if line.strip() == '};': # done with first enum break else: # enum items # { "apsr_g", 0x400, 0x0, 0x400, {ARM::FeatureDSP} }, // 0 line2 = line.replace('::', '_') sysreg = line2[line2.index('"') + 1 : line2.index('",')] tmp = line2.split(',') print("%s, ARM_SYSREG_%s%s" %(line2[:line2.index('",') + 1], sysreg.upper(), line2[line2.index('",') + 1 :])) print('};\n') # extract BankedRegsList count = 0 for line in lines: line = line.rstrip() if len(line.strip()) == 0: continue if 'BankedRegsList[]' in line: count += 1 print('static const BankedReg BankedRegsList[] = {') continue if count == 1: if line.strip() == '};': # done with first enum break else: # enum items line2 = line.replace('::', '_') sysreg = line2[line2.index('"') + 1 : line2.index('",')] tmp = line2.split(',') print("%s, ARM_SYSREG_%s%s" %(line2[:line2.index('",') + 1], sysreg.upper(), line2[line2.index('",') + 1 :])) print('};\n') # lookupMClassSysRegByM2M3Encoding8 count = 0 for line in lines: line = line.rstrip() if len(line.strip()) == 0: continue if 'lookupMClassSysRegByM2M3Encoding8' in line and '{' in line: count += 1 print('const MClassSysReg *lookupMClassSysRegByM2M3Encoding8(uint16_t encoding)\n{') print(' unsigned int i;') continue if count == 1 and 'IndexType Index[] = {' in line: count += 1 if count == 2: if line.strip() == '};': # done with array, or this function? print(line) break else: # enum items print(line) print(""" i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), encoding); if (i == -1) return NULL; else return &MClassSysRegsList[Index[i].index]; } """) # lookupMClassSysRegByM1Encoding12 count = 0 for line in lines: line = line.rstrip() if len(line.strip()) == 0: continue if 'lookupMClassSysRegByM1Encoding12' in line and '{' in line: count += 1 print('const MClassSysReg *lookupMClassSysRegByM1Encoding12(uint16_t encoding)\n{') print(' unsigned int i;') continue if count == 1 and 'IndexType Index[] = {' in line: count += 1 if count == 2: if line.strip() == '};': # done with array, or this function? print(line) break else: # enum items print(line) print(""" i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), encoding); if (i == -1) return NULL; else return &MClassSysRegsList[Index[i].index]; } """) # lookupBankedRegByEncoding count = 0 for line in lines: line = line.rstrip() if len(line.strip()) == 0: continue if 'lookupBankedRegByEncoding' in line and '{' in line: count += 1 print('const BankedReg *lookupBankedRegByEncoding(uint8_t encoding)\n{') print(' unsigned int i;') continue if count == 1 and 'IndexType Index[] = {' in line: count += 1 if count == 2: if line.strip() == '};': # done with array, or this function? print(line) break else: # enum items print(line) print(""" i = binsearch_IndexTypeEncoding(Index, ARR_SIZE(Index), encoding); if (i == -1) return NULL; else return &BankedRegsList[Index[i].index]; } """)