#include "ast/ast.h" #include "ast/function_ast.h" #include llvm::Function *obelisk::FunctionAST::codegen() { llvm::Function *theFunction = TheModule->getFunction(prototype_->getName()); if (!theFunction) { theFunction = prototype_->codegen(); } if (!theFunction) { return nullptr; } llvm::BasicBlock *bB = llvm::BasicBlock::Create(*TheContext, "entry", theFunction); Builder->SetInsertPoint(bB); NamedValues.clear(); for (auto &arg : theFunction->args()) { NamedValues[std::string(arg.getName())] = &arg; } if (llvm::Value *retVal = body_->codegen()) { Builder->CreateRet(retVal); llvm::verifyFunction(*theFunction); return theFunction; } theFunction->eraseFromParent(); return nullptr; }