| #!/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() |