A wide variety of tools can be applied to LLVM IR. For example, as demonstrated in Chapter 1, LLVM Design and Use, the IR can be dumped into bitcode or into an assembly. An optimization tool called opt can be run on IR. IR acts as the common platform—an abstract layer for all of these tools.
JIT support can also be added. It immediately evaluates the top-level expressions typed in. For example, 1 + 2;
, as soon as it is typed in, evaluates the code and prints the value as 3
.
Do the following steps:
Define a static global variable for the execution engine in the
toy.cpp
file:static ExecutionEngine *TheExecutionEngine;
In the
toy.cpp
file'smain()
function, write the code for JIT:int main() { … … init_precedence(); TheExecutionEngine = EngineBuilder(TheModule).create(); … … }
Modify the top-level expression parser in the
toy.cpp
file:static void HandleTopExpression() { if (FunctionDefAST *F = expression_parser()) if (Function *LF = F->Codegen()) { ...