2011-03-19 09:24:25 +08:00
|
|
|
#!/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'
|
2011-03-22 07:01:34 +08:00
|
|
|
sys.stdout.write("Enter your input to llvm-mc. A line starting with 'END' terminates the current batch of input.\n")
|
2011-03-19 09:24:25 +08:00
|
|
|
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()
|