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