#!/usr/bin/env python """ Run llvm-mc interactively. """ import os import sys from optparse import OptionParser def is_exe(fpath): """Check whether fpath is an executable.""" return os.path.isfile(fpath) and os.access(fpath, os.X_OK) def which(program): """Find the full path to a program, or return None.""" fpath, fname = os.path.split(program) if fpath: if is_exe(program): return program else: for path in os.environ["PATH"].split(os.pathsep): exe_file = os.path.join(path, program) if is_exe(exe_file): return exe_file return None def llvm_mc_loop(mc, mc_options): contents = [] fname = 'mc-input.txt' sys.stdout.write("Enter your input to llvm-mc. A line starting with 'END' terminates the current batch of input.\n") sys.stdout.write("Enter 'quit' or Ctrl-D to quit the program.\n") while True: sys.stdout.write("> ") next = sys.stdin.readline() # EOF => terminate this llvm-mc shell if not next or next.startswith('quit'): sys.stdout.write('\n') sys.exit(0) # 'END' => send the current batch of input to llvm-mc if next.startswith('END'): # Write contents to our file and clear the contents. with open(fname, 'w') as f: f.writelines(contents) # Clear the list: replace all items with an empty list. contents[:] = [] # Invoke llvm-mc with our newly created file. mc_cmd = '%s %s %s' % (mc, mc_options, fname) sys.stdout.write("Executing command: %s\n" % mc_cmd) os.system(mc_cmd) else: # Keep accumulating our input. contents.append(next) def main(): # This is to set up the Python path to include the pexpect-2.4 dir. # Remember to update this when/if things change. scriptPath = sys.path[0] sys.path.append(os.path.join(scriptPath, os.pardir, os.pardir, 'test', 'pexpect-2.4')) parser = OptionParser(usage="""\ Do llvm-mc interactively within a shell-like environment. A batch of input is submitted to llvm-mc to execute whenever you terminate the current batch by inputing a line which starts with 'END'. Quit the program by either 'quit' or Ctrl-D. Usage: %prog [options] """) parser.add_option('-m', '--llvm-mc', type='string', action='store', dest='llvm_mc', help="""The llvm-mc executable full path, if specified. Otherwise, it must be present in your PATH environment.""") parser.add_option('-o', '--options', type='string', action='store', dest='llvm_mc_options', help="""The options passed to 'llvm-mc' command if specified.""") opts, args = parser.parse_args() llvm_mc = opts.llvm_mc if opts.llvm_mc else which('llvm-mc') if not llvm_mc: parser.print_help() sys.exit(1) # This is optional. For example: # --options='-disassemble -triple=arm-apple-darwin -debug-only=arm-disassembler' llvm_mc_options = opts.llvm_mc_options # We have parsed the options. print "llvm-mc:", llvm_mc print "llvm-mc options:", llvm_mc_options llvm_mc_loop(llvm_mc, llvm_mc_options) if __name__ == '__main__': main()