llvm--emulator/llvm_emulator/emulator.py

62 lines
2.0 KiB
Python
Raw Permalink Normal View History

"""
Main module of the program.
To start the application, call the main function. For the end user,
this is achieved by a script stored in the bin folder.
"""
import argparse
from llvm_emulator import stepper, parser
def main():
arg_parser = argparse.ArgumentParser(description='A hacky LLVM-- emulator/debugger')
arg_parser.add_argument('-a', '--auto',
action='store', type=str, dest='auto_path',
help='Automatically step through llvm in the given file')
arg_parser.add_argument('-s', '--step',
action='store', type=int, dest='auto_step',
default=100,
help='How often to prompt for continuation in auto-mode, 0 is never')
arg_parser.add_argument('-p', '--print',
action='store', type=int, dest='print_level',
default=3,
help='Verboseness of the emulator')
parse_res_raw = arg_parser.parse_args()
parse_res = vars(parse_res_raw)
global llvm_parser
llvm_parser = parser.LLVMParser()
2017-11-13 17:14:53 +00:00
llvm_parser.build( parse_res['print_level'] <= 1 )
if parse_res['auto_path'] is not None:
step_behavior = {
'step_ask': parse_res['auto_step'],
'step_print_level': parse_res['print_level']
}
go_auto(parse_res['auto_path'], step_behavior)
else:
enter_interactive_mode()
def go_auto(path_to_file, step_behavior):
with open(path_to_file, 'r') as f:
file_contents = f.read()
2017-11-13 17:14:53 +00:00
if step_behavior['step_print_level'] > 1:
print('Parsing {}'
.format(path_to_file))
ast = llvm_parser.parse(file_contents)
2017-11-13 17:14:53 +00:00
if step_behavior['step_print_level'] > 1:
print('Beginning execution of {}'
.format(path_to_file))
stepper.auto_step(ast, step_behavior = step_behavior)
def enter_interactive_mode():
print('TODO: Interactive mode has not been implemented yet. Sorry...')