Home | History | Annotate | Download | only in test
      1 #!/usr/bin/env python
      2 
      3 """
      4 Run llvm-mc interactively.
      5 
      6 """
      7 
      8 import os
      9 import sys
     10 from optparse import OptionParser
     11 
     12 def is_exe(fpath):
     13     """Check whether fpath is an executable."""
     14     return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
     15 
     16 def 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 
     29 def llvm_mc_loop(mc, mc_options):
     30     contents = []
     31     fname = 'mc-input.txt'
     32     sys.stdout.write("Enter your input to llvm-mc.  A line starting with 'END' terminates the current batch of input.\n")
     33     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 
     57 def 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="""\
     64 Do llvm-mc interactively within a shell-like environment.  A batch of input is
     65 submitted to llvm-mc to execute whenever you terminate the current batch by
     66 inputing a line which starts with 'END'.  Quit the program by either 'quit' or
     67 Ctrl-D.
     68 
     69 Usage: %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 
     99 if __name__ == '__main__':
    100     main()
    101