blob: 38c12992b9148952209c7e244cf365e260420738 [file] [log] [blame]
Johnny Chen5c07daa2011-03-19 01:24:25 +00001#!/usr/bin/env python
2
3"""
4Run llvm-mc interactively.
5
6"""
7
8import os
9import sys
10from optparse import OptionParser
11
12def is_exe(fpath):
13 """Check whether fpath is an executable."""
14 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
15
16def which(program):
17 """Find the full path to a program, or return None."""
18 fpath, fname = os.path.split(program)
19 if fpath:
20 if is_exe(program):
21 return program
22 else:
23 for path in os.environ["PATH"].split(os.pathsep):
24 exe_file = os.path.join(path, program)
25 if is_exe(exe_file):
26 return exe_file
27 return None
28
29def llvm_mc_loop(mc, mc_options):
30 contents = []
31 fname = 'mc-input.txt'
Johnny Chen31d446a2011-03-21 23:01:34 +000032 sys.stdout.write("Enter your input to llvm-mc. A line starting with 'END' terminates the current batch of input.\n")
Johnny Chen5c07daa2011-03-19 01:24:25 +000033 sys.stdout.write("Enter 'quit' or Ctrl-D to quit the program.\n")
34 while True:
35 sys.stdout.write("> ")
36 next = sys.stdin.readline()
37 # EOF => terminate this llvm-mc shell
38 if not next or next.startswith('quit'):
39 sys.stdout.write('\n')
40 sys.exit(0)
41 # 'END' => send the current batch of input to llvm-mc
42 if next.startswith('END'):
43 # Write contents to our file and clear the contents.
44 with open(fname, 'w') as f:
45 f.writelines(contents)
46 # Clear the list: replace all items with an empty list.
47 contents[:] = []
48
49 # Invoke llvm-mc with our newly created file.
50 mc_cmd = '%s %s %s' % (mc, mc_options, fname)
51 sys.stdout.write("Executing command: %s\n" % mc_cmd)
52 os.system(mc_cmd)
53 else:
54 # Keep accumulating our input.
55 contents.append(next)
56
57def main():
58 # This is to set up the Python path to include the pexpect-2.4 dir.
59 # Remember to update this when/if things change.
60 scriptPath = sys.path[0]
61 sys.path.append(os.path.join(scriptPath, os.pardir, os.pardir, 'test', 'pexpect-2.4'))
62
63 parser = OptionParser(usage="""\
64Do llvm-mc interactively within a shell-like environment. A batch of input is
65submitted to llvm-mc to execute whenever you terminate the current batch by
66inputing a line which starts with 'END'. Quit the program by either 'quit' or
67Ctrl-D.
68
69Usage: %prog [options]
70""")
71 parser.add_option('-m', '--llvm-mc',
72 type='string', action='store',
73 dest='llvm_mc',
74 help="""The llvm-mc executable full path, if specified.
75 Otherwise, it must be present in your PATH environment.""")
76
77 parser.add_option('-o', '--options',
78 type='string', action='store',
79 dest='llvm_mc_options',
80 help="""The options passed to 'llvm-mc' command if specified.""")
81
82 opts, args = parser.parse_args()
83
84 llvm_mc = opts.llvm_mc if opts.llvm_mc else which('llvm-mc')
85 if not llvm_mc:
86 parser.print_help()
87 sys.exit(1)
88
89 # This is optional. For example:
90 # --options='-disassemble -triple=arm-apple-darwin -debug-only=arm-disassembler'
91 llvm_mc_options = opts.llvm_mc_options
92
93 # We have parsed the options.
94 print "llvm-mc:", llvm_mc
95 print "llvm-mc options:", llvm_mc_options
96
97 llvm_mc_loop(llvm_mc, llvm_mc_options)
98
99if __name__ == '__main__':
100 main()