Now, since the AST is ready with all the necessary information in its data structure, the next phase is to generate LLVM IR. LLVM APIs are used in this code generation. LLVM IR has a predefined format that is generated by the inbuilt APIs of LLVM.
In order to generate LLVM IR, a virtual CodeGen
function is defined in each AST class (the AST classes were defined earlier in the AST section; these functions are additional to those classes) as follows:
toy.cpp
file as follows:$ vi toy.cpp
BaseAST
class defined earlier, append the Codegen()
functions as follows:class BaseAST { … … virtual Value* Codegen() = 0; }; class NumericAST : public BaseAST { … … virtual Value* Codegen(); }; class VariableAST : public BaseAST { … … virtual Value* Codegen(); };
This virtual Codegen()
function is included in every AST class we defined.
This function returns an LLVM Value object, which represents Static Single Assignment (SSA) value in LLVM. A few more static variables are defined that will be used during Codegen.
static Module *Module_Ob; static IRBuilder<> Builder(getGlobalContext()); static std::map<std::string, Value*>Named_Values;
The Module_Ob
module contains all the functions and variables in the code.
The Builder
object helps to generate LLVM IR and keeps track of the current point in the program to insert LLVM instructions. The Builder
object has functions to create new instructions.
The Named_Values
map keeps track of all the values defined in the current scope like a symbol table. For our language, this map will contain function parameters.
18.118.12.157