import sys
if len(sys.argv) == 1:
print("Syntax: %s <GenRegisterInfo.inc> <architecture>" %sys.argv[0])
sys.exit(1)
f = open(sys.argv[1])
lines = f.readlines()
f.close()
arch = sys.argv[2]
print("""
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2019 */
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\\
|* *|
|* Target Register Enum Values *|
|* *|
|* Automatically generated file, do not edit! *|
|* *|
\*===----------------------------------------------------------------------===*/
#ifdef GET_REGINFO_ENUM
#undef GET_REGINFO_ENUM
""")
enum_count = 0
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if line.strip() == 'enum {':
enum_count += 1
print(line)
continue
if enum_count == 1:
if line.strip() == '};':
print(line)
break
else:
print(" %s_%s" %(arch, line.strip()))
enum_count = 0
print("\n// Register classes")
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if line.strip() == 'enum {':
enum_count += 1
if enum_count == 2:
print(line)
continue
if enum_count == 2:
if line.strip() == '};':
print(line.strip())
break
else:
print(" %s_%s" %(arch, line.strip()))
if arch.upper() == 'ARM':
enum_count = 0
print("\n// Subregister indices")
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if line.strip() == 'enum {':
enum_count += 1
if enum_count == 3:
print(line)
continue
if enum_count == 3:
if line.strip() == '};':
print(line.strip())
break
else:
print(" %s_%s" %(arch, line.strip()))
if arch.upper() == 'AARCH64':
enum_count = 0
print("\n// Register alternate name indices")
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if line.strip() == 'enum {':
enum_count += 1
if enum_count == 3:
print(line)
continue
if enum_count == 3:
if line.strip() == '};':
print(line.strip())
break
else:
print(" %s_%s" %(arch, line.strip()))
enum_count = 0
print("\n// Subregister indices")
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if line.strip() == 'enum {' or 'enum :' in line.strip():
enum_count += 1
if enum_count == 4:
print('enum {')
continue
if enum_count == 4:
if line.strip() == '};':
print(line.strip())
break
else:
print(" %s_%s" %(arch, line.strip()))
print("")
print("#endif // GET_REGINFO_ENUM")
print("""
#ifdef GET_REGINFO_MC_DESC
#undef GET_REGINFO_MC_DESC
""")
finding_struct = True
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if arch + 'RegDiffLists' in line:
finding_struct = False
print("static const MCPhysReg " + arch + "RegDiffLists[] = {")
continue
if finding_struct:
continue
else:
print(line)
if line == '};':
print("")
break
finding_struct = True
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if arch + 'SubRegIdxLists' in line:
finding_struct = False
print("static const uint16_t " + arch + "SubRegIdxLists[] = {")
continue
if finding_struct:
continue
else:
print(line)
if line == '};':
print("")
break
finding_struct = True
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if arch + 'RegDesc' in line:
finding_struct = False
print("static const MCRegisterDesc " + arch + "RegDesc[] = {")
continue
if finding_struct:
continue
else:
print(line)
if line == '};':
print("")
break
finding_struct = True
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if 'Register classes' in line and 'namespace' in line:
finding_struct = False
continue
if finding_struct:
continue
else:
if 'const' in line:
line2 = line.replace('const', 'static const')
print(line2)
elif '::' in line:
line2 = line.replace('::', '_')
print(line2)
elif 'end anonymous namespace' in line:
break
else:
print(line)
print("\n")
finding_struct = True
for line in lines:
line = line.rstrip()
if len(line.strip()) == 0:
continue
if 'MCRegisterClass ' + arch + 'MCRegisterClasses[] = {' in line:
finding_struct = False
print("static const MCRegisterClass " + arch + "MCRegisterClasses[] = {")
continue
if finding_struct:
continue
else:
if line == '};':
print('};\n')
break
elif '::' in line:
line = line.replace('::', '_')
tmp = line.split(',')
print(" %s, %s, %s }," %(tmp[0].strip(), tmp[1].strip(), tmp[4].strip()))
print("#endif // GET_REGINFO_MC_DESC")