Skip to content

dcdelia/tinyvm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TinyVM

A simple VM to play with LLVM's MCJIT compiler and exercise a new OSR technique.

pctips@xubuntu64:~/OSR$ ./tinyvm
Welcome! Enter 'HELP' to show the list of available commands.
TinyVM> help
List of available commands:
--> BEGIN <module_name>
	Type an IR module from stdin. Press CTRL-D when finished.
--> LOAD_IR <file_name>
	Loads an IR module from a given file.
--> LOAD_LIB <file_name>
	Loads the dynamic library at the given path.
--> CFG <function_name>
	Shows a compact view of the CFG of a given function.
--> CFG_FULL <function_name>
	Shows the full CFG (with instructions) of a given function.
--> DUMP [<function_name> | <module_name>]
	Shows the IR code of a given function or module.
--> OPT_CFG <function_name>
	Performs a CFG simplification pass over a given function.
--> OPT_FULL <function_name>
	Performs several optimization passes over a given function.
--> REPEAT <iterations> <function call>
	Performs a function call (see next paragraph) repeatedly.
--> TRACK_ASM
	Enable/disable logging of generated x86-64 assembly code.
--> SHOW_ADDR <function_name>
	Shows compiled-code address for a given function symbol.
--> SHOW_LINE_IDS <function_name>
	Shows by-line IR identifiers for a given function.
--> SHOW_ASM
	Show logged x86-64 assembly code.
--> SHOW_FUNS
	Show function symbols tracked by MCJITHelper.
--> SHOW_MODS
	Show loaded modules and their symbols.
--> VERBOSE
	Enable/disable verbose mode.
--> QUIT
	Exits TinyVM.

The TinyVM command line supports the invocation of loaded functions. Functions
can be invoked as in C, except for the final semi-colon that must not be added.
For the time being, only functions with integer arguments and return values are
supported.

Demo OSR points can be inserted with one of the following commands:
INSERT_OSR <PROB> <COND> OPEN UPDATE IN <F1> AT <P1> CLONE
INSERT_OSR <PROB> <COND> OPEN COPY IN <F1> AT <P1> AS <F1'> CLONE
INSERT_OSR <PROB> <COND> OPEN UPDATE IN <F1> AT <P1> DYN_INLINE <V1>
INSERT_OSR <PROB> <COND> OPEN COPY IN <F1> AT <P1> AS <F1'> DYN_INLINE <V1>
INSERT_OSR <PROB> <COND> SLVD UPDATE IN <F1> AT <P1> TO <F2> AT <P2> AS <F2'>
INSERT_OSR <PROB> <COND> SLVD COPY IN <F1> AT <P1> AS <F1'> TO <F2> AT <P2> AS <F2'>

where:
	PROB is either -1 (no branch weight) or an integer in {0, ..., 100}
	COND is either ALWAYS or NEVER
	F1 and F2 are existing functions
	P1 and P2 are locations in F1 and F2 respectively
	V1 is the target of one or more calls in F1

The command can either update F1 or generate a new function F1' cloning F1 such
that when P1 is reached during the execution, an OSR transition is fired.

For OPEN transitions, a continuation function C is generated at run-time.
In CLONE mode, C is generated by cloning and manipulating F1 to resume the
execution at P1. In DYN_INLINE mode, C is generated as in clone mode, then a
dynamic inliner attempts to inline calls whose target is contained in V1.

For SLVD transitions, a continuation function F2' is statically generated from
F2 to resume the execution at P2.

Program locations can be expressed using an LLVM '%name' (including numerical
IDs for anonymous values) or a line ID '$i' reported by SHOW_LINE_IDS. For basic
block locations OSR points are inserted before the first non-PHI instruction.

About

A simple VM to play with OSR in LLVM

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published