| Lang Hames | 9b4b92b | 2015-02-17 05:40:42 +0000 | [diff] [blame] | 1 | #include "llvm/Analysis/Passes.h" | 
|  | 2 | #include "llvm/ExecutionEngine/Orc/CompileUtils.h" | 
|  | 3 | #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" | 
|  | 4 | #include "llvm/ExecutionEngine/Orc/LazyEmittingLayer.h" | 
|  | 5 | #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" | 
|  | 6 | #include "llvm/ExecutionEngine/Orc/OrcTargetSupport.h" | 
|  | 7 | #include "llvm/IR/DataLayout.h" | 
|  | 8 | #include "llvm/IR/DerivedTypes.h" | 
|  | 9 | #include "llvm/IR/IRBuilder.h" | 
|  | 10 | #include "llvm/IR/LegacyPassManager.h" | 
|  | 11 | #include "llvm/IR/LLVMContext.h" | 
|  | 12 | #include "llvm/IR/Module.h" | 
|  | 13 | #include "llvm/IR/Verifier.h" | 
|  | 14 | #include "llvm/Support/TargetSelect.h" | 
|  | 15 | #include "llvm/Transforms/Scalar.h" | 
|  | 16 | #include <cctype> | 
|  | 17 | #include <iomanip> | 
|  | 18 | #include <iostream> | 
|  | 19 | #include <map> | 
|  | 20 | #include <sstream> | 
|  | 21 | #include <string> | 
|  | 22 | #include <vector> | 
|  | 23 | using namespace llvm; | 
|  | 24 |  | 
|  | 25 | //===----------------------------------------------------------------------===// | 
|  | 26 | // Lexer | 
|  | 27 | //===----------------------------------------------------------------------===// | 
|  | 28 |  | 
|  | 29 | // The lexer returns tokens [0-255] if it is an unknown character, otherwise one | 
|  | 30 | // of these for known things. | 
|  | 31 | enum Token { | 
|  | 32 | tok_eof = -1, | 
|  | 33 |  | 
|  | 34 | // commands | 
|  | 35 | tok_def = -2, tok_extern = -3, | 
|  | 36 |  | 
|  | 37 | // primary | 
|  | 38 | tok_identifier = -4, tok_number = -5, | 
|  | 39 |  | 
|  | 40 | // control | 
|  | 41 | tok_if = -6, tok_then = -7, tok_else = -8, | 
|  | 42 | tok_for = -9, tok_in = -10, | 
|  | 43 |  | 
|  | 44 | // operators | 
|  | 45 | tok_binary = -11, tok_unary = -12, | 
|  | 46 |  | 
|  | 47 | // var definition | 
|  | 48 | tok_var = -13 | 
|  | 49 | }; | 
|  | 50 |  | 
|  | 51 | static std::string IdentifierStr;  // Filled in if tok_identifier | 
|  | 52 | static double NumVal;              // Filled in if tok_number | 
|  | 53 |  | 
|  | 54 | /// gettok - Return the next token from standard input. | 
|  | 55 | static int gettok() { | 
|  | 56 | static int LastChar = ' '; | 
|  | 57 |  | 
|  | 58 | // Skip any whitespace. | 
|  | 59 | while (isspace(LastChar)) | 
|  | 60 | LastChar = getchar(); | 
|  | 61 |  | 
|  | 62 | if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]* | 
|  | 63 | IdentifierStr = LastChar; | 
|  | 64 | while (isalnum((LastChar = getchar()))) | 
|  | 65 | IdentifierStr += LastChar; | 
|  | 66 |  | 
|  | 67 | if (IdentifierStr == "def") return tok_def; | 
|  | 68 | if (IdentifierStr == "extern") return tok_extern; | 
|  | 69 | if (IdentifierStr == "if") return tok_if; | 
|  | 70 | if (IdentifierStr == "then") return tok_then; | 
|  | 71 | if (IdentifierStr == "else") return tok_else; | 
|  | 72 | if (IdentifierStr == "for") return tok_for; | 
|  | 73 | if (IdentifierStr == "in") return tok_in; | 
|  | 74 | if (IdentifierStr == "binary") return tok_binary; | 
|  | 75 | if (IdentifierStr == "unary") return tok_unary; | 
|  | 76 | if (IdentifierStr == "var") return tok_var; | 
|  | 77 | return tok_identifier; | 
|  | 78 | } | 
|  | 79 |  | 
|  | 80 | if (isdigit(LastChar) || LastChar == '.') {   // Number: [0-9.]+ | 
|  | 81 | std::string NumStr; | 
|  | 82 | do { | 
|  | 83 | NumStr += LastChar; | 
|  | 84 | LastChar = getchar(); | 
|  | 85 | } while (isdigit(LastChar) || LastChar == '.'); | 
|  | 86 |  | 
|  | 87 | NumVal = strtod(NumStr.c_str(), 0); | 
|  | 88 | return tok_number; | 
|  | 89 | } | 
|  | 90 |  | 
|  | 91 | if (LastChar == '#') { | 
|  | 92 | // Comment until end of line. | 
|  | 93 | do LastChar = getchar(); | 
|  | 94 | while (LastChar != EOF && LastChar != '\n' && LastChar != '\r'); | 
|  | 95 |  | 
|  | 96 | if (LastChar != EOF) | 
|  | 97 | return gettok(); | 
|  | 98 | } | 
|  | 99 |  | 
|  | 100 | // Check for end of file.  Don't eat the EOF. | 
|  | 101 | if (LastChar == EOF) | 
|  | 102 | return tok_eof; | 
|  | 103 |  | 
|  | 104 | // Otherwise, just return the character as its ascii value. | 
|  | 105 | int ThisChar = LastChar; | 
|  | 106 | LastChar = getchar(); | 
|  | 107 | return ThisChar; | 
|  | 108 | } | 
|  | 109 |  | 
|  | 110 | //===----------------------------------------------------------------------===// | 
|  | 111 | // Abstract Syntax Tree (aka Parse Tree) | 
|  | 112 | //===----------------------------------------------------------------------===// | 
|  | 113 |  | 
|  | 114 | class IRGenContext; | 
|  | 115 |  | 
|  | 116 | /// ExprAST - Base class for all expression nodes. | 
|  | 117 | struct ExprAST { | 
|  | 118 | virtual ~ExprAST() {} | 
|  | 119 | virtual Value *IRGen(IRGenContext &C) const = 0; | 
|  | 120 | }; | 
|  | 121 |  | 
|  | 122 | /// NumberExprAST - Expression class for numeric literals like "1.0". | 
|  | 123 | struct NumberExprAST : public ExprAST { | 
|  | 124 | NumberExprAST(double Val) : Val(Val) {} | 
|  | 125 | Value *IRGen(IRGenContext &C) const override; | 
|  | 126 |  | 
|  | 127 | double Val; | 
|  | 128 | }; | 
|  | 129 |  | 
|  | 130 | /// VariableExprAST - Expression class for referencing a variable, like "a". | 
|  | 131 | struct VariableExprAST : public ExprAST { | 
|  | 132 | VariableExprAST(std::string Name) : Name(std::move(Name)) {} | 
|  | 133 | Value *IRGen(IRGenContext &C) const override; | 
|  | 134 |  | 
|  | 135 | std::string Name; | 
|  | 136 | }; | 
|  | 137 |  | 
|  | 138 | /// UnaryExprAST - Expression class for a unary operator. | 
|  | 139 | struct UnaryExprAST : public ExprAST { | 
|  | 140 | UnaryExprAST(char Opcode, std::unique_ptr<ExprAST> Operand) | 
|  | 141 | : Opcode(std::move(Opcode)), Operand(std::move(Operand)) {} | 
|  | 142 |  | 
|  | 143 | Value *IRGen(IRGenContext &C) const override; | 
|  | 144 |  | 
|  | 145 | char Opcode; | 
|  | 146 | std::unique_ptr<ExprAST> Operand; | 
|  | 147 | }; | 
|  | 148 |  | 
|  | 149 | /// BinaryExprAST - Expression class for a binary operator. | 
|  | 150 | struct BinaryExprAST : public ExprAST { | 
|  | 151 | BinaryExprAST(char Op, std::unique_ptr<ExprAST> LHS, | 
|  | 152 | std::unique_ptr<ExprAST> RHS) | 
|  | 153 | : Op(Op), LHS(std::move(LHS)), RHS(std::move(RHS)) {} | 
|  | 154 |  | 
|  | 155 | Value *IRGen(IRGenContext &C) const override; | 
|  | 156 |  | 
|  | 157 | char Op; | 
|  | 158 | std::unique_ptr<ExprAST> LHS, RHS; | 
|  | 159 | }; | 
|  | 160 |  | 
|  | 161 | /// CallExprAST - Expression class for function calls. | 
|  | 162 | struct CallExprAST : public ExprAST { | 
|  | 163 | CallExprAST(std::string CalleeName, | 
|  | 164 | std::vector<std::unique_ptr<ExprAST>> Args) | 
|  | 165 | : CalleeName(std::move(CalleeName)), Args(std::move(Args)) {} | 
|  | 166 |  | 
|  | 167 | Value *IRGen(IRGenContext &C) const override; | 
|  | 168 |  | 
|  | 169 | std::string CalleeName; | 
|  | 170 | std::vector<std::unique_ptr<ExprAST>> Args; | 
|  | 171 | }; | 
|  | 172 |  | 
|  | 173 | /// IfExprAST - Expression class for if/then/else. | 
|  | 174 | struct IfExprAST : public ExprAST { | 
|  | 175 | IfExprAST(std::unique_ptr<ExprAST> Cond, std::unique_ptr<ExprAST> Then, | 
|  | 176 | std::unique_ptr<ExprAST> Else) | 
|  | 177 | : Cond(std::move(Cond)), Then(std::move(Then)), Else(std::move(Else)) {} | 
|  | 178 | Value *IRGen(IRGenContext &C) const override; | 
|  | 179 |  | 
|  | 180 | std::unique_ptr<ExprAST> Cond, Then, Else; | 
|  | 181 | }; | 
|  | 182 |  | 
|  | 183 | /// ForExprAST - Expression class for for/in. | 
|  | 184 | struct ForExprAST : public ExprAST { | 
|  | 185 | ForExprAST(std::string VarName, std::unique_ptr<ExprAST> Start, | 
|  | 186 | std::unique_ptr<ExprAST> End, std::unique_ptr<ExprAST> Step, | 
|  | 187 | std::unique_ptr<ExprAST> Body) | 
|  | 188 | : VarName(std::move(VarName)), Start(std::move(Start)), End(std::move(End)), | 
|  | 189 | Step(std::move(Step)), Body(std::move(Body)) {} | 
|  | 190 |  | 
|  | 191 | Value *IRGen(IRGenContext &C) const override; | 
|  | 192 |  | 
|  | 193 | std::string VarName; | 
|  | 194 | std::unique_ptr<ExprAST> Start, End, Step, Body; | 
|  | 195 | }; | 
|  | 196 |  | 
|  | 197 | /// VarExprAST - Expression class for var/in | 
|  | 198 | struct VarExprAST : public ExprAST { | 
|  | 199 | typedef std::pair<std::string, std::unique_ptr<ExprAST>> Binding; | 
|  | 200 | typedef std::vector<Binding> BindingList; | 
|  | 201 |  | 
|  | 202 | VarExprAST(BindingList VarBindings, std::unique_ptr<ExprAST> Body) | 
|  | 203 | : VarBindings(std::move(VarBindings)), Body(std::move(Body)) {} | 
|  | 204 |  | 
|  | 205 | Value *IRGen(IRGenContext &C) const override; | 
|  | 206 |  | 
|  | 207 | BindingList VarBindings; | 
|  | 208 | std::unique_ptr<ExprAST> Body; | 
|  | 209 | }; | 
|  | 210 |  | 
|  | 211 | /// PrototypeAST - This class represents the "prototype" for a function, | 
|  | 212 | /// which captures its argument names as well as if it is an operator. | 
|  | 213 | struct PrototypeAST { | 
|  | 214 | PrototypeAST(std::string Name, std::vector<std::string> Args, | 
|  | 215 | bool IsOperator = false, unsigned Precedence = 0) | 
|  | 216 | : Name(std::move(Name)), Args(std::move(Args)), IsOperator(IsOperator), | 
|  | 217 | Precedence(Precedence) {} | 
|  | 218 |  | 
|  | 219 | Function *IRGen(IRGenContext &C) const; | 
|  | 220 | void CreateArgumentAllocas(Function *F, IRGenContext &C); | 
|  | 221 |  | 
|  | 222 | bool isUnaryOp() const { return IsOperator && Args.size() == 1; } | 
|  | 223 | bool isBinaryOp() const { return IsOperator && Args.size() == 2; } | 
|  | 224 |  | 
|  | 225 | char getOperatorName() const { | 
|  | 226 | assert(isUnaryOp() || isBinaryOp()); | 
|  | 227 | return Name[Name.size()-1]; | 
|  | 228 | } | 
|  | 229 |  | 
|  | 230 | std::string Name; | 
|  | 231 | std::vector<std::string> Args; | 
|  | 232 | bool IsOperator; | 
|  | 233 | unsigned Precedence;  // Precedence if a binary op. | 
|  | 234 | }; | 
|  | 235 |  | 
|  | 236 | /// FunctionAST - This class represents a function definition itself. | 
|  | 237 | struct FunctionAST { | 
|  | 238 | FunctionAST(std::unique_ptr<PrototypeAST> Proto, | 
|  | 239 | std::unique_ptr<ExprAST> Body) | 
|  | 240 | : Proto(std::move(Proto)), Body(std::move(Body)) {} | 
|  | 241 |  | 
|  | 242 | Function *IRGen(IRGenContext &C) const; | 
|  | 243 |  | 
|  | 244 | std::unique_ptr<PrototypeAST> Proto; | 
|  | 245 | std::unique_ptr<ExprAST> Body; | 
|  | 246 | }; | 
|  | 247 |  | 
|  | 248 | //===----------------------------------------------------------------------===// | 
|  | 249 | // Parser | 
|  | 250 | //===----------------------------------------------------------------------===// | 
|  | 251 |  | 
|  | 252 | /// CurTok/getNextToken - Provide a simple token buffer.  CurTok is the current | 
|  | 253 | /// token the parser is looking at.  getNextToken reads another token from the | 
|  | 254 | /// lexer and updates CurTok with its results. | 
|  | 255 | static int CurTok; | 
|  | 256 | static int getNextToken() { | 
|  | 257 | return CurTok = gettok(); | 
|  | 258 | } | 
|  | 259 |  | 
|  | 260 | /// BinopPrecedence - This holds the precedence for each binary operator that is | 
|  | 261 | /// defined. | 
|  | 262 | static std::map<char, int> BinopPrecedence; | 
|  | 263 |  | 
|  | 264 | /// GetTokPrecedence - Get the precedence of the pending binary operator token. | 
|  | 265 | static int GetTokPrecedence() { | 
|  | 266 | if (!isascii(CurTok)) | 
|  | 267 | return -1; | 
|  | 268 |  | 
|  | 269 | // Make sure it's a declared binop. | 
|  | 270 | int TokPrec = BinopPrecedence[CurTok]; | 
|  | 271 | if (TokPrec <= 0) return -1; | 
|  | 272 | return TokPrec; | 
|  | 273 | } | 
|  | 274 |  | 
|  | 275 | template <typename T> | 
|  | 276 | std::unique_ptr<T> ErrorU(const std::string &Str) { | 
|  | 277 | std::cerr << "Error: " << Str << "\n"; | 
|  | 278 | return nullptr; | 
|  | 279 | } | 
|  | 280 |  | 
|  | 281 | template <typename T> | 
|  | 282 | T* ErrorP(const std::string &Str) { | 
|  | 283 | std::cerr << "Error: " << Str << "\n"; | 
|  | 284 | return nullptr; | 
|  | 285 | } | 
|  | 286 |  | 
|  | 287 | static std::unique_ptr<ExprAST> ParseExpression(); | 
|  | 288 |  | 
|  | 289 | /// identifierexpr | 
|  | 290 | ///   ::= identifier | 
|  | 291 | ///   ::= identifier '(' expression* ')' | 
|  | 292 | static std::unique_ptr<ExprAST> ParseIdentifierExpr() { | 
|  | 293 | std::string IdName = IdentifierStr; | 
|  | 294 |  | 
|  | 295 | getNextToken();  // eat identifier. | 
|  | 296 |  | 
|  | 297 | if (CurTok != '(') // Simple variable ref. | 
|  | 298 | return llvm::make_unique<VariableExprAST>(IdName); | 
|  | 299 |  | 
|  | 300 | // Call. | 
|  | 301 | getNextToken();  // eat ( | 
|  | 302 | std::vector<std::unique_ptr<ExprAST>> Args; | 
|  | 303 | if (CurTok != ')') { | 
|  | 304 | while (1) { | 
|  | 305 | auto Arg = ParseExpression(); | 
|  | 306 | if (!Arg) return nullptr; | 
|  | 307 | Args.push_back(std::move(Arg)); | 
|  | 308 |  | 
|  | 309 | if (CurTok == ')') break; | 
|  | 310 |  | 
|  | 311 | if (CurTok != ',') | 
|  | 312 | return ErrorU<CallExprAST>("Expected ')' or ',' in argument list"); | 
|  | 313 | getNextToken(); | 
|  | 314 | } | 
|  | 315 | } | 
|  | 316 |  | 
|  | 317 | // Eat the ')'. | 
|  | 318 | getNextToken(); | 
|  | 319 |  | 
|  | 320 | return llvm::make_unique<CallExprAST>(IdName, std::move(Args)); | 
|  | 321 | } | 
|  | 322 |  | 
|  | 323 | /// numberexpr ::= number | 
|  | 324 | static std::unique_ptr<NumberExprAST> ParseNumberExpr() { | 
|  | 325 | auto Result = llvm::make_unique<NumberExprAST>(NumVal); | 
|  | 326 | getNextToken(); // consume the number | 
|  | 327 | return Result; | 
|  | 328 | } | 
|  | 329 |  | 
|  | 330 | /// parenexpr ::= '(' expression ')' | 
|  | 331 | static std::unique_ptr<ExprAST> ParseParenExpr() { | 
|  | 332 | getNextToken();  // eat (. | 
|  | 333 | auto V = ParseExpression(); | 
|  | 334 | if (!V) | 
|  | 335 | return nullptr; | 
|  | 336 |  | 
|  | 337 | if (CurTok != ')') | 
|  | 338 | return ErrorU<ExprAST>("expected ')'"); | 
|  | 339 | getNextToken();  // eat ). | 
|  | 340 | return V; | 
|  | 341 | } | 
|  | 342 |  | 
|  | 343 | /// ifexpr ::= 'if' expression 'then' expression 'else' expression | 
|  | 344 | static std::unique_ptr<ExprAST> ParseIfExpr() { | 
|  | 345 | getNextToken();  // eat the if. | 
|  | 346 |  | 
|  | 347 | // condition. | 
|  | 348 | auto Cond = ParseExpression(); | 
|  | 349 | if (!Cond) | 
|  | 350 | return nullptr; | 
|  | 351 |  | 
|  | 352 | if (CurTok != tok_then) | 
|  | 353 | return ErrorU<ExprAST>("expected then"); | 
|  | 354 | getNextToken();  // eat the then | 
|  | 355 |  | 
|  | 356 | auto Then = ParseExpression(); | 
|  | 357 | if (!Then) | 
|  | 358 | return nullptr; | 
|  | 359 |  | 
|  | 360 | if (CurTok != tok_else) | 
|  | 361 | return ErrorU<ExprAST>("expected else"); | 
|  | 362 |  | 
|  | 363 | getNextToken(); | 
|  | 364 |  | 
|  | 365 | auto Else = ParseExpression(); | 
|  | 366 | if (!Else) | 
|  | 367 | return nullptr; | 
|  | 368 |  | 
|  | 369 | return llvm::make_unique<IfExprAST>(std::move(Cond), std::move(Then), | 
|  | 370 | std::move(Else)); | 
|  | 371 | } | 
|  | 372 |  | 
|  | 373 | /// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression | 
|  | 374 | static std::unique_ptr<ForExprAST> ParseForExpr() { | 
|  | 375 | getNextToken();  // eat the for. | 
|  | 376 |  | 
|  | 377 | if (CurTok != tok_identifier) | 
|  | 378 | return ErrorU<ForExprAST>("expected identifier after for"); | 
|  | 379 |  | 
|  | 380 | std::string IdName = IdentifierStr; | 
|  | 381 | getNextToken();  // eat identifier. | 
|  | 382 |  | 
|  | 383 | if (CurTok != '=') | 
|  | 384 | return ErrorU<ForExprAST>("expected '=' after for"); | 
|  | 385 | getNextToken();  // eat '='. | 
|  | 386 |  | 
|  | 387 |  | 
|  | 388 | auto Start = ParseExpression(); | 
|  | 389 | if (!Start) | 
|  | 390 | return nullptr; | 
|  | 391 | if (CurTok != ',') | 
|  | 392 | return ErrorU<ForExprAST>("expected ',' after for start value"); | 
|  | 393 | getNextToken(); | 
|  | 394 |  | 
|  | 395 | auto End = ParseExpression(); | 
|  | 396 | if (!End) | 
|  | 397 | return nullptr; | 
|  | 398 |  | 
|  | 399 | // The step value is optional. | 
|  | 400 | std::unique_ptr<ExprAST> Step; | 
|  | 401 | if (CurTok == ',') { | 
|  | 402 | getNextToken(); | 
|  | 403 | Step = ParseExpression(); | 
|  | 404 | if (!Step) | 
|  | 405 | return nullptr; | 
|  | 406 | } | 
|  | 407 |  | 
|  | 408 | if (CurTok != tok_in) | 
|  | 409 | return ErrorU<ForExprAST>("expected 'in' after for"); | 
|  | 410 | getNextToken();  // eat 'in'. | 
|  | 411 |  | 
|  | 412 | auto Body = ParseExpression(); | 
|  | 413 | if (Body) | 
|  | 414 | return nullptr; | 
|  | 415 |  | 
|  | 416 | return llvm::make_unique<ForExprAST>(IdName, std::move(Start), std::move(End), | 
|  | 417 | std::move(Step), std::move(Body)); | 
|  | 418 | } | 
|  | 419 |  | 
|  | 420 | /// varexpr ::= 'var' identifier ('=' expression)? | 
|  | 421 | //                    (',' identifier ('=' expression)?)* 'in' expression | 
|  | 422 | static std::unique_ptr<VarExprAST> ParseVarExpr() { | 
|  | 423 | getNextToken();  // eat the var. | 
|  | 424 |  | 
|  | 425 | VarExprAST::BindingList VarBindings; | 
|  | 426 |  | 
|  | 427 | // At least one variable name is required. | 
|  | 428 | if (CurTok != tok_identifier) | 
|  | 429 | return ErrorU<VarExprAST>("expected identifier after var"); | 
|  | 430 |  | 
|  | 431 | while (1) { | 
|  | 432 | std::string Name = IdentifierStr; | 
|  | 433 | getNextToken();  // eat identifier. | 
|  | 434 |  | 
|  | 435 | // Read the optional initializer. | 
|  | 436 | std::unique_ptr<ExprAST> Init; | 
|  | 437 | if (CurTok == '=') { | 
|  | 438 | getNextToken(); // eat the '='. | 
|  | 439 |  | 
|  | 440 | Init = ParseExpression(); | 
|  | 441 | if (!Init) | 
|  | 442 | return nullptr; | 
|  | 443 | } | 
|  | 444 |  | 
|  | 445 | VarBindings.push_back(VarExprAST::Binding(Name, std::move(Init))); | 
|  | 446 |  | 
|  | 447 | // End of var list, exit loop. | 
|  | 448 | if (CurTok != ',') break; | 
|  | 449 | getNextToken(); // eat the ','. | 
|  | 450 |  | 
|  | 451 | if (CurTok != tok_identifier) | 
|  | 452 | return ErrorU<VarExprAST>("expected identifier list after var"); | 
|  | 453 | } | 
|  | 454 |  | 
|  | 455 | // At this point, we have to have 'in'. | 
|  | 456 | if (CurTok != tok_in) | 
|  | 457 | return ErrorU<VarExprAST>("expected 'in' keyword after 'var'"); | 
|  | 458 | getNextToken();  // eat 'in'. | 
|  | 459 |  | 
|  | 460 | auto Body = ParseExpression(); | 
|  | 461 | if (!Body) | 
|  | 462 | return nullptr; | 
|  | 463 |  | 
|  | 464 | return llvm::make_unique<VarExprAST>(std::move(VarBindings), std::move(Body)); | 
|  | 465 | } | 
|  | 466 |  | 
|  | 467 | /// primary | 
|  | 468 | ///   ::= identifierexpr | 
|  | 469 | ///   ::= numberexpr | 
|  | 470 | ///   ::= parenexpr | 
|  | 471 | ///   ::= ifexpr | 
|  | 472 | ///   ::= forexpr | 
|  | 473 | ///   ::= varexpr | 
|  | 474 | static std::unique_ptr<ExprAST> ParsePrimary() { | 
|  | 475 | switch (CurTok) { | 
|  | 476 | default: return ErrorU<ExprAST>("unknown token when expecting an expression"); | 
|  | 477 | case tok_identifier: return ParseIdentifierExpr(); | 
|  | 478 | case tok_number:     return ParseNumberExpr(); | 
|  | 479 | case '(':            return ParseParenExpr(); | 
|  | 480 | case tok_if:         return ParseIfExpr(); | 
|  | 481 | case tok_for:        return ParseForExpr(); | 
|  | 482 | case tok_var:        return ParseVarExpr(); | 
|  | 483 | } | 
|  | 484 | } | 
|  | 485 |  | 
|  | 486 | /// unary | 
|  | 487 | ///   ::= primary | 
|  | 488 | ///   ::= '!' unary | 
|  | 489 | static std::unique_ptr<ExprAST> ParseUnary() { | 
|  | 490 | // If the current token is not an operator, it must be a primary expr. | 
|  | 491 | if (!isascii(CurTok) || CurTok == '(' || CurTok == ',') | 
|  | 492 | return ParsePrimary(); | 
|  | 493 |  | 
|  | 494 | // If this is a unary operator, read it. | 
|  | 495 | int Opc = CurTok; | 
|  | 496 | getNextToken(); | 
|  | 497 | if (auto Operand = ParseUnary()) | 
|  | 498 | return llvm::make_unique<UnaryExprAST>(Opc, std::move(Operand)); | 
|  | 499 | return nullptr; | 
|  | 500 | } | 
|  | 501 |  | 
|  | 502 | /// binoprhs | 
|  | 503 | ///   ::= ('+' unary)* | 
|  | 504 | static std::unique_ptr<ExprAST> ParseBinOpRHS(int ExprPrec, | 
|  | 505 | std::unique_ptr<ExprAST> LHS) { | 
|  | 506 | // If this is a binop, find its precedence. | 
|  | 507 | while (1) { | 
|  | 508 | int TokPrec = GetTokPrecedence(); | 
|  | 509 |  | 
|  | 510 | // If this is a binop that binds at least as tightly as the current binop, | 
|  | 511 | // consume it, otherwise we are done. | 
|  | 512 | if (TokPrec < ExprPrec) | 
|  | 513 | return LHS; | 
|  | 514 |  | 
|  | 515 | // Okay, we know this is a binop. | 
|  | 516 | int BinOp = CurTok; | 
|  | 517 | getNextToken();  // eat binop | 
|  | 518 |  | 
|  | 519 | // Parse the unary expression after the binary operator. | 
|  | 520 | auto RHS = ParseUnary(); | 
|  | 521 | if (!RHS) | 
|  | 522 | return nullptr; | 
|  | 523 |  | 
|  | 524 | // If BinOp binds less tightly with RHS than the operator after RHS, let | 
|  | 525 | // the pending operator take RHS as its LHS. | 
|  | 526 | int NextPrec = GetTokPrecedence(); | 
|  | 527 | if (TokPrec < NextPrec) { | 
|  | 528 | RHS = ParseBinOpRHS(TokPrec+1, std::move(RHS)); | 
|  | 529 | if (!RHS) | 
|  | 530 | return nullptr; | 
|  | 531 | } | 
|  | 532 |  | 
|  | 533 | // Merge LHS/RHS. | 
|  | 534 | LHS = llvm::make_unique<BinaryExprAST>(BinOp, std::move(LHS), std::move(RHS)); | 
|  | 535 | } | 
|  | 536 | } | 
|  | 537 |  | 
|  | 538 | /// expression | 
|  | 539 | ///   ::= unary binoprhs | 
|  | 540 | /// | 
|  | 541 | static std::unique_ptr<ExprAST> ParseExpression() { | 
|  | 542 | auto LHS = ParseUnary(); | 
|  | 543 | if (!LHS) | 
|  | 544 | return nullptr; | 
|  | 545 |  | 
|  | 546 | return ParseBinOpRHS(0, std::move(LHS)); | 
|  | 547 | } | 
|  | 548 |  | 
|  | 549 | /// prototype | 
|  | 550 | ///   ::= id '(' id* ')' | 
|  | 551 | ///   ::= binary LETTER number? (id, id) | 
|  | 552 | ///   ::= unary LETTER (id) | 
|  | 553 | static std::unique_ptr<PrototypeAST> ParsePrototype() { | 
|  | 554 | std::string FnName; | 
|  | 555 |  | 
|  | 556 | unsigned Kind = 0; // 0 = identifier, 1 = unary, 2 = binary. | 
|  | 557 | unsigned BinaryPrecedence = 30; | 
|  | 558 |  | 
|  | 559 | switch (CurTok) { | 
|  | 560 | default: | 
|  | 561 | return ErrorU<PrototypeAST>("Expected function name in prototype"); | 
|  | 562 | case tok_identifier: | 
|  | 563 | FnName = IdentifierStr; | 
|  | 564 | Kind = 0; | 
|  | 565 | getNextToken(); | 
|  | 566 | break; | 
|  | 567 | case tok_unary: | 
|  | 568 | getNextToken(); | 
|  | 569 | if (!isascii(CurTok)) | 
|  | 570 | return ErrorU<PrototypeAST>("Expected unary operator"); | 
|  | 571 | FnName = "unary"; | 
|  | 572 | FnName += (char)CurTok; | 
|  | 573 | Kind = 1; | 
|  | 574 | getNextToken(); | 
|  | 575 | break; | 
|  | 576 | case tok_binary: | 
|  | 577 | getNextToken(); | 
|  | 578 | if (!isascii(CurTok)) | 
|  | 579 | return ErrorU<PrototypeAST>("Expected binary operator"); | 
|  | 580 | FnName = "binary"; | 
|  | 581 | FnName += (char)CurTok; | 
|  | 582 | Kind = 2; | 
|  | 583 | getNextToken(); | 
|  | 584 |  | 
|  | 585 | // Read the precedence if present. | 
|  | 586 | if (CurTok == tok_number) { | 
|  | 587 | if (NumVal < 1 || NumVal > 100) | 
|  | 588 | return ErrorU<PrototypeAST>("Invalid precedecnce: must be 1..100"); | 
|  | 589 | BinaryPrecedence = (unsigned)NumVal; | 
|  | 590 | getNextToken(); | 
|  | 591 | } | 
|  | 592 | break; | 
|  | 593 | } | 
|  | 594 |  | 
|  | 595 | if (CurTok != '(') | 
|  | 596 | return ErrorU<PrototypeAST>("Expected '(' in prototype"); | 
|  | 597 |  | 
|  | 598 | std::vector<std::string> ArgNames; | 
|  | 599 | while (getNextToken() == tok_identifier) | 
|  | 600 | ArgNames.push_back(IdentifierStr); | 
|  | 601 | if (CurTok != ')') | 
|  | 602 | return ErrorU<PrototypeAST>("Expected ')' in prototype"); | 
|  | 603 |  | 
|  | 604 | // success. | 
|  | 605 | getNextToken();  // eat ')'. | 
|  | 606 |  | 
|  | 607 | // Verify right number of names for operator. | 
|  | 608 | if (Kind && ArgNames.size() != Kind) | 
|  | 609 | return ErrorU<PrototypeAST>("Invalid number of operands for operator"); | 
|  | 610 |  | 
|  | 611 | return llvm::make_unique<PrototypeAST>(FnName, std::move(ArgNames), Kind != 0, | 
|  | 612 | BinaryPrecedence); | 
|  | 613 | } | 
|  | 614 |  | 
|  | 615 | /// definition ::= 'def' prototype expression | 
|  | 616 | static std::unique_ptr<FunctionAST> ParseDefinition() { | 
|  | 617 | getNextToken();  // eat def. | 
|  | 618 | auto Proto = ParsePrototype(); | 
|  | 619 | if (!Proto) | 
|  | 620 | return nullptr; | 
|  | 621 |  | 
|  | 622 | if (auto Body = ParseExpression()) | 
|  | 623 | return llvm::make_unique<FunctionAST>(std::move(Proto), std::move(Body)); | 
|  | 624 | return nullptr; | 
|  | 625 | } | 
|  | 626 |  | 
|  | 627 | /// toplevelexpr ::= expression | 
|  | 628 | static std::unique_ptr<FunctionAST> ParseTopLevelExpr() { | 
|  | 629 | if (auto E = ParseExpression()) { | 
|  | 630 | // Make an anonymous proto. | 
|  | 631 | auto Proto = | 
|  | 632 | llvm::make_unique<PrototypeAST>("__anon_expr", std::vector<std::string>()); | 
|  | 633 | return llvm::make_unique<FunctionAST>(std::move(Proto), std::move(E)); | 
|  | 634 | } | 
|  | 635 | return nullptr; | 
|  | 636 | } | 
|  | 637 |  | 
|  | 638 | /// external ::= 'extern' prototype | 
|  | 639 | static std::unique_ptr<PrototypeAST> ParseExtern() { | 
|  | 640 | getNextToken();  // eat extern. | 
|  | 641 | return ParsePrototype(); | 
|  | 642 | } | 
|  | 643 |  | 
|  | 644 | //===----------------------------------------------------------------------===// | 
|  | 645 | // Code Generation | 
|  | 646 | //===----------------------------------------------------------------------===// | 
|  | 647 |  | 
|  | 648 | // FIXME: Obviously we can do better than this | 
|  | 649 | std::string GenerateUniqueName(const std::string &Root) { | 
|  | 650 | static int i = 0; | 
|  | 651 | std::ostringstream NameStream; | 
|  | 652 | NameStream << Root << ++i; | 
|  | 653 | return NameStream.str(); | 
|  | 654 | } | 
|  | 655 |  | 
|  | 656 | std::string MakeLegalFunctionName(std::string Name) | 
|  | 657 | { | 
|  | 658 | std::string NewName; | 
|  | 659 | assert(!Name.empty() && "Base name must not be empty"); | 
|  | 660 |  | 
|  | 661 | // Start with what we have | 
|  | 662 | NewName = Name; | 
|  | 663 |  | 
|  | 664 | // Look for a numberic first character | 
|  | 665 | if (NewName.find_first_of("0123456789") == 0) { | 
|  | 666 | NewName.insert(0, 1, 'n'); | 
|  | 667 | } | 
|  | 668 |  | 
|  | 669 | // Replace illegal characters with their ASCII equivalent | 
|  | 670 | std::string legal_elements = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; | 
|  | 671 | size_t pos; | 
|  | 672 | while ((pos = NewName.find_first_not_of(legal_elements)) != std::string::npos) { | 
|  | 673 | std::ostringstream NumStream; | 
|  | 674 | NumStream << (int)NewName.at(pos); | 
|  | 675 | NewName = NewName.replace(pos, 1, NumStream.str()); | 
|  | 676 | } | 
|  | 677 |  | 
|  | 678 | return NewName; | 
|  | 679 | } | 
|  | 680 |  | 
|  | 681 | class SessionContext { | 
|  | 682 | public: | 
|  | 683 | SessionContext(LLVMContext &C) : Context(C) {} | 
|  | 684 | LLVMContext& getLLVMContext() const { return Context; } | 
|  | 685 | void addPrototypeAST(std::unique_ptr<PrototypeAST> P); | 
|  | 686 | PrototypeAST* getPrototypeAST(const std::string &Name); | 
|  | 687 | std::map<std::string, std::unique_ptr<FunctionAST>> FunctionDefs; | 
|  | 688 | private: | 
|  | 689 | typedef std::map<std::string, std::unique_ptr<PrototypeAST>> PrototypeMap; | 
|  | 690 | LLVMContext &Context; | 
|  | 691 | PrototypeMap Prototypes; | 
|  | 692 | }; | 
|  | 693 |  | 
|  | 694 | void SessionContext::addPrototypeAST(std::unique_ptr<PrototypeAST> P) { | 
|  | 695 | Prototypes[P->Name] = std::move(P); | 
|  | 696 | } | 
|  | 697 |  | 
|  | 698 | PrototypeAST* SessionContext::getPrototypeAST(const std::string &Name) { | 
|  | 699 | PrototypeMap::iterator I = Prototypes.find(Name); | 
|  | 700 | if (I != Prototypes.end()) | 
|  | 701 | return I->second.get(); | 
|  | 702 | return nullptr; | 
|  | 703 | } | 
|  | 704 |  | 
|  | 705 | class IRGenContext { | 
|  | 706 | public: | 
|  | 707 |  | 
|  | 708 | IRGenContext(SessionContext &S) | 
|  | 709 | : Session(S), | 
|  | 710 | M(new Module(GenerateUniqueName("jit_module_"), | 
|  | 711 | Session.getLLVMContext())), | 
|  | 712 | Builder(Session.getLLVMContext()) {} | 
|  | 713 |  | 
|  | 714 | SessionContext& getSession() { return Session; } | 
|  | 715 | Module& getM() const { return *M; } | 
|  | 716 | std::unique_ptr<Module> takeM() { return std::move(M); } | 
|  | 717 | IRBuilder<>& getBuilder() { return Builder; } | 
|  | 718 | LLVMContext& getLLVMContext() { return Session.getLLVMContext(); } | 
|  | 719 | Function* getPrototype(const std::string &Name); | 
|  | 720 |  | 
|  | 721 | std::map<std::string, AllocaInst*> NamedValues; | 
|  | 722 | private: | 
|  | 723 | SessionContext &Session; | 
|  | 724 | std::unique_ptr<Module> M; | 
|  | 725 | IRBuilder<> Builder; | 
|  | 726 | }; | 
|  | 727 |  | 
|  | 728 | Function* IRGenContext::getPrototype(const std::string &Name) { | 
|  | 729 | if (Function *ExistingProto = M->getFunction(Name)) | 
|  | 730 | return ExistingProto; | 
|  | 731 | if (PrototypeAST *ProtoAST = Session.getPrototypeAST(Name)) | 
|  | 732 | return ProtoAST->IRGen(*this); | 
|  | 733 | return nullptr; | 
|  | 734 | } | 
|  | 735 |  | 
|  | 736 | /// CreateEntryBlockAlloca - Create an alloca instruction in the entry block of | 
|  | 737 | /// the function.  This is used for mutable variables etc. | 
|  | 738 | static AllocaInst *CreateEntryBlockAlloca(Function *TheFunction, | 
|  | 739 | const std::string &VarName) { | 
|  | 740 | IRBuilder<> TmpB(&TheFunction->getEntryBlock(), | 
|  | 741 | TheFunction->getEntryBlock().begin()); | 
|  | 742 | return TmpB.CreateAlloca(Type::getDoubleTy(getGlobalContext()), 0, | 
|  | 743 | VarName.c_str()); | 
|  | 744 | } | 
|  | 745 |  | 
|  | 746 | Value *NumberExprAST::IRGen(IRGenContext &C) const { | 
|  | 747 | return ConstantFP::get(C.getLLVMContext(), APFloat(Val)); | 
|  | 748 | } | 
|  | 749 |  | 
|  | 750 | Value *VariableExprAST::IRGen(IRGenContext &C) const { | 
|  | 751 | // Look this variable up in the function. | 
|  | 752 | Value *V = C.NamedValues[Name]; | 
|  | 753 |  | 
|  | 754 | if (V == 0) | 
|  | 755 | return ErrorP<Value>("Unknown variable name '" + Name + "'"); | 
|  | 756 |  | 
|  | 757 | // Load the value. | 
|  | 758 | return C.getBuilder().CreateLoad(V, Name.c_str()); | 
|  | 759 | } | 
|  | 760 |  | 
|  | 761 | Value *UnaryExprAST::IRGen(IRGenContext &C) const { | 
|  | 762 | if (Value *OperandV = Operand->IRGen(C)) { | 
|  | 763 | std::string FnName = MakeLegalFunctionName(std::string("unary")+Opcode); | 
|  | 764 | if (Function *F = C.getPrototype(FnName)) | 
|  | 765 | return C.getBuilder().CreateCall(F, OperandV, "unop"); | 
|  | 766 | return ErrorP<Value>("Unknown unary operator"); | 
|  | 767 | } | 
|  | 768 |  | 
|  | 769 | // Could not codegen operand - return null. | 
|  | 770 | return nullptr; | 
|  | 771 | } | 
|  | 772 |  | 
|  | 773 | Value *BinaryExprAST::IRGen(IRGenContext &C) const { | 
|  | 774 | // Special case '=' because we don't want to emit the LHS as an expression. | 
|  | 775 | if (Op == '=') { | 
|  | 776 | // Assignment requires the LHS to be an identifier. | 
|  | 777 | auto LHSVar = static_cast<VariableExprAST&>(*LHS); | 
|  | 778 | // Codegen the RHS. | 
|  | 779 | Value *Val = RHS->IRGen(C); | 
|  | 780 | if (!Val) return nullptr; | 
|  | 781 |  | 
|  | 782 | // Look up the name. | 
|  | 783 | if (auto Variable = C.NamedValues[LHSVar.Name]) { | 
|  | 784 | C.getBuilder().CreateStore(Val, Variable); | 
|  | 785 | return Val; | 
|  | 786 | } | 
|  | 787 | return ErrorP<Value>("Unknown variable name"); | 
|  | 788 | } | 
|  | 789 |  | 
|  | 790 | Value *L = LHS->IRGen(C); | 
|  | 791 | Value *R = RHS->IRGen(C); | 
|  | 792 | if (!L || !R) return nullptr; | 
|  | 793 |  | 
|  | 794 | switch (Op) { | 
|  | 795 | case '+': return C.getBuilder().CreateFAdd(L, R, "addtmp"); | 
|  | 796 | case '-': return C.getBuilder().CreateFSub(L, R, "subtmp"); | 
|  | 797 | case '*': return C.getBuilder().CreateFMul(L, R, "multmp"); | 
|  | 798 | case '/': return C.getBuilder().CreateFDiv(L, R, "divtmp"); | 
|  | 799 | case '<': | 
|  | 800 | L = C.getBuilder().CreateFCmpULT(L, R, "cmptmp"); | 
|  | 801 | // Convert bool 0/1 to double 0.0 or 1.0 | 
|  | 802 | return C.getBuilder().CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()), | 
|  | 803 | "booltmp"); | 
|  | 804 | default: break; | 
|  | 805 | } | 
|  | 806 |  | 
|  | 807 | // If it wasn't a builtin binary operator, it must be a user defined one. Emit | 
|  | 808 | // a call to it. | 
|  | 809 | std::string FnName = MakeLegalFunctionName(std::string("binary")+Op); | 
|  | 810 | if (Function *F = C.getPrototype(FnName)) { | 
|  | 811 | Value *Ops[] = { L, R }; | 
|  | 812 | return C.getBuilder().CreateCall(F, Ops, "binop"); | 
|  | 813 | } | 
|  | 814 |  | 
|  | 815 | return ErrorP<Value>("Unknown binary operator"); | 
|  | 816 | } | 
|  | 817 |  | 
|  | 818 | Value *CallExprAST::IRGen(IRGenContext &C) const { | 
|  | 819 | // Look up the name in the global module table. | 
|  | 820 | if (auto CalleeF = C.getPrototype(CalleeName)) { | 
|  | 821 | // If argument mismatch error. | 
|  | 822 | if (CalleeF->arg_size() != Args.size()) | 
|  | 823 | return ErrorP<Value>("Incorrect # arguments passed"); | 
|  | 824 |  | 
|  | 825 | std::vector<Value*> ArgsV; | 
|  | 826 | for (unsigned i = 0, e = Args.size(); i != e; ++i) { | 
|  | 827 | ArgsV.push_back(Args[i]->IRGen(C)); | 
|  | 828 | if (!ArgsV.back()) return nullptr; | 
|  | 829 | } | 
|  | 830 |  | 
|  | 831 | return C.getBuilder().CreateCall(CalleeF, ArgsV, "calltmp"); | 
|  | 832 | } | 
|  | 833 |  | 
|  | 834 | return ErrorP<Value>("Unknown function referenced"); | 
|  | 835 | } | 
|  | 836 |  | 
|  | 837 | Value *IfExprAST::IRGen(IRGenContext &C) const { | 
|  | 838 | Value *CondV = Cond->IRGen(C); | 
|  | 839 | if (!CondV) return nullptr; | 
|  | 840 |  | 
|  | 841 | // Convert condition to a bool by comparing equal to 0.0. | 
|  | 842 | ConstantFP *FPZero = | 
|  | 843 | ConstantFP::get(C.getLLVMContext(), APFloat(0.0)); | 
|  | 844 | CondV = C.getBuilder().CreateFCmpONE(CondV, FPZero, "ifcond"); | 
|  | 845 |  | 
|  | 846 | Function *TheFunction = C.getBuilder().GetInsertBlock()->getParent(); | 
|  | 847 |  | 
|  | 848 | // Create blocks for the then and else cases.  Insert the 'then' block at the | 
|  | 849 | // end of the function. | 
|  | 850 | BasicBlock *ThenBB = BasicBlock::Create(C.getLLVMContext(), "then", TheFunction); | 
|  | 851 | BasicBlock *ElseBB = BasicBlock::Create(C.getLLVMContext(), "else"); | 
|  | 852 | BasicBlock *MergeBB = BasicBlock::Create(C.getLLVMContext(), "ifcont"); | 
|  | 853 |  | 
|  | 854 | C.getBuilder().CreateCondBr(CondV, ThenBB, ElseBB); | 
|  | 855 |  | 
|  | 856 | // Emit then value. | 
|  | 857 | C.getBuilder().SetInsertPoint(ThenBB); | 
|  | 858 |  | 
|  | 859 | Value *ThenV = Then->IRGen(C); | 
|  | 860 | if (!ThenV) return nullptr; | 
|  | 861 |  | 
|  | 862 | C.getBuilder().CreateBr(MergeBB); | 
|  | 863 | // Codegen of 'Then' can change the current block, update ThenBB for the PHI. | 
|  | 864 | ThenBB = C.getBuilder().GetInsertBlock(); | 
|  | 865 |  | 
|  | 866 | // Emit else block. | 
|  | 867 | TheFunction->getBasicBlockList().push_back(ElseBB); | 
|  | 868 | C.getBuilder().SetInsertPoint(ElseBB); | 
|  | 869 |  | 
|  | 870 | Value *ElseV = Else->IRGen(C); | 
|  | 871 | if (!ElseV) return nullptr; | 
|  | 872 |  | 
|  | 873 | C.getBuilder().CreateBr(MergeBB); | 
|  | 874 | // Codegen of 'Else' can change the current block, update ElseBB for the PHI. | 
|  | 875 | ElseBB = C.getBuilder().GetInsertBlock(); | 
|  | 876 |  | 
|  | 877 | // Emit merge block. | 
|  | 878 | TheFunction->getBasicBlockList().push_back(MergeBB); | 
|  | 879 | C.getBuilder().SetInsertPoint(MergeBB); | 
|  | 880 | PHINode *PN = C.getBuilder().CreatePHI(Type::getDoubleTy(getGlobalContext()), 2, | 
|  | 881 | "iftmp"); | 
|  | 882 |  | 
|  | 883 | PN->addIncoming(ThenV, ThenBB); | 
|  | 884 | PN->addIncoming(ElseV, ElseBB); | 
|  | 885 | return PN; | 
|  | 886 | } | 
|  | 887 |  | 
|  | 888 | Value *ForExprAST::IRGen(IRGenContext &C) const { | 
|  | 889 | // Output this as: | 
|  | 890 | //   var = alloca double | 
|  | 891 | //   ... | 
|  | 892 | //   start = startexpr | 
|  | 893 | //   store start -> var | 
|  | 894 | //   goto loop | 
|  | 895 | // loop: | 
|  | 896 | //   ... | 
|  | 897 | //   bodyexpr | 
|  | 898 | //   ... | 
|  | 899 | // loopend: | 
|  | 900 | //   step = stepexpr | 
|  | 901 | //   endcond = endexpr | 
|  | 902 | // | 
|  | 903 | //   curvar = load var | 
|  | 904 | //   nextvar = curvar + step | 
|  | 905 | //   store nextvar -> var | 
|  | 906 | //   br endcond, loop, endloop | 
|  | 907 | // outloop: | 
|  | 908 |  | 
|  | 909 | Function *TheFunction = C.getBuilder().GetInsertBlock()->getParent(); | 
|  | 910 |  | 
|  | 911 | // Create an alloca for the variable in the entry block. | 
|  | 912 | AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, VarName); | 
|  | 913 |  | 
|  | 914 | // Emit the start code first, without 'variable' in scope. | 
|  | 915 | Value *StartVal = Start->IRGen(C); | 
|  | 916 | if (!StartVal) return nullptr; | 
|  | 917 |  | 
|  | 918 | // Store the value into the alloca. | 
|  | 919 | C.getBuilder().CreateStore(StartVal, Alloca); | 
|  | 920 |  | 
|  | 921 | // Make the new basic block for the loop header, inserting after current | 
|  | 922 | // block. | 
|  | 923 | BasicBlock *LoopBB = BasicBlock::Create(getGlobalContext(), "loop", TheFunction); | 
|  | 924 |  | 
|  | 925 | // Insert an explicit fall through from the current block to the LoopBB. | 
|  | 926 | C.getBuilder().CreateBr(LoopBB); | 
|  | 927 |  | 
|  | 928 | // Start insertion in LoopBB. | 
|  | 929 | C.getBuilder().SetInsertPoint(LoopBB); | 
|  | 930 |  | 
|  | 931 | // Within the loop, the variable is defined equal to the PHI node.  If it | 
|  | 932 | // shadows an existing variable, we have to restore it, so save it now. | 
|  | 933 | AllocaInst *OldVal = C.NamedValues[VarName]; | 
|  | 934 | C.NamedValues[VarName] = Alloca; | 
|  | 935 |  | 
|  | 936 | // Emit the body of the loop.  This, like any other expr, can change the | 
|  | 937 | // current BB.  Note that we ignore the value computed by the body, but don't | 
|  | 938 | // allow an error. | 
|  | 939 | if (!Body->IRGen(C)) | 
|  | 940 | return nullptr; | 
|  | 941 |  | 
|  | 942 | // Emit the step value. | 
|  | 943 | Value *StepVal; | 
|  | 944 | if (Step) { | 
|  | 945 | StepVal = Step->IRGen(C); | 
|  | 946 | if (!StepVal) return nullptr; | 
|  | 947 | } else { | 
|  | 948 | // If not specified, use 1.0. | 
|  | 949 | StepVal = ConstantFP::get(getGlobalContext(), APFloat(1.0)); | 
|  | 950 | } | 
|  | 951 |  | 
|  | 952 | // Compute the end condition. | 
|  | 953 | Value *EndCond = End->IRGen(C); | 
|  | 954 | if (EndCond == 0) return EndCond; | 
|  | 955 |  | 
|  | 956 | // Reload, increment, and restore the alloca.  This handles the case where | 
|  | 957 | // the body of the loop mutates the variable. | 
|  | 958 | Value *CurVar = C.getBuilder().CreateLoad(Alloca, VarName.c_str()); | 
|  | 959 | Value *NextVar = C.getBuilder().CreateFAdd(CurVar, StepVal, "nextvar"); | 
|  | 960 | C.getBuilder().CreateStore(NextVar, Alloca); | 
|  | 961 |  | 
|  | 962 | // Convert condition to a bool by comparing equal to 0.0. | 
|  | 963 | EndCond = C.getBuilder().CreateFCmpONE(EndCond, | 
|  | 964 | ConstantFP::get(getGlobalContext(), APFloat(0.0)), | 
|  | 965 | "loopcond"); | 
|  | 966 |  | 
|  | 967 | // Create the "after loop" block and insert it. | 
|  | 968 | BasicBlock *AfterBB = BasicBlock::Create(getGlobalContext(), "afterloop", TheFunction); | 
|  | 969 |  | 
|  | 970 | // Insert the conditional branch into the end of LoopEndBB. | 
|  | 971 | C.getBuilder().CreateCondBr(EndCond, LoopBB, AfterBB); | 
|  | 972 |  | 
|  | 973 | // Any new code will be inserted in AfterBB. | 
|  | 974 | C.getBuilder().SetInsertPoint(AfterBB); | 
|  | 975 |  | 
|  | 976 | // Restore the unshadowed variable. | 
|  | 977 | if (OldVal) | 
|  | 978 | C.NamedValues[VarName] = OldVal; | 
|  | 979 | else | 
|  | 980 | C.NamedValues.erase(VarName); | 
|  | 981 |  | 
|  | 982 |  | 
|  | 983 | // for expr always returns 0.0. | 
|  | 984 | return Constant::getNullValue(Type::getDoubleTy(getGlobalContext())); | 
|  | 985 | } | 
|  | 986 |  | 
|  | 987 | Value *VarExprAST::IRGen(IRGenContext &C) const { | 
|  | 988 | std::vector<AllocaInst *> OldBindings; | 
|  | 989 |  | 
|  | 990 | Function *TheFunction = C.getBuilder().GetInsertBlock()->getParent(); | 
|  | 991 |  | 
|  | 992 | // Register all variables and emit their initializer. | 
|  | 993 | for (unsigned i = 0, e = VarBindings.size(); i != e; ++i) { | 
|  | 994 | auto &VarName = VarBindings[i].first; | 
|  | 995 | auto &Init = VarBindings[i].second; | 
|  | 996 |  | 
|  | 997 | // Emit the initializer before adding the variable to scope, this prevents | 
|  | 998 | // the initializer from referencing the variable itself, and permits stuff | 
|  | 999 | // like this: | 
|  | 1000 | //  var a = 1 in | 
|  | 1001 | //    var a = a in ...   # refers to outer 'a'. | 
|  | 1002 | Value *InitVal; | 
|  | 1003 | if (Init) { | 
|  | 1004 | InitVal = Init->IRGen(C); | 
|  | 1005 | if (!InitVal) return nullptr; | 
|  | 1006 | } else // If not specified, use 0.0. | 
|  | 1007 | InitVal = ConstantFP::get(getGlobalContext(), APFloat(0.0)); | 
|  | 1008 |  | 
|  | 1009 | AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, VarName); | 
|  | 1010 | C.getBuilder().CreateStore(InitVal, Alloca); | 
|  | 1011 |  | 
|  | 1012 | // Remember the old variable binding so that we can restore the binding when | 
|  | 1013 | // we unrecurse. | 
|  | 1014 | OldBindings.push_back(C.NamedValues[VarName]); | 
|  | 1015 |  | 
|  | 1016 | // Remember this binding. | 
|  | 1017 | C.NamedValues[VarName] = Alloca; | 
|  | 1018 | } | 
|  | 1019 |  | 
|  | 1020 | // Codegen the body, now that all vars are in scope. | 
|  | 1021 | Value *BodyVal = Body->IRGen(C); | 
|  | 1022 | if (!BodyVal) return nullptr; | 
|  | 1023 |  | 
|  | 1024 | // Pop all our variables from scope. | 
|  | 1025 | for (unsigned i = 0, e = VarBindings.size(); i != e; ++i) | 
|  | 1026 | C.NamedValues[VarBindings[i].first] = OldBindings[i]; | 
|  | 1027 |  | 
|  | 1028 | // Return the body computation. | 
|  | 1029 | return BodyVal; | 
|  | 1030 | } | 
|  | 1031 |  | 
|  | 1032 | Function *PrototypeAST::IRGen(IRGenContext &C) const { | 
|  | 1033 | std::string FnName = MakeLegalFunctionName(Name); | 
|  | 1034 |  | 
|  | 1035 | // Make the function type:  double(double,double) etc. | 
|  | 1036 | std::vector<Type*> Doubles(Args.size(), | 
|  | 1037 | Type::getDoubleTy(getGlobalContext())); | 
|  | 1038 | FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()), | 
|  | 1039 | Doubles, false); | 
|  | 1040 | Function *F = Function::Create(FT, Function::ExternalLinkage, FnName, | 
|  | 1041 | &C.getM()); | 
|  | 1042 |  | 
|  | 1043 | // If F conflicted, there was already something named 'FnName'.  If it has a | 
|  | 1044 | // body, don't allow redefinition or reextern. | 
|  | 1045 | if (F->getName() != FnName) { | 
|  | 1046 | // Delete the one we just made and get the existing one. | 
|  | 1047 | F->eraseFromParent(); | 
|  | 1048 | F = C.getM().getFunction(Name); | 
|  | 1049 |  | 
|  | 1050 | // If F already has a body, reject this. | 
|  | 1051 | if (!F->empty()) { | 
|  | 1052 | ErrorP<Function>("redefinition of function"); | 
|  | 1053 | return nullptr; | 
|  | 1054 | } | 
|  | 1055 |  | 
|  | 1056 | // If F took a different number of args, reject. | 
|  | 1057 | if (F->arg_size() != Args.size()) { | 
|  | 1058 | ErrorP<Function>("redefinition of function with different # args"); | 
|  | 1059 | return nullptr; | 
|  | 1060 | } | 
|  | 1061 | } | 
|  | 1062 |  | 
|  | 1063 | // Set names for all arguments. | 
|  | 1064 | unsigned Idx = 0; | 
|  | 1065 | for (Function::arg_iterator AI = F->arg_begin(); Idx != Args.size(); | 
|  | 1066 | ++AI, ++Idx) | 
|  | 1067 | AI->setName(Args[Idx]); | 
|  | 1068 |  | 
|  | 1069 | return F; | 
|  | 1070 | } | 
|  | 1071 |  | 
|  | 1072 | /// CreateArgumentAllocas - Create an alloca for each argument and register the | 
|  | 1073 | /// argument in the symbol table so that references to it will succeed. | 
|  | 1074 | void PrototypeAST::CreateArgumentAllocas(Function *F, IRGenContext &C) { | 
|  | 1075 | Function::arg_iterator AI = F->arg_begin(); | 
|  | 1076 | for (unsigned Idx = 0, e = Args.size(); Idx != e; ++Idx, ++AI) { | 
|  | 1077 | // Create an alloca for this variable. | 
|  | 1078 | AllocaInst *Alloca = CreateEntryBlockAlloca(F, Args[Idx]); | 
|  | 1079 |  | 
|  | 1080 | // Store the initial value into the alloca. | 
|  | 1081 | C.getBuilder().CreateStore(AI, Alloca); | 
|  | 1082 |  | 
|  | 1083 | // Add arguments to variable symbol table. | 
|  | 1084 | C.NamedValues[Args[Idx]] = Alloca; | 
|  | 1085 | } | 
|  | 1086 | } | 
|  | 1087 |  | 
|  | 1088 | Function *FunctionAST::IRGen(IRGenContext &C) const { | 
|  | 1089 | C.NamedValues.clear(); | 
|  | 1090 |  | 
|  | 1091 | Function *TheFunction = Proto->IRGen(C); | 
|  | 1092 | if (!TheFunction) | 
|  | 1093 | return nullptr; | 
|  | 1094 |  | 
|  | 1095 | // If this is an operator, install it. | 
|  | 1096 | if (Proto->isBinaryOp()) | 
|  | 1097 | BinopPrecedence[Proto->getOperatorName()] = Proto->Precedence; | 
|  | 1098 |  | 
|  | 1099 | // Create a new basic block to start insertion into. | 
|  | 1100 | BasicBlock *BB = BasicBlock::Create(getGlobalContext(), "entry", TheFunction); | 
|  | 1101 | C.getBuilder().SetInsertPoint(BB); | 
|  | 1102 |  | 
|  | 1103 | // Add all arguments to the symbol table and create their allocas. | 
|  | 1104 | Proto->CreateArgumentAllocas(TheFunction, C); | 
|  | 1105 |  | 
|  | 1106 | if (Value *RetVal = Body->IRGen(C)) { | 
|  | 1107 | // Finish off the function. | 
|  | 1108 | C.getBuilder().CreateRet(RetVal); | 
|  | 1109 |  | 
|  | 1110 | // Validate the generated code, checking for consistency. | 
|  | 1111 | verifyFunction(*TheFunction); | 
|  | 1112 |  | 
|  | 1113 | return TheFunction; | 
|  | 1114 | } | 
|  | 1115 |  | 
|  | 1116 | // Error reading body, remove function. | 
|  | 1117 | TheFunction->eraseFromParent(); | 
|  | 1118 |  | 
|  | 1119 | if (Proto->isBinaryOp()) | 
|  | 1120 | BinopPrecedence.erase(Proto->getOperatorName()); | 
|  | 1121 | return nullptr; | 
|  | 1122 | } | 
|  | 1123 |  | 
|  | 1124 | //===----------------------------------------------------------------------===// | 
|  | 1125 | // Top-Level parsing and JIT Driver | 
|  | 1126 | //===----------------------------------------------------------------------===// | 
|  | 1127 |  | 
|  | 1128 | static std::unique_ptr<llvm::Module> IRGen(SessionContext &S, | 
|  | 1129 | const FunctionAST &F) { | 
|  | 1130 | IRGenContext C(S); | 
|  | 1131 | auto LF = F.IRGen(C); | 
|  | 1132 | if (!LF) | 
|  | 1133 | return nullptr; | 
|  | 1134 | #ifndef MINIMAL_STDERR_OUTPUT | 
|  | 1135 | fprintf(stderr, "Read function definition:"); | 
|  | 1136 | LF->dump(); | 
|  | 1137 | #endif | 
|  | 1138 | return C.takeM(); | 
|  | 1139 | } | 
|  | 1140 |  | 
|  | 1141 |  | 
|  | 1142 | static void EarthShatteringKaboom() { | 
|  | 1143 | fprintf(stderr, "Earth shattering kaboom."); | 
|  | 1144 | exit(1); | 
|  | 1145 | } | 
|  | 1146 |  | 
|  | 1147 | class KaleidoscopeJIT { | 
|  | 1148 | public: | 
|  | 1149 | typedef ObjectLinkingLayer<> ObjLayerT; | 
|  | 1150 | typedef IRCompileLayer<ObjLayerT> CompileLayerT; | 
|  | 1151 | typedef LazyEmittingLayer<CompileLayerT> LazyEmitLayerT; | 
|  | 1152 |  | 
|  | 1153 | typedef LazyEmitLayerT::ModuleSetHandleT ModuleHandleT; | 
|  | 1154 |  | 
|  | 1155 | std::string Mangle(const std::string &Name) { | 
|  | 1156 | std::string MangledName; | 
|  | 1157 | { | 
|  | 1158 | raw_string_ostream MangledNameStream(MangledName); | 
|  | 1159 | Mang.getNameWithPrefix(MangledNameStream, Name); | 
|  | 1160 | } | 
|  | 1161 | return MangledName; | 
|  | 1162 | } | 
|  | 1163 |  | 
|  | 1164 | KaleidoscopeJIT(SessionContext &Session) | 
|  | 1165 | : TM(EngineBuilder().selectTarget()), | 
|  | 1166 | Mang(TM->getDataLayout()), Session(Session), | 
|  | 1167 | ObjectLayer( | 
|  | 1168 | [](){ return llvm::make_unique<SectionMemoryManager>(); }), | 
|  | 1169 | CompileLayer(ObjectLayer, SimpleCompiler(*TM)), | 
|  | 1170 | LazyEmitLayer(CompileLayer), | 
|  | 1171 | CompileCallbacks(LazyEmitLayer, Session.getLLVMContext(), | 
|  | 1172 | reinterpret_cast<uintptr_t>(EarthShatteringKaboom), | 
|  | 1173 | 64) {} | 
|  | 1174 |  | 
|  | 1175 | ModuleHandleT addModule(std::unique_ptr<Module> M) { | 
|  | 1176 | if (!M->getDataLayout()) | 
|  | 1177 | M->setDataLayout(TM->getDataLayout()); | 
|  | 1178 |  | 
|  | 1179 | // The LazyEmitLayer takes lists of modules, rather than single modules, so | 
|  | 1180 | // we'll just build a single-element list. | 
|  | 1181 | std::vector<std::unique_ptr<Module>> S; | 
|  | 1182 | S.push_back(std::move(M)); | 
|  | 1183 |  | 
|  | 1184 | // We need a memory manager to allocate memory and resolve symbols for this | 
|  | 1185 | // new module. Create one that resolves symbols by looking back into the JIT. | 
|  | 1186 | auto MM = createLookasideRTDyldMM<SectionMemoryManager>( | 
|  | 1187 | [&](const std::string &Name) -> uint64_t { | 
|  | 1188 | // First try to find 'Name' within the JIT. | 
|  | 1189 | if (auto Symbol = findMangledSymbol(Name)) | 
|  | 1190 | return Symbol.getAddress(); | 
|  | 1191 |  | 
|  | 1192 | // If we don't find 'Name' in the JIT, see if we have some AST | 
|  | 1193 | // for it. | 
|  | 1194 | auto DefI = Session.FunctionDefs.find(Name); | 
|  | 1195 | if (DefI == Session.FunctionDefs.end()) | 
|  | 1196 | return 0; | 
|  | 1197 |  | 
|  | 1198 | // We have AST for 'Name'. IRGen it, add it to the JIT, and | 
|  | 1199 | // return the address for it. | 
|  | 1200 | // FIXME: What happens if IRGen fails? | 
|  | 1201 | addModule(IRGen(Session, *DefI->second)); | 
|  | 1202 |  | 
|  | 1203 | // Remove the function definition's AST now that we've | 
|  | 1204 | // finished with it. | 
|  | 1205 | Session.FunctionDefs.erase(DefI); | 
|  | 1206 |  | 
|  | 1207 | return findMangledSymbol(Name).getAddress(); | 
|  | 1208 | }, | 
|  | 1209 | [](const std::string &S) { return 0; } ); | 
|  | 1210 |  | 
|  | 1211 | return LazyEmitLayer.addModuleSet(std::move(S), std::move(MM)); | 
|  | 1212 | } | 
|  | 1213 |  | 
|  | 1214 | void removeModule(ModuleHandleT H) { LazyEmitLayer.removeModuleSet(H); } | 
|  | 1215 |  | 
|  | 1216 | JITSymbol findMangledSymbol(const std::string &Name) { | 
|  | 1217 | return LazyEmitLayer.findSymbol(Name, true); | 
|  | 1218 | } | 
|  | 1219 |  | 
|  | 1220 | JITSymbol findSymbol(const std::string &Name) { | 
|  | 1221 | return findMangledSymbol(Mangle(Name)); | 
|  | 1222 | } | 
|  | 1223 |  | 
|  | 1224 | JITSymbol findMangledSymbolIn(LazyEmitLayerT::ModuleSetHandleT H, | 
|  | 1225 | const std::string &Name) { | 
|  | 1226 | return LazyEmitLayer.findSymbolIn(H, Name, true); | 
|  | 1227 | } | 
|  | 1228 |  | 
|  | 1229 | JITSymbol findSymbolIn(LazyEmitLayerT::ModuleSetHandleT H, | 
|  | 1230 | const std::string &Name) { | 
|  | 1231 | return findMangledSymbolIn(H, Mangle(Name)); | 
|  | 1232 | } | 
|  | 1233 |  | 
|  | 1234 | void addFunctionDefinition(std::unique_ptr<FunctionAST> FnAST) { | 
|  | 1235 | // Step 1) IRGen a prototype for this function: | 
|  | 1236 | IRGenContext C(Session); | 
|  | 1237 | Function *F = FnAST->Proto->IRGen(C); | 
|  | 1238 | C.getM().setDataLayout(TM->getDataLayout()); | 
|  | 1239 |  | 
|  | 1240 | // Step 2) Create a compile callback that will be used to compile this | 
|  | 1241 | //         function when it is first called. | 
|  | 1242 | auto CallbackInfo = | 
|  | 1243 | CompileCallbacks.getCompileCallback(*F->getFunctionType()); | 
|  | 1244 |  | 
|  | 1245 | // Step 3) Create a stub that will indirectly call the body of this | 
| Lang Hames | 9cebeb6 | 2015-02-17 05:53:28 +0000 | [diff] [blame] | 1246 | //         function once it is compiled. Initially, set the function | 
|  | 1247 | //         pointer for the indirection to point at the compile callback. | 
| Lang Hames | 9b4b92b | 2015-02-17 05:40:42 +0000 | [diff] [blame] | 1248 | std::string BodyPtrName = (F->getName() + "$address").str(); | 
|  | 1249 | GlobalVariable *FunctionBodyPointer = | 
|  | 1250 | createImplPointer(*F, BodyPtrName, CallbackInfo.getAddress()); | 
|  | 1251 | makeStub(*F, *FunctionBodyPointer); | 
|  | 1252 |  | 
| Lang Hames | 9cebeb6 | 2015-02-17 05:53:28 +0000 | [diff] [blame] | 1253 | // Step 4) Add the module containing the stub to the JIT. | 
| Lang Hames | 9b4b92b | 2015-02-17 05:40:42 +0000 | [diff] [blame] | 1254 | auto H = addModule(C.takeM()); | 
|  | 1255 |  | 
| Lang Hames | fb605d2 | 2015-02-18 23:16:09 +0000 | [diff] [blame^] | 1256 | // Step 5) Set the compile and update actions for the callback. | 
| Lang Hames | 9b4b92b | 2015-02-17 05:40:42 +0000 | [diff] [blame] | 1257 | // | 
| Lang Hames | fb605d2 | 2015-02-18 23:16:09 +0000 | [diff] [blame^] | 1258 | //   The compile action will IRGen the function and add it to the JIT, then | 
|  | 1259 | // request its address, which will trigger codegen. Since we don't need the | 
|  | 1260 | // AST after this, we pass ownership of the AST into the compile action: | 
|  | 1261 | // compile actions (and update actions) are deleted after they're run, so | 
|  | 1262 | // this will free the AST for us. | 
|  | 1263 | // | 
|  | 1264 | //   The update action will update FunctionBodyPointer to point at the newly | 
|  | 1265 | // compiled function. | 
|  | 1266 | CallbackInfo.setCompileAction( | 
|  | 1267 | [this,Fn = std::shared_ptr<FunctionAST>(std::move(FnAST))](){ | 
|  | 1268 | auto H = addModule(IRGen(Session, *Fn)); | 
|  | 1269 | return findSymbolIn(H, Fn->Proto->Name).getAddress(); | 
|  | 1270 | }); | 
| Lang Hames | 9b4b92b | 2015-02-17 05:40:42 +0000 | [diff] [blame] | 1271 | CallbackInfo.setUpdateAction( | 
| Lang Hames | 2448f48 | 2015-02-18 23:07:13 +0000 | [diff] [blame] | 1272 | CompileCallbacks.getLocalFPUpdater(H, Mangle(BodyPtrName))); | 
| Lang Hames | 9b4b92b | 2015-02-17 05:40:42 +0000 | [diff] [blame] | 1273 | } | 
|  | 1274 |  | 
|  | 1275 | private: | 
|  | 1276 |  | 
|  | 1277 | std::unique_ptr<TargetMachine> TM; | 
|  | 1278 | Mangler Mang; | 
|  | 1279 | SessionContext &Session; | 
|  | 1280 |  | 
|  | 1281 | ObjLayerT ObjectLayer; | 
|  | 1282 | CompileLayerT CompileLayer; | 
|  | 1283 | LazyEmitLayerT LazyEmitLayer; | 
|  | 1284 |  | 
|  | 1285 | JITCompileCallbackManager<LazyEmitLayerT, OrcX86_64> CompileCallbacks; | 
|  | 1286 | }; | 
|  | 1287 |  | 
|  | 1288 | static void HandleDefinition(SessionContext &S, KaleidoscopeJIT &J) { | 
|  | 1289 | if (auto F = ParseDefinition()) { | 
|  | 1290 | S.addPrototypeAST(llvm::make_unique<PrototypeAST>(*F->Proto)); | 
|  | 1291 | J.addFunctionDefinition(std::move(F)); | 
|  | 1292 | } else { | 
|  | 1293 | // Skip token for error recovery. | 
|  | 1294 | getNextToken(); | 
|  | 1295 | } | 
|  | 1296 | } | 
|  | 1297 |  | 
|  | 1298 | static void HandleExtern(SessionContext &S) { | 
|  | 1299 | if (auto P = ParseExtern()) | 
|  | 1300 | S.addPrototypeAST(std::move(P)); | 
|  | 1301 | else { | 
|  | 1302 | // Skip token for error recovery. | 
|  | 1303 | getNextToken(); | 
|  | 1304 | } | 
|  | 1305 | } | 
|  | 1306 |  | 
|  | 1307 | static void HandleTopLevelExpression(SessionContext &S, KaleidoscopeJIT &J) { | 
|  | 1308 | // Evaluate a top-level expression into an anonymous function. | 
|  | 1309 | if (auto F = ParseTopLevelExpr()) { | 
|  | 1310 | IRGenContext C(S); | 
|  | 1311 | if (auto ExprFunc = F->IRGen(C)) { | 
|  | 1312 | #ifndef MINIMAL_STDERR_OUTPUT | 
|  | 1313 | std::cerr << "Expression function:\n"; | 
|  | 1314 | ExprFunc->dump(); | 
|  | 1315 | #endif | 
|  | 1316 | // Add the CodeGen'd module to the JIT. Keep a handle to it: We can remove | 
|  | 1317 | // this module as soon as we've executed Function ExprFunc. | 
|  | 1318 | auto H = J.addModule(C.takeM()); | 
|  | 1319 |  | 
|  | 1320 | // Get the address of the JIT'd function in memory. | 
|  | 1321 | auto ExprSymbol = J.findSymbol("__anon_expr"); | 
|  | 1322 |  | 
|  | 1323 | // Cast it to the right type (takes no arguments, returns a double) so we | 
|  | 1324 | // can call it as a native function. | 
|  | 1325 | double (*FP)() = (double (*)())(intptr_t)ExprSymbol.getAddress(); | 
|  | 1326 | #ifdef MINIMAL_STDERR_OUTPUT | 
|  | 1327 | FP(); | 
|  | 1328 | #else | 
|  | 1329 | std::cerr << "Evaluated to " << FP() << "\n"; | 
|  | 1330 | #endif | 
|  | 1331 |  | 
|  | 1332 | // Remove the function. | 
|  | 1333 | J.removeModule(H); | 
|  | 1334 | } | 
|  | 1335 | } else { | 
|  | 1336 | // Skip token for error recovery. | 
|  | 1337 | getNextToken(); | 
|  | 1338 | } | 
|  | 1339 | } | 
|  | 1340 |  | 
|  | 1341 | /// top ::= definition | external | expression | ';' | 
|  | 1342 | static void MainLoop() { | 
|  | 1343 | SessionContext S(getGlobalContext()); | 
|  | 1344 | KaleidoscopeJIT J(S); | 
|  | 1345 |  | 
|  | 1346 | while (1) { | 
|  | 1347 | switch (CurTok) { | 
|  | 1348 | case tok_eof:    return; | 
|  | 1349 | case ';':        getNextToken(); continue;  // ignore top-level semicolons. | 
|  | 1350 | case tok_def:    HandleDefinition(S, J); break; | 
|  | 1351 | case tok_extern: HandleExtern(S); break; | 
|  | 1352 | default:         HandleTopLevelExpression(S, J); break; | 
|  | 1353 | } | 
|  | 1354 | #ifndef MINIMAL_STDERR_OUTPUT | 
|  | 1355 | std::cerr << "ready> "; | 
|  | 1356 | #endif | 
|  | 1357 | } | 
|  | 1358 | } | 
|  | 1359 |  | 
|  | 1360 | //===----------------------------------------------------------------------===// | 
|  | 1361 | // "Library" functions that can be "extern'd" from user code. | 
|  | 1362 | //===----------------------------------------------------------------------===// | 
|  | 1363 |  | 
|  | 1364 | /// putchard - putchar that takes a double and returns 0. | 
|  | 1365 | extern "C" | 
|  | 1366 | double putchard(double X) { | 
|  | 1367 | putchar((char)X); | 
|  | 1368 | return 0; | 
|  | 1369 | } | 
|  | 1370 |  | 
|  | 1371 | /// printd - printf that takes a double prints it as "%f\n", returning 0. | 
|  | 1372 | extern "C" | 
|  | 1373 | double printd(double X) { | 
|  | 1374 | printf("%f", X); | 
|  | 1375 | return 0; | 
|  | 1376 | } | 
|  | 1377 |  | 
|  | 1378 | extern "C" | 
|  | 1379 | double printlf() { | 
|  | 1380 | printf("\n"); | 
|  | 1381 | return 0; | 
|  | 1382 | } | 
|  | 1383 |  | 
|  | 1384 | //===----------------------------------------------------------------------===// | 
|  | 1385 | // Main driver code. | 
|  | 1386 | //===----------------------------------------------------------------------===// | 
|  | 1387 |  | 
|  | 1388 | int main() { | 
|  | 1389 | InitializeNativeTarget(); | 
|  | 1390 | InitializeNativeTargetAsmPrinter(); | 
|  | 1391 | InitializeNativeTargetAsmParser(); | 
|  | 1392 |  | 
|  | 1393 | // Install standard binary operators. | 
|  | 1394 | // 1 is lowest precedence. | 
|  | 1395 | BinopPrecedence['='] = 2; | 
|  | 1396 | BinopPrecedence['<'] = 10; | 
|  | 1397 | BinopPrecedence['+'] = 20; | 
|  | 1398 | BinopPrecedence['-'] = 20; | 
|  | 1399 | BinopPrecedence['/'] = 40; | 
|  | 1400 | BinopPrecedence['*'] = 40;  // highest. | 
|  | 1401 |  | 
|  | 1402 | // Prime the first token. | 
|  | 1403 | #ifndef MINIMAL_STDERR_OUTPUT | 
|  | 1404 | std::cerr << "ready> "; | 
|  | 1405 | #endif | 
|  | 1406 | getNextToken(); | 
|  | 1407 |  | 
|  | 1408 | std::cerr << std::fixed; | 
|  | 1409 |  | 
|  | 1410 | // Run the main "interpreter loop" now. | 
|  | 1411 | MainLoop(); | 
|  | 1412 |  | 
|  | 1413 | return 0; | 
|  | 1414 | } | 
|  | 1415 |  |