Expand Up
@@ -701,13 +701,14 @@ static std::unique_ptr<PrototypeAST> ParseExtern() {
// Code Generation
// ===----------------------------------------------------------------------===//
static LLVMContext TheContext;
static IRBuilder<> Builder (TheContext);
static std::unique_ptr<LLVMContext> TheContext;
static std::unique_ptr<Module> TheModule;
static std::unique_ptr<IRBuilder<>> Builder;
static std::map<std::string, AllocaInst *> NamedValues;
static std::unique_ptr<legacy::FunctionPassManager> TheFPM;
static std::unique_ptr<KaleidoscopeJIT> TheJIT;
static std::map<std::string, std::unique_ptr<PrototypeAST>> FunctionProtos;
static ExitOnError ExitOnErr;
Value *LogErrorV (const char *Str) {
LogError (Str);
Expand Down
Expand Up
@@ -735,11 +736,11 @@ static AllocaInst *CreateEntryBlockAlloca(Function *TheFunction,
StringRef VarName) {
IRBuilder<> TmpB (&TheFunction->getEntryBlock (),
TheFunction->getEntryBlock ().begin ());
return TmpB.CreateAlloca (Type::getDoubleTy (TheContext), nullptr , VarName);
return TmpB.CreateAlloca (Type::getDoubleTy (* TheContext), nullptr , VarName);
}
Value *NumberExprAST::codegen () {
return ConstantFP::get (TheContext, APFloat (Val));
return ConstantFP::get (* TheContext, APFloat (Val));
}
Value *VariableExprAST::codegen () {
Expand All
@@ -749,7 +750,7 @@ Value *VariableExprAST::codegen() {
return LogErrorV (" Unknown variable name" );
// Load the value.
return Builder. CreateLoad (V, Name.c_str ());
return Builder-> CreateLoad (V, Name.c_str ());
}
Value *UnaryExprAST::codegen () {
Expand All
@@ -761,7 +762,7 @@ Value *UnaryExprAST::codegen() {
if (!F)
return LogErrorV (" Unknown unary operator" );
return Builder. CreateCall (F, OperandV, " unop" );
return Builder-> CreateCall (F, OperandV, " unop" );
}
Value *BinaryExprAST::codegen () {
Expand All
@@ -784,7 +785,7 @@ Value *BinaryExprAST::codegen() {
if (!Variable)
return LogErrorV (" Unknown variable name" );
Builder. CreateStore (Val, Variable);
Builder-> CreateStore (Val, Variable);
return Val;
}
Expand All
@@ -795,15 +796,15 @@ Value *BinaryExprAST::codegen() {
switch (Op) {
case ' +' :
return Builder. CreateFAdd (L, R, " addtmp" );
return Builder-> CreateFAdd (L, R, " addtmp" );
case ' -' :
return Builder. CreateFSub (L, R, " subtmp" );
return Builder-> CreateFSub (L, R, " subtmp" );
case ' *' :
return Builder. CreateFMul (L, R, " multmp" );
return Builder-> CreateFMul (L, R, " multmp" );
case ' <' :
L = Builder. CreateFCmpULT (L, R, " cmptmp" );
L = Builder-> CreateFCmpULT (L, R, " cmptmp" );
// Convert bool 0/1 to double 0.0 or 1.0
return Builder. CreateUIToFP (L, Type::getDoubleTy (TheContext), " booltmp" );
return Builder-> CreateUIToFP (L, Type::getDoubleTy (* TheContext), " booltmp" );
default :
break ;
}
Expand All
@@ -814,7 +815,7 @@ Value *BinaryExprAST::codegen() {
assert (F && " binary operator not found!" );
Value *Ops[] = {L, R};
return Builder. CreateCall (F, Ops, " binop" );
return Builder-> CreateCall (F, Ops, " binop" );
}
Value *CallExprAST::codegen () {
Expand All
@@ -834,7 +835,7 @@ Value *CallExprAST::codegen() {
return nullptr ;
}
return Builder. CreateCall (CalleeF, ArgsV, " calltmp" );
return Builder-> CreateCall (CalleeF, ArgsV, " calltmp" );
}
Value *IfExprAST::codegen () {
Expand All
@@ -843,46 +844,46 @@ Value *IfExprAST::codegen() {
return nullptr ;
// Convert condition to a bool by comparing non-equal to 0.0.
CondV = Builder. CreateFCmpONE (
CondV, ConstantFP::get (TheContext, APFloat (0.0 )), " ifcond" );
CondV = Builder-> CreateFCmpONE (
CondV, ConstantFP::get (* TheContext, APFloat (0.0 )), " ifcond" );
Function *TheFunction = Builder. GetInsertBlock ()->getParent ();
Function *TheFunction = Builder-> GetInsertBlock ()->getParent ();
// Create blocks for the then and else cases. Insert the 'then' block at the
// end of the function.
BasicBlock *ThenBB = BasicBlock::Create (TheContext, " then" , TheFunction);
BasicBlock *ElseBB = BasicBlock::Create (TheContext, " else" );
BasicBlock *MergeBB = BasicBlock::Create (TheContext, " ifcont" );
BasicBlock *ThenBB = BasicBlock::Create (* TheContext, " then" , TheFunction);
BasicBlock *ElseBB = BasicBlock::Create (* TheContext, " else" );
BasicBlock *MergeBB = BasicBlock::Create (* TheContext, " ifcont" );
Builder. CreateCondBr (CondV, ThenBB, ElseBB);
Builder-> CreateCondBr (CondV, ThenBB, ElseBB);
// Emit then value.
Builder. SetInsertPoint (ThenBB);
Builder-> SetInsertPoint (ThenBB);
Value *ThenV = Then->codegen ();
if (!ThenV)
return nullptr ;
Builder. CreateBr (MergeBB);
Builder-> CreateBr (MergeBB);
// Codegen of 'Then' can change the current block, update ThenBB for the PHI.
ThenBB = Builder. GetInsertBlock ();
ThenBB = Builder-> GetInsertBlock ();
// Emit else block.
TheFunction->getBasicBlockList ().push_back (ElseBB);
Builder. SetInsertPoint (ElseBB);
Builder-> SetInsertPoint (ElseBB);
Value *ElseV = Else->codegen ();
if (!ElseV)
return nullptr ;
Builder. CreateBr (MergeBB);
Builder-> CreateBr (MergeBB);
// Codegen of 'Else' can change the current block, update ElseBB for the PHI.
ElseBB = Builder. GetInsertBlock ();
ElseBB = Builder-> GetInsertBlock ();
// Emit merge block.
TheFunction->getBasicBlockList ().push_back (MergeBB);
Builder. SetInsertPoint (MergeBB);
PHINode *PN = Builder. CreatePHI (Type::getDoubleTy (TheContext), 2 , " iftmp" );
Builder-> SetInsertPoint (MergeBB);
PHINode *PN = Builder-> CreatePHI (Type::getDoubleTy (* TheContext), 2 , " iftmp" );
PN->addIncoming (ThenV, ThenBB);
PN->addIncoming (ElseV, ElseBB);
Expand All
@@ -909,7 +910,7 @@ Value *IfExprAST::codegen() {
// br endcond, loop, endloop
// outloop:
Value *ForExprAST::codegen () {
Function *TheFunction = Builder. GetInsertBlock ()->getParent ();
Function *TheFunction = Builder-> GetInsertBlock ()->getParent ();
// Create an alloca for the variable in the entry block.
AllocaInst *Alloca = CreateEntryBlockAlloca (TheFunction, VarName);
Expand All
@@ -920,17 +921,17 @@ Value *ForExprAST::codegen() {
return nullptr ;
// Store the value into the alloca.
Builder. CreateStore (StartVal, Alloca);
Builder-> CreateStore (StartVal, Alloca);
// Make the new basic block for the loop header, inserting after current
// block.
BasicBlock *LoopBB = BasicBlock::Create (TheContext, " loop" , TheFunction);
BasicBlock *LoopBB = BasicBlock::Create (* TheContext, " loop" , TheFunction);
// Insert an explicit fall through from the current block to the LoopBB.
Builder. CreateBr (LoopBB);
Builder-> CreateBr (LoopBB);
// Start insertion in LoopBB.
Builder. SetInsertPoint (LoopBB);
Builder-> SetInsertPoint (LoopBB);
// Within the loop, the variable is defined equal to the PHI node. If it
// shadows an existing variable, we have to restore it, so save it now.
Expand All
@@ -951,7 +952,7 @@ Value *ForExprAST::codegen() {
return nullptr ;
} else {
// If not specified, use 1.0.
StepVal = ConstantFP::get (TheContext, APFloat (1.0 ));
StepVal = ConstantFP::get (* TheContext, APFloat (1.0 ));
}
// Compute the end condition.
Expand All
@@ -961,23 +962,23 @@ Value *ForExprAST::codegen() {
// Reload, increment, and restore the alloca. This handles the case where
// the body of the loop mutates the variable.
Value *CurVar = Builder. CreateLoad (Alloca, VarName.c_str ());
Value *NextVar = Builder. CreateFAdd (CurVar, StepVal, " nextvar" );
Builder. CreateStore (NextVar, Alloca);
Value *CurVar = Builder-> CreateLoad (Alloca, VarName.c_str ());
Value *NextVar = Builder-> CreateFAdd (CurVar, StepVal, " nextvar" );
Builder-> CreateStore (NextVar, Alloca);
// Convert condition to a bool by comparing non-equal to 0.0.
EndCond = Builder. CreateFCmpONE (
EndCond, ConstantFP::get (TheContext, APFloat (0.0 )), " loopcond" );
EndCond = Builder-> CreateFCmpONE (
EndCond, ConstantFP::get (* TheContext, APFloat (0.0 )), " loopcond" );
// Create the "after loop" block and insert it.
BasicBlock *AfterBB =
BasicBlock::Create (TheContext, " afterloop" , TheFunction);
BasicBlock::Create (* TheContext, " afterloop" , TheFunction);
// Insert the conditional branch into the end of LoopEndBB.
Builder. CreateCondBr (EndCond, LoopBB, AfterBB);
Builder-> CreateCondBr (EndCond, LoopBB, AfterBB);
// Any new code will be inserted in AfterBB.
Builder. SetInsertPoint (AfterBB);
Builder-> SetInsertPoint (AfterBB);
// Restore the unshadowed variable.
if (OldVal)
Expand All
@@ -986,13 +987,13 @@ Value *ForExprAST::codegen() {
NamedValues.erase (VarName);
// for expr always returns 0.0.
return Constant::getNullValue (Type::getDoubleTy (TheContext));
return Constant::getNullValue (Type::getDoubleTy (* TheContext));
}
Value *VarExprAST::codegen () {
std::vector<AllocaInst *> OldBindings;
Function *TheFunction = Builder. GetInsertBlock ()->getParent ();
Function *TheFunction = Builder-> GetInsertBlock ()->getParent ();
// Register all variables and emit their initializer.
for (unsigned i = 0 , e = VarNames.size (); i != e; ++i) {
Expand All
@@ -1010,11 +1011,11 @@ Value *VarExprAST::codegen() {
if (!InitVal)
return nullptr ;
} else { // If not specified, use 0.0.
InitVal = ConstantFP::get (TheContext, APFloat (0.0 ));
InitVal = ConstantFP::get (* TheContext, APFloat (0.0 ));
}
AllocaInst *Alloca = CreateEntryBlockAlloca (TheFunction, VarName);
Builder. CreateStore (InitVal, Alloca);
Builder-> CreateStore (InitVal, Alloca);
// Remember the old variable binding so that we can restore the binding when
// we unrecurse.
Expand All
@@ -1039,9 +1040,9 @@ Value *VarExprAST::codegen() {
Function *PrototypeAST::codegen () {
// Make the function type: double(double,double) etc.
std::vector<Type *> Doubles (Args.size (), Type::getDoubleTy (TheContext));
std::vector<Type *> Doubles (Args.size (), Type::getDoubleTy (* TheContext));
FunctionType *FT =
FunctionType::get (Type::getDoubleTy (TheContext), Doubles, false );
FunctionType::get (Type::getDoubleTy (* TheContext), Doubles, false );
Function *F =
Function::Create (FT, Function::ExternalLinkage, Name, TheModule.get ());
Expand All
@@ -1068,8 +1069,8 @@ Function *FunctionAST::codegen() {
BinopPrecedence[P.getOperatorName ()] = P.getBinaryPrecedence ();
// Create a new basic block to start insertion into.
BasicBlock *BB = BasicBlock::Create (TheContext, " entry" , TheFunction);
Builder. SetInsertPoint (BB);
BasicBlock *BB = BasicBlock::Create (* TheContext, " entry" , TheFunction);
Builder-> SetInsertPoint (BB);
// Record the function arguments in the NamedValues map.
NamedValues.clear ();
Expand All
@@ -1078,15 +1079,15 @@ Function *FunctionAST::codegen() {
AllocaInst *Alloca = CreateEntryBlockAlloca (TheFunction, Arg.getName ());
// Store the initial value into the alloca.
Builder. CreateStore (&Arg, Alloca);
Builder-> CreateStore (&Arg, Alloca);
// Add arguments to variable symbol table.
NamedValues[std::string (Arg.getName ())] = Alloca;
}
if (Value *RetVal = Body->codegen ()) {
// Finish off the function.
Builder. CreateRet (RetVal);
Builder-> CreateRet (RetVal);
// Validate the generated code, checking for consistency.
verifyFunction (*TheFunction);
Expand All
@@ -1111,8 +1112,12 @@ Function *FunctionAST::codegen() {
static void InitializeModuleAndPassManager () {
// Open a new module.
TheModule = std::make_unique<Module>(" my cool jit" , TheContext);
TheModule->setDataLayout (TheJIT->getTargetMachine ().createDataLayout ());
TheContext = std::make_unique<LLVMContext>();
TheModule = std::make_unique<Module>(" my cool jit" , *TheContext);
TheModule->setDataLayout (TheJIT->getDataLayout ());
// Create a new builder for the module.
Builder = std::make_unique<IRBuilder<>>(*TheContext);
// Create a new pass manager attached to it.
TheFPM = std::make_unique<legacy::FunctionPassManager>(TheModule.get ());
Expand All
@@ -1137,7 +1142,8 @@ static void HandleDefinition() {
fprintf (stderr, " Read function definition:" );
FnIR->print (errs ());
fprintf (stderr, " \n " );
TheJIT->addModule (std::move (TheModule));
ExitOnErr (TheJIT->addModule (
ThreadSafeModule (std::move (TheModule), std::move (TheContext))));
InitializeModuleAndPassManager ();
}
} else {
Expand All
@@ -1164,22 +1170,24 @@ static void HandleTopLevelExpression() {
// Evaluate a top-level expression into an anonymous function.
if (auto FnAST = ParseTopLevelExpr ()) {
if (FnAST->codegen ()) {
// JIT the module containing the anonymous expression, keeping a handle so
// we can free it later.
auto H = TheJIT->addModule (std::move (TheModule));
// Create a ResourceTracker to track JIT'd memory allocated to our
// anonymous expression -- that way we can free it after executing.
auto RT = TheJIT->getMainJITDylib ().createResourceTracker ();
auto TSM = ThreadSafeModule (std::move (TheModule), std::move (TheContext));
ExitOnErr (TheJIT->addModule (std::move (TSM), RT));
InitializeModuleAndPassManager ();
// Search the JIT for the __anon_expr symbol.
auto ExprSymbol = TheJIT->findSymbol (" __anon_expr" );
assert (ExprSymbol && " Function not found" );
auto ExprSymbol = ExitOnErr (TheJIT->lookup (" __anon_expr" ));
// Get the symbol's address and cast it to the right type (takes no
// arguments, returns a double) so we can call it as a native function.
double (*FP)() = (double (*)())(intptr_t )cantFail ( ExprSymbol.getAddress () );
double (*FP)() = (double (*)())(intptr_t )ExprSymbol.getAddress ();
fprintf (stderr, " Evaluated to %f\n " , FP ());
// Delete the anonymous expression module from the JIT.
TheJIT-> removeModule (H );
ExitOnErr (RT-> remove () );
}
} else {
// Skip token for error recovery.
Expand Down
Expand Up
@@ -1253,7 +1261,7 @@ int main() {
fprintf (stderr, " ready> " );
getNextToken ();
TheJIT = std::make_unique<KaleidoscopeJIT>( );
TheJIT = ExitOnErr ( KaleidoscopeJIT::Create () );
InitializeModuleAndPassManager ();
Expand Down