1*9a0e4156SSadaf Ebrahimi#!/usr/bin/python 2*9a0e4156SSadaf Ebrahimi# Test tool to compare Capstone output with llvm-mc. By Nguyen Anh Quynh, 2014 3*9a0e4156SSadaf Ebrahimiimport array, os.path, sys 4*9a0e4156SSadaf Ebrahimifrom subprocess import Popen, PIPE, STDOUT 5*9a0e4156SSadaf Ebrahimifrom capstone import * 6*9a0e4156SSadaf Ebrahimi 7*9a0e4156SSadaf Ebrahimi 8*9a0e4156SSadaf Ebrahimi# convert all hex numbers to decimal numbers in a text 9*9a0e4156SSadaf Ebrahimidef normalize_hex(a): 10*9a0e4156SSadaf Ebrahimi while(True): 11*9a0e4156SSadaf Ebrahimi i = a.find('0x') 12*9a0e4156SSadaf Ebrahimi if i == -1: # no more hex number 13*9a0e4156SSadaf Ebrahimi break 14*9a0e4156SSadaf Ebrahimi hexnum = '0x' 15*9a0e4156SSadaf Ebrahimi for c in a[i + 2:]: 16*9a0e4156SSadaf Ebrahimi if c in '0123456789abcdefABCDEF': 17*9a0e4156SSadaf Ebrahimi hexnum += c 18*9a0e4156SSadaf Ebrahimi else: 19*9a0e4156SSadaf Ebrahimi break 20*9a0e4156SSadaf Ebrahimi num = int(hexnum, 16) 21*9a0e4156SSadaf Ebrahimi a = a.replace(hexnum, str(num)) 22*9a0e4156SSadaf Ebrahimi return a 23*9a0e4156SSadaf Ebrahimi 24*9a0e4156SSadaf Ebrahimi 25*9a0e4156SSadaf Ebrahimidef run_mc(arch, hexcode, option, syntax=None): 26*9a0e4156SSadaf Ebrahimi def normalize(text): 27*9a0e4156SSadaf Ebrahimi # remove tabs 28*9a0e4156SSadaf Ebrahimi text = text.lower() 29*9a0e4156SSadaf Ebrahimi items = text.split() 30*9a0e4156SSadaf Ebrahimi text = ' '.join(items) 31*9a0e4156SSadaf Ebrahimi if arch == CS_ARCH_X86: 32*9a0e4156SSadaf Ebrahimi # remove comment after # 33*9a0e4156SSadaf Ebrahimi i = text.find('# ') 34*9a0e4156SSadaf Ebrahimi if i != -1: 35*9a0e4156SSadaf Ebrahimi return text[:i].strip() 36*9a0e4156SSadaf Ebrahimi if arch == CS_ARCH_ARM64: 37*9a0e4156SSadaf Ebrahimi # remove comment after # 38*9a0e4156SSadaf Ebrahimi i = text.find('// ') 39*9a0e4156SSadaf Ebrahimi if i != -1: 40*9a0e4156SSadaf Ebrahimi return text[:i].strip() 41*9a0e4156SSadaf Ebrahimi # remove some redundant spaces 42*9a0e4156SSadaf Ebrahimi text = text.replace('{ ', '{') 43*9a0e4156SSadaf Ebrahimi text = text.replace(' }', '}') 44*9a0e4156SSadaf Ebrahimi return text.strip() 45*9a0e4156SSadaf Ebrahimi 46*9a0e4156SSadaf Ebrahimi #print("Trying to decode: %s" %hexcode) 47*9a0e4156SSadaf Ebrahimi if syntax: 48*9a0e4156SSadaf Ebrahimi if arch == CS_ARCH_MIPS: 49*9a0e4156SSadaf Ebrahimi p = Popen(['llvm-mc', '-disassemble', '-print-imm-hex', '-mattr=+msa', syntax] + option, stdout=PIPE, stdin=PIPE, stderr=STDOUT) 50*9a0e4156SSadaf Ebrahimi else: 51*9a0e4156SSadaf Ebrahimi p = Popen(['llvm-mc', '-disassemble', '-print-imm-hex', syntax] + option, stdout=PIPE, stdin=PIPE, stderr=STDOUT) 52*9a0e4156SSadaf Ebrahimi else: 53*9a0e4156SSadaf Ebrahimi if arch == CS_ARCH_MIPS: 54*9a0e4156SSadaf Ebrahimi p = Popen(['llvm-mc', '-disassemble', '-print-imm-hex', '-mattr=+msa'] + option, stdout=PIPE, stdin=PIPE, stderr=STDOUT) 55*9a0e4156SSadaf Ebrahimi else: 56*9a0e4156SSadaf Ebrahimi p = Popen(['llvm-mc', '-disassemble', '-print-imm-hex'] + option, stdout=PIPE, stdin=PIPE, stderr=STDOUT) 57*9a0e4156SSadaf Ebrahimi output = p.communicate(input=hexcode)[0] 58*9a0e4156SSadaf Ebrahimi lines = output.split('\n') 59*9a0e4156SSadaf Ebrahimi #print lines 60*9a0e4156SSadaf Ebrahimi if 'invalid' in lines[0]: 61*9a0e4156SSadaf Ebrahimi #print 'invalid ----' 62*9a0e4156SSadaf Ebrahimi return 'FAILED to disassemble (MC)' 63*9a0e4156SSadaf Ebrahimi else: 64*9a0e4156SSadaf Ebrahimi #print 'OK:', lines[1] 65*9a0e4156SSadaf Ebrahimi return normalize(lines[1].strip()) 66*9a0e4156SSadaf Ebrahimi 67*9a0e4156SSadaf Ebrahimidef test_file(fname): 68*9a0e4156SSadaf Ebrahimi print("Test %s" %fname); 69*9a0e4156SSadaf Ebrahimi f = open(fname) 70*9a0e4156SSadaf Ebrahimi lines = f.readlines() 71*9a0e4156SSadaf Ebrahimi f.close() 72*9a0e4156SSadaf Ebrahimi 73*9a0e4156SSadaf Ebrahimi if not lines[0].startswith('# '): 74*9a0e4156SSadaf Ebrahimi print("ERROR: decoding information is missing") 75*9a0e4156SSadaf Ebrahimi return 76*9a0e4156SSadaf Ebrahimi 77*9a0e4156SSadaf Ebrahimi # skip '# ' at the front, then split line to get out hexcode 78*9a0e4156SSadaf Ebrahimi # Note: option can be '', or 'None' 79*9a0e4156SSadaf Ebrahimi #print lines[0] 80*9a0e4156SSadaf Ebrahimi #print lines[0][2:].split(', ') 81*9a0e4156SSadaf Ebrahimi (arch, mode, option) = lines[0][2:].split(', ') 82*9a0e4156SSadaf Ebrahimi mode = mode.replace(' ', '') 83*9a0e4156SSadaf Ebrahimi option = option.strip() 84*9a0e4156SSadaf Ebrahimi 85*9a0e4156SSadaf Ebrahimi archs = { 86*9a0e4156SSadaf Ebrahimi "CS_ARCH_ARM": CS_ARCH_ARM, 87*9a0e4156SSadaf Ebrahimi "CS_ARCH_ARM64": CS_ARCH_ARM64, 88*9a0e4156SSadaf Ebrahimi "CS_ARCH_MIPS": CS_ARCH_MIPS, 89*9a0e4156SSadaf Ebrahimi "CS_ARCH_PPC": CS_ARCH_PPC, 90*9a0e4156SSadaf Ebrahimi "CS_ARCH_SPARC": CS_ARCH_SPARC, 91*9a0e4156SSadaf Ebrahimi "CS_ARCH_SYSZ": CS_ARCH_SYSZ, 92*9a0e4156SSadaf Ebrahimi "CS_ARCH_X86": CS_ARCH_X86, 93*9a0e4156SSadaf Ebrahimi "CS_ARCH_XCORE": CS_ARCH_XCORE 94*9a0e4156SSadaf Ebrahimi # "CS_ARCH_M68K": CS_ARCH_M68K, 95*9a0e4156SSadaf Ebrahimi } 96*9a0e4156SSadaf Ebrahimi 97*9a0e4156SSadaf Ebrahimi modes = { 98*9a0e4156SSadaf Ebrahimi "CS_MODE_16": CS_MODE_16, 99*9a0e4156SSadaf Ebrahimi "CS_MODE_32": CS_MODE_32, 100*9a0e4156SSadaf Ebrahimi "CS_MODE_64": CS_MODE_64, 101*9a0e4156SSadaf Ebrahimi "CS_MODE_MIPS32": CS_MODE_MIPS32, 102*9a0e4156SSadaf Ebrahimi "CS_MODE_MIPS64": CS_MODE_MIPS64, 103*9a0e4156SSadaf Ebrahimi "0": CS_MODE_ARM, 104*9a0e4156SSadaf Ebrahimi "CS_MODE_ARM": CS_MODE_ARM, 105*9a0e4156SSadaf Ebrahimi "CS_MODE_THUMB": CS_MODE_THUMB, 106*9a0e4156SSadaf Ebrahimi "CS_MODE_ARM+CS_MODE_V8": CS_MODE_ARM+CS_MODE_V8, 107*9a0e4156SSadaf Ebrahimi "CS_MODE_THUMB+CS_MODE_V8": CS_MODE_THUMB+CS_MODE_V8, 108*9a0e4156SSadaf Ebrahimi "CS_MODE_THUMB+CS_MODE_MCLASS": CS_MODE_THUMB+CS_MODE_MCLASS, 109*9a0e4156SSadaf Ebrahimi "CS_MODE_LITTLE_ENDIAN": CS_MODE_LITTLE_ENDIAN, 110*9a0e4156SSadaf Ebrahimi "CS_MODE_BIG_ENDIAN": CS_MODE_BIG_ENDIAN, 111*9a0e4156SSadaf Ebrahimi "CS_MODE_64+CS_MODE_LITTLE_ENDIAN": CS_MODE_64+CS_MODE_LITTLE_ENDIAN, 112*9a0e4156SSadaf Ebrahimi "CS_MODE_64+CS_MODE_BIG_ENDIAN": CS_MODE_64+CS_MODE_BIG_ENDIAN, 113*9a0e4156SSadaf Ebrahimi "CS_MODE_MIPS32+CS_MODE_MICRO": CS_MODE_MIPS32+CS_MODE_MICRO, 114*9a0e4156SSadaf Ebrahimi "CS_MODE_MIPS32+CS_MODE_MICRO+CS_MODE_BIG_ENDIAN": CS_MODE_MIPS32+CS_MODE_MICRO+CS_MODE_BIG_ENDIAN, 115*9a0e4156SSadaf Ebrahimi "CS_MODE_MIPS32+CS_MODE_BIG_ENDIAN+CS_MODE_MICRO": CS_MODE_MIPS32+CS_MODE_MICRO+CS_MODE_BIG_ENDIAN, 116*9a0e4156SSadaf Ebrahimi "CS_MODE_BIG_ENDIAN+CS_MODE_V9": CS_MODE_BIG_ENDIAN + CS_MODE_V9, 117*9a0e4156SSadaf Ebrahimi "CS_MODE_MIPS32+CS_MODE_BIG_ENDIAN": CS_MODE_MIPS32+CS_MODE_BIG_ENDIAN, 118*9a0e4156SSadaf Ebrahimi "CS_MODE_MIPS32+CS_MODE_LITTLE_ENDIAN": CS_MODE_MIPS32+CS_MODE_LITTLE_ENDIAN, 119*9a0e4156SSadaf Ebrahimi "CS_MODE_MIPS64+CS_MODE_LITTLE_ENDIAN": CS_MODE_MIPS64+CS_MODE_LITTLE_ENDIAN, 120*9a0e4156SSadaf Ebrahimi "CS_MODE_MIPS64+CS_MODE_BIG_ENDIAN": CS_MODE_MIPS64+CS_MODE_BIG_ENDIAN, 121*9a0e4156SSadaf Ebrahimi } 122*9a0e4156SSadaf Ebrahimi 123*9a0e4156SSadaf Ebrahimi options = { 124*9a0e4156SSadaf Ebrahimi "CS_OPT_SYNTAX_ATT": CS_OPT_SYNTAX_ATT, 125*9a0e4156SSadaf Ebrahimi "CS_OPT_SYNTAX_NOREGNAME": CS_OPT_SYNTAX_NOREGNAME, 126*9a0e4156SSadaf Ebrahimi } 127*9a0e4156SSadaf Ebrahimi 128*9a0e4156SSadaf Ebrahimi mc_modes = { 129*9a0e4156SSadaf Ebrahimi ("CS_ARCH_X86", "CS_MODE_32"): ['-triple=i386'], 130*9a0e4156SSadaf Ebrahimi ("CS_ARCH_X86", "CS_MODE_64"): ['-triple=x86_64'], 131*9a0e4156SSadaf Ebrahimi ("CS_ARCH_ARM", "CS_MODE_ARM"): ['-triple=armv7'], 132*9a0e4156SSadaf Ebrahimi ("CS_ARCH_ARM", "CS_MODE_THUMB"): ['-triple=thumbv7'], 133*9a0e4156SSadaf Ebrahimi ("CS_ARCH_ARM", "CS_MODE_ARM+CS_MODE_V8"): ['-triple=armv8'], 134*9a0e4156SSadaf Ebrahimi ("CS_ARCH_ARM", "CS_MODE_THUMB+CS_MODE_V8"): ['-triple=thumbv8'], 135*9a0e4156SSadaf Ebrahimi ("CS_ARCH_ARM", "CS_MODE_THUMB+CS_MODE_MCLASS"): ['-triple=thumbv7m'], 136*9a0e4156SSadaf Ebrahimi ("CS_ARCH_ARM64", "0"): ['-triple=aarch64'], 137*9a0e4156SSadaf Ebrahimi ("CS_ARCH_MIPS", "CS_MODE_MIPS32+CS_MODE_BIG_ENDIAN"): ['-triple=mips'], 138*9a0e4156SSadaf Ebrahimi ("CS_ARCH_MIPS", "CS_MODE_MIPS32+CS_MODE_MICRO"): ['-triple=mipsel', '-mattr=+micromips'], 139*9a0e4156SSadaf Ebrahimi ("CS_ARCH_MIPS", "CS_MODE_MIPS64"): ['-triple=mips64el'], 140*9a0e4156SSadaf Ebrahimi ("CS_ARCH_MIPS", "CS_MODE_MIPS32"): ['-triple=mipsel'], 141*9a0e4156SSadaf Ebrahimi ("CS_ARCH_MIPS", "CS_MODE_MIPS64+CS_MODE_BIG_ENDIAN"): ['-triple=mips64'], 142*9a0e4156SSadaf Ebrahimi ("CS_ARCH_MIPS", "CS_MODE_MIPS32+CS_MODE_MICRO+CS_MODE_BIG_ENDIAN"): ['-triple=mips', '-mattr=+micromips'], 143*9a0e4156SSadaf Ebrahimi ("CS_ARCH_MIPS", "CS_MODE_MIPS32+CS_MODE_BIG_ENDIAN+CS_MODE_MICRO"): ['-triple=mips', '-mattr=+micromips'], 144*9a0e4156SSadaf Ebrahimi ("CS_ARCH_PPC", "CS_MODE_BIG_ENDIAN"): ['-triple=powerpc64'], 145*9a0e4156SSadaf Ebrahimi ('CS_ARCH_SPARC', 'CS_MODE_BIG_ENDIAN'): ['-triple=sparc'], 146*9a0e4156SSadaf Ebrahimi ('CS_ARCH_SPARC', 'CS_MODE_BIG_ENDIAN+CS_MODE_V9'): ['-triple=sparcv9'], 147*9a0e4156SSadaf Ebrahimi ('CS_ARCH_SYSZ', '0'): ['-triple=s390x', '-mcpu=z196'], 148*9a0e4156SSadaf Ebrahimi } 149*9a0e4156SSadaf Ebrahimi 150*9a0e4156SSadaf Ebrahimi #if not option in ('', 'None'): 151*9a0e4156SSadaf Ebrahimi # print archs[arch], modes[mode], options[option] 152*9a0e4156SSadaf Ebrahimi 153*9a0e4156SSadaf Ebrahimi #print(arch, mode, option) 154*9a0e4156SSadaf Ebrahimi md = Cs(archs[arch], modes[mode]) 155*9a0e4156SSadaf Ebrahimi 156*9a0e4156SSadaf Ebrahimi mc_option = None 157*9a0e4156SSadaf Ebrahimi if arch == 'CS_ARCH_X86': 158*9a0e4156SSadaf Ebrahimi # tell llvm-mc to use Intel syntax 159*9a0e4156SSadaf Ebrahimi mc_option = '-output-asm-variant=1' 160*9a0e4156SSadaf Ebrahimi 161*9a0e4156SSadaf Ebrahimi if arch == 'CS_ARCH_ARM' or arch == 'CS_ARCH_PPC' : 162*9a0e4156SSadaf Ebrahimi md.syntax = CS_OPT_SYNTAX_NOREGNAME 163*9a0e4156SSadaf Ebrahimi 164*9a0e4156SSadaf Ebrahimi if fname.endswith('3DNow.s.cs'): 165*9a0e4156SSadaf Ebrahimi md.syntax = CS_OPT_SYNTAX_ATT 166*9a0e4156SSadaf Ebrahimi 167*9a0e4156SSadaf Ebrahimi for line in lines[1:]: 168*9a0e4156SSadaf Ebrahimi # ignore all the input lines having # in front. 169*9a0e4156SSadaf Ebrahimi if line.startswith('#'): 170*9a0e4156SSadaf Ebrahimi continue 171*9a0e4156SSadaf Ebrahimi #print("Check %s" %line) 172*9a0e4156SSadaf Ebrahimi code = line.split(' = ')[0] 173*9a0e4156SSadaf Ebrahimi asm = ''.join(line.split(' = ')[1:]) 174*9a0e4156SSadaf Ebrahimi hex_code = code.replace('0x', '') 175*9a0e4156SSadaf Ebrahimi hex_code = hex_code.replace(',', '') 176*9a0e4156SSadaf Ebrahimi hex_data = hex_code.decode('hex') 177*9a0e4156SSadaf Ebrahimi #hex_bytes = array.array('B', hex_data) 178*9a0e4156SSadaf Ebrahimi 179*9a0e4156SSadaf Ebrahimi x = list(md.disasm(hex_data, 0)) 180*9a0e4156SSadaf Ebrahimi if len(x) > 0: 181*9a0e4156SSadaf Ebrahimi if x[0].op_str != '': 182*9a0e4156SSadaf Ebrahimi cs_output = "%s %s" %(x[0].mnemonic, x[0].op_str) 183*9a0e4156SSadaf Ebrahimi else: 184*9a0e4156SSadaf Ebrahimi cs_output = x[0].mnemonic 185*9a0e4156SSadaf Ebrahimi else: 186*9a0e4156SSadaf Ebrahimi cs_output = 'FAILED to disassemble' 187*9a0e4156SSadaf Ebrahimi 188*9a0e4156SSadaf Ebrahimi cs_output2 = normalize_hex(cs_output) 189*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace(' ', '') 190*9a0e4156SSadaf Ebrahimi 191*9a0e4156SSadaf Ebrahimi if arch == 'CS_ARCH_MIPS': 192*9a0e4156SSadaf Ebrahimi # normalize register alias names 193*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$at', '$1') 194*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$v0', '$2') 195*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$v1', '$3') 196*9a0e4156SSadaf Ebrahimi 197*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$a0', '$4') 198*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$a1', '$5') 199*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$a2', '$6') 200*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$a3', '$7') 201*9a0e4156SSadaf Ebrahimi 202*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$t0', '$8') 203*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$t1', '$9') 204*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$t2', '$10') 205*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$t3', '$11') 206*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$t4', '$12') 207*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$t5', '$13') 208*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$t6', '$14') 209*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$t7', '$15') 210*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$t8', '$24') 211*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$t9', '$25') 212*9a0e4156SSadaf Ebrahimi 213*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$s0', '$16') 214*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$s1', '$17') 215*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$s2', '$18') 216*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$s3', '$19') 217*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$s4', '$20') 218*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$s5', '$21') 219*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$s6', '$22') 220*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$s7', '$23') 221*9a0e4156SSadaf Ebrahimi 222*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$k0', '$26') 223*9a0e4156SSadaf Ebrahimi cs_output2 = cs_output2.replace('$k1', '$27') 224*9a0e4156SSadaf Ebrahimi 225*9a0e4156SSadaf Ebrahimi #print("Running MC ...") 226*9a0e4156SSadaf Ebrahimi if fname.endswith('thumb-fp-armv8.s.cs'): 227*9a0e4156SSadaf Ebrahimi mc_output = run_mc(archs[arch], code, ['-triple=thumbv8'], mc_option) 228*9a0e4156SSadaf Ebrahimi elif fname.endswith('mips64-alu-instructions.s.cs'): 229*9a0e4156SSadaf Ebrahimi mc_output = run_mc(archs[arch], code, ['-triple=mips64el', '-mcpu=mips64r2'], mc_option) 230*9a0e4156SSadaf Ebrahimi else: 231*9a0e4156SSadaf Ebrahimi mc_output = run_mc(archs[arch], code, mc_modes[(arch, mode)], mc_option) 232*9a0e4156SSadaf Ebrahimi mc_output2 = normalize_hex(mc_output) 233*9a0e4156SSadaf Ebrahimi 234*9a0e4156SSadaf Ebrahimi if arch == 'CS_ARCH_MIPS': 235*9a0e4156SSadaf Ebrahimi mc_output2 = mc_output2.replace(' 0(', '(') 236*9a0e4156SSadaf Ebrahimi 237*9a0e4156SSadaf Ebrahimi if arch == 'CS_ARCH_PPC': 238*9a0e4156SSadaf Ebrahimi mc_output2 = mc_output2.replace('.+', '') 239*9a0e4156SSadaf Ebrahimi mc_output2 = mc_output2.replace('.', '') 240*9a0e4156SSadaf Ebrahimi mc_output2 = mc_output2.replace(' 0(', '(') 241*9a0e4156SSadaf Ebrahimi 242*9a0e4156SSadaf Ebrahimi mc_output2 = mc_output2.replace(' ', '') 243*9a0e4156SSadaf Ebrahimi mc_output2 = mc_output2.replace('opaque', '') 244*9a0e4156SSadaf Ebrahimi 245*9a0e4156SSadaf Ebrahimi 246*9a0e4156SSadaf Ebrahimi if (cs_output2 != mc_output2): 247*9a0e4156SSadaf Ebrahimi asm = asm.replace(' ', '').strip().lower() 248*9a0e4156SSadaf Ebrahimi if asm != cs_output2: 249*9a0e4156SSadaf Ebrahimi print("Mismatch: %s" %line.strip()) 250*9a0e4156SSadaf Ebrahimi print("\tMC = %s" %mc_output) 251*9a0e4156SSadaf Ebrahimi print("\tCS = %s" %cs_output) 252*9a0e4156SSadaf Ebrahimi 253*9a0e4156SSadaf Ebrahimi 254*9a0e4156SSadaf Ebrahimiif __name__ == '__main__': 255*9a0e4156SSadaf Ebrahimi if len(sys.argv) == 1: 256*9a0e4156SSadaf Ebrahimi fnames = sys.stdin.readlines() 257*9a0e4156SSadaf Ebrahimi for fname in fnames: 258*9a0e4156SSadaf Ebrahimi test_file(fname.strip()) 259*9a0e4156SSadaf Ebrahimi else: 260*9a0e4156SSadaf Ebrahimi #print("Usage: ./test_mc.py <input-file.s.cs>") 261*9a0e4156SSadaf Ebrahimi test_file(sys.argv[1]) 262*9a0e4156SSadaf Ebrahimi 263