Home | History | Annotate | Line # | Download | only in Chapter9
      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/Host.h"
     11 #include "llvm/Support/TargetSelect.h"
     12 #include "llvm/Transforms/Scalar.h"
     13 #include <cctype>
     14 #include <cstdio>
     15 #include <map>
     16 #include <string>
     17 #include <vector>
     18 #include "../include/KaleidoscopeJIT.h"
     19 
     20 using namespace llvm;
     21 using namespace llvm::orc;
     22 
     23 //===----------------------------------------------------------------------===//
     24 // Lexer
     25 //===----------------------------------------------------------------------===//
     26 
     27 // The lexer returns tokens [0-255] if it is an unknown character, otherwise one
     28 // of these for known things.
     29 enum Token {
     30   tok_eof = -1,
     31 
     32   // commands
     33   tok_def = -2,
     34   tok_extern = -3,
     35 
     36   // primary
     37   tok_identifier = -4,
     38   tok_number = -5,
     39 
     40   // control
     41   tok_if = -6,
     42   tok_then = -7,
     43   tok_else = -8,
     44   tok_for = -9,
     45   tok_in = -10,
     46 
     47   // operators
     48   tok_binary = -11,
     49   tok_unary = -12,
     50 
     51   // var definition
     52   tok_var = -13
     53 };
     54 
     55 std::string getTokName(int Tok) {
     56   switch (Tok) {
     57   case tok_eof:
     58     return "eof";
     59   case tok_def:
     60     return "def";
     61   case tok_extern:
     62     return "extern";
     63   case tok_identifier:
     64     return "identifier";
     65   case tok_number:
     66     return "number";
     67   case tok_if:
     68     return "if";
     69   case tok_then:
     70     return "then";
     71   case tok_else:
     72     return "else";
     73   case tok_for:
     74     return "for";
     75   case tok_in:
     76     return "in";
     77   case tok_binary:
     78     return "binary";
     79   case tok_unary:
     80     return "unary";
     81   case tok_var:
     82     return "var";
     83   }
     84   return std::string(1, (char)Tok);
     85 }
     86 
     87 namespace {
     88 class PrototypeAST;
     89 class ExprAST;
     90 }
     91 
     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 // Code Generation Globals
    818 //===----------------------------------------------------------------------===//
    819 
    820 static std::unique_ptr<LLVMContext> TheContext;
    821 static std::unique_ptr<Module> TheModule;
    822 static std::unique_ptr<IRBuilder<>> Builder;
    823 static ExitOnError ExitOnErr;
    824 
    825 static std::map<std::string, AllocaInst *> NamedValues;
    826 static std::unique_ptr<KaleidoscopeJIT> TheJIT;
    827 static std::map<std::string, std::unique_ptr<PrototypeAST>> FunctionProtos;
    828 
    829 //===----------------------------------------------------------------------===//
    830 // Debug Info Support
    831 //===----------------------------------------------------------------------===//
    832 
    833 static std::unique_ptr<DIBuilder> DBuilder;
    834 
    835 DIType *DebugInfo::getDoubleTy() {
    836   if (DblTy)
    837     return DblTy;
    838 
    839   DblTy = DBuilder->createBasicType("double", 64, dwarf::DW_ATE_float);
    840   return DblTy;
    841 }
    842 
    843 void DebugInfo::emitLocation(ExprAST *AST) {
    844   if (!AST)
    845     return Builder->SetCurrentDebugLocation(DebugLoc());
    846   DIScope *Scope;
    847   if (LexicalBlocks.empty())
    848     Scope = TheCU;
    849   else
    850     Scope = LexicalBlocks.back();
    851   Builder->SetCurrentDebugLocation(DILocation::get(
    852       Scope->getContext(), AST->getLine(), AST->getCol(), Scope));
    853 }
    854 
    855 static DISubroutineType *CreateFunctionType(unsigned NumArgs, DIFile *Unit) {
    856   SmallVector<Metadata *, 8> EltTys;
    857   DIType *DblTy = KSDbgInfo.getDoubleTy();
    858 
    859   // Add the result type.
    860   EltTys.push_back(DblTy);
    861 
    862   for (unsigned i = 0, e = NumArgs; i != e; ++i)
    863     EltTys.push_back(DblTy);
    864 
    865   return DBuilder->createSubroutineType(DBuilder->getOrCreateTypeArray(EltTys));
    866 }
    867 
    868 //===----------------------------------------------------------------------===//
    869 // Code Generation
    870 //===----------------------------------------------------------------------===//
    871 
    872 Value *LogErrorV(const char *Str) {
    873   LogError(Str);
    874   return nullptr;
    875 }
    876 
    877 Function *getFunction(std::string Name) {
    878   // First, see if the function has already been added to the current module.
    879   if (auto *F = TheModule->getFunction(Name))
    880     return F;
    881 
    882   // If not, check whether we can codegen the declaration from some existing
    883   // prototype.
    884   auto FI = FunctionProtos.find(Name);
    885   if (FI != FunctionProtos.end())
    886     return FI->second->codegen();
    887 
    888   // If no existing prototype exists, return null.
    889   return nullptr;
    890 }
    891 
    892 /// CreateEntryBlockAlloca - Create an alloca instruction in the entry block of
    893 /// the function.  This is used for mutable variables etc.
    894 static AllocaInst *CreateEntryBlockAlloca(Function *TheFunction,
    895                                           StringRef VarName) {
    896   IRBuilder<> TmpB(&TheFunction->getEntryBlock(),
    897                    TheFunction->getEntryBlock().begin());
    898   return TmpB.CreateAlloca(Type::getDoubleTy(*TheContext), nullptr, VarName);
    899 }
    900 
    901 Value *NumberExprAST::codegen() {
    902   KSDbgInfo.emitLocation(this);
    903   return ConstantFP::get(*TheContext, APFloat(Val));
    904 }
    905 
    906 Value *VariableExprAST::codegen() {
    907   // Look this variable up in the function.
    908   Value *V = NamedValues[Name];
    909   if (!V)
    910     return LogErrorV("Unknown variable name");
    911 
    912   KSDbgInfo.emitLocation(this);
    913   // Load the value.
    914   return Builder->CreateLoad(Type::getDoubleTy(*TheContext), V, Name.c_str());
    915 }
    916 
    917 Value *UnaryExprAST::codegen() {
    918   Value *OperandV = Operand->codegen();
    919   if (!OperandV)
    920     return nullptr;
    921 
    922   Function *F = getFunction(std::string("unary") + Opcode);
    923   if (!F)
    924     return LogErrorV("Unknown unary operator");
    925 
    926   KSDbgInfo.emitLocation(this);
    927   return Builder->CreateCall(F, OperandV, "unop");
    928 }
    929 
    930 Value *BinaryExprAST::codegen() {
    931   KSDbgInfo.emitLocation(this);
    932 
    933   // Special case '=' because we don't want to emit the LHS as an expression.
    934   if (Op == '=') {
    935     // Assignment requires the LHS to be an identifier.
    936     // This assume we're building without RTTI because LLVM builds that way by
    937     // default.  If you build LLVM with RTTI this can be changed to a
    938     // dynamic_cast for automatic error checking.
    939     VariableExprAST *LHSE = static_cast<VariableExprAST *>(LHS.get());
    940     if (!LHSE)
    941       return LogErrorV("destination of '=' must be a variable");
    942     // Codegen the RHS.
    943     Value *Val = RHS->codegen();
    944     if (!Val)
    945       return nullptr;
    946 
    947     // Look up the name.
    948     Value *Variable = NamedValues[LHSE->getName()];
    949     if (!Variable)
    950       return LogErrorV("Unknown variable name");
    951 
    952     Builder->CreateStore(Val, Variable);
    953     return Val;
    954   }
    955 
    956   Value *L = LHS->codegen();
    957   Value *R = RHS->codegen();
    958   if (!L || !R)
    959     return nullptr;
    960 
    961   switch (Op) {
    962   case '+':
    963     return Builder->CreateFAdd(L, R, "addtmp");
    964   case '-':
    965     return Builder->CreateFSub(L, R, "subtmp");
    966   case '*':
    967     return Builder->CreateFMul(L, R, "multmp");
    968   case '<':
    969     L = Builder->CreateFCmpULT(L, R, "cmptmp");
    970     // Convert bool 0/1 to double 0.0 or 1.0
    971     return Builder->CreateUIToFP(L, Type::getDoubleTy(*TheContext), "booltmp");
    972   default:
    973     break;
    974   }
    975 
    976   // If it wasn't a builtin binary operator, it must be a user defined one. Emit
    977   // a call to it.
    978   Function *F = getFunction(std::string("binary") + Op);
    979   assert(F && "binary operator not found!");
    980 
    981   Value *Ops[] = {L, R};
    982   return Builder->CreateCall(F, Ops, "binop");
    983 }
    984 
    985 Value *CallExprAST::codegen() {
    986   KSDbgInfo.emitLocation(this);
    987 
    988   // Look up the name in the global module table.
    989   Function *CalleeF = getFunction(Callee);
    990   if (!CalleeF)
    991     return LogErrorV("Unknown function referenced");
    992 
    993   // If argument mismatch error.
    994   if (CalleeF->arg_size() != Args.size())
    995     return LogErrorV("Incorrect # arguments passed");
    996 
    997   std::vector<Value *> ArgsV;
    998   for (unsigned i = 0, e = Args.size(); i != e; ++i) {
    999     ArgsV.push_back(Args[i]->codegen());
   1000     if (!ArgsV.back())
   1001       return nullptr;
   1002   }
   1003 
   1004   return Builder->CreateCall(CalleeF, ArgsV, "calltmp");
   1005 }
   1006 
   1007 Value *IfExprAST::codegen() {
   1008   KSDbgInfo.emitLocation(this);
   1009 
   1010   Value *CondV = Cond->codegen();
   1011   if (!CondV)
   1012     return nullptr;
   1013 
   1014   // Convert condition to a bool by comparing non-equal to 0.0.
   1015   CondV = Builder->CreateFCmpONE(
   1016       CondV, ConstantFP::get(*TheContext, APFloat(0.0)), "ifcond");
   1017 
   1018   Function *TheFunction = Builder->GetInsertBlock()->getParent();
   1019 
   1020   // Create blocks for the then and else cases.  Insert the 'then' block at the
   1021   // end of the function.
   1022   BasicBlock *ThenBB = BasicBlock::Create(*TheContext, "then", TheFunction);
   1023   BasicBlock *ElseBB = BasicBlock::Create(*TheContext, "else");
   1024   BasicBlock *MergeBB = BasicBlock::Create(*TheContext, "ifcont");
   1025 
   1026   Builder->CreateCondBr(CondV, ThenBB, ElseBB);
   1027 
   1028   // Emit then value.
   1029   Builder->SetInsertPoint(ThenBB);
   1030 
   1031   Value *ThenV = Then->codegen();
   1032   if (!ThenV)
   1033     return nullptr;
   1034 
   1035   Builder->CreateBr(MergeBB);
   1036   // Codegen of 'Then' can change the current block, update ThenBB for the PHI.
   1037   ThenBB = Builder->GetInsertBlock();
   1038 
   1039   // Emit else block.
   1040   TheFunction->getBasicBlockList().push_back(ElseBB);
   1041   Builder->SetInsertPoint(ElseBB);
   1042 
   1043   Value *ElseV = Else->codegen();
   1044   if (!ElseV)
   1045     return nullptr;
   1046 
   1047   Builder->CreateBr(MergeBB);
   1048   // Codegen of 'Else' can change the current block, update ElseBB for the PHI.
   1049   ElseBB = Builder->GetInsertBlock();
   1050 
   1051   // Emit merge block.
   1052   TheFunction->getBasicBlockList().push_back(MergeBB);
   1053   Builder->SetInsertPoint(MergeBB);
   1054   PHINode *PN = Builder->CreatePHI(Type::getDoubleTy(*TheContext), 2, "iftmp");
   1055 
   1056   PN->addIncoming(ThenV, ThenBB);
   1057   PN->addIncoming(ElseV, ElseBB);
   1058   return PN;
   1059 }
   1060 
   1061 // Output for-loop as:
   1062 //   var = alloca double
   1063 //   ...
   1064 //   start = startexpr
   1065 //   store start -> var
   1066 //   goto loop
   1067 // loop:
   1068 //   ...
   1069 //   bodyexpr
   1070 //   ...
   1071 // loopend:
   1072 //   step = stepexpr
   1073 //   endcond = endexpr
   1074 //
   1075 //   curvar = load var
   1076 //   nextvar = curvar + step
   1077 //   store nextvar -> var
   1078 //   br endcond, loop, endloop
   1079 // outloop:
   1080 Value *ForExprAST::codegen() {
   1081   Function *TheFunction = Builder->GetInsertBlock()->getParent();
   1082 
   1083   // Create an alloca for the variable in the entry block.
   1084   AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, VarName);
   1085 
   1086   KSDbgInfo.emitLocation(this);
   1087 
   1088   // Emit the start code first, without 'variable' in scope.
   1089   Value *StartVal = Start->codegen();
   1090   if (!StartVal)
   1091     return nullptr;
   1092 
   1093   // Store the value into the alloca.
   1094   Builder->CreateStore(StartVal, Alloca);
   1095 
   1096   // Make the new basic block for the loop header, inserting after current
   1097   // block.
   1098   BasicBlock *LoopBB = BasicBlock::Create(*TheContext, "loop", TheFunction);
   1099 
   1100   // Insert an explicit fall through from the current block to the LoopBB.
   1101   Builder->CreateBr(LoopBB);
   1102 
   1103   // Start insertion in LoopBB.
   1104   Builder->SetInsertPoint(LoopBB);
   1105 
   1106   // Within the loop, the variable is defined equal to the PHI node.  If it
   1107   // shadows an existing variable, we have to restore it, so save it now.
   1108   AllocaInst *OldVal = NamedValues[VarName];
   1109   NamedValues[VarName] = Alloca;
   1110 
   1111   // Emit the body of the loop.  This, like any other expr, can change the
   1112   // current BB.  Note that we ignore the value computed by the body, but don't
   1113   // allow an error.
   1114   if (!Body->codegen())
   1115     return nullptr;
   1116 
   1117   // Emit the step value.
   1118   Value *StepVal = nullptr;
   1119   if (Step) {
   1120     StepVal = Step->codegen();
   1121     if (!StepVal)
   1122       return nullptr;
   1123   } else {
   1124     // If not specified, use 1.0.
   1125     StepVal = ConstantFP::get(*TheContext, APFloat(1.0));
   1126   }
   1127 
   1128   // Compute the end condition.
   1129   Value *EndCond = End->codegen();
   1130   if (!EndCond)
   1131     return nullptr;
   1132 
   1133   // Reload, increment, and restore the alloca.  This handles the case where
   1134   // the body of the loop mutates the variable.
   1135   Value *CurVar = Builder->CreateLoad(Type::getDoubleTy(*TheContext), Alloca,
   1136                                       VarName.c_str());
   1137   Value *NextVar = Builder->CreateFAdd(CurVar, StepVal, "nextvar");
   1138   Builder->CreateStore(NextVar, Alloca);
   1139 
   1140   // Convert condition to a bool by comparing non-equal to 0.0.
   1141   EndCond = Builder->CreateFCmpONE(
   1142       EndCond, ConstantFP::get(*TheContext, APFloat(0.0)), "loopcond");
   1143 
   1144   // Create the "after loop" block and insert it.
   1145   BasicBlock *AfterBB =
   1146       BasicBlock::Create(*TheContext, "afterloop", TheFunction);
   1147 
   1148   // Insert the conditional branch into the end of LoopEndBB.
   1149   Builder->CreateCondBr(EndCond, LoopBB, AfterBB);
   1150 
   1151   // Any new code will be inserted in AfterBB.
   1152   Builder->SetInsertPoint(AfterBB);
   1153 
   1154   // Restore the unshadowed variable.
   1155   if (OldVal)
   1156     NamedValues[VarName] = OldVal;
   1157   else
   1158     NamedValues.erase(VarName);
   1159 
   1160   // for expr always returns 0.0.
   1161   return Constant::getNullValue(Type::getDoubleTy(*TheContext));
   1162 }
   1163 
   1164 Value *VarExprAST::codegen() {
   1165   std::vector<AllocaInst *> OldBindings;
   1166 
   1167   Function *TheFunction = Builder->GetInsertBlock()->getParent();
   1168 
   1169   // Register all variables and emit their initializer.
   1170   for (unsigned i = 0, e = VarNames.size(); i != e; ++i) {
   1171     const std::string &VarName = VarNames[i].first;
   1172     ExprAST *Init = VarNames[i].second.get();
   1173 
   1174     // Emit the initializer before adding the variable to scope, this prevents
   1175     // the initializer from referencing the variable itself, and permits stuff
   1176     // like this:
   1177     //  var a = 1 in
   1178     //    var a = a in ...   # refers to outer 'a'.
   1179     Value *InitVal;
   1180     if (Init) {
   1181       InitVal = Init->codegen();
   1182       if (!InitVal)
   1183         return nullptr;
   1184     } else { // If not specified, use 0.0.
   1185       InitVal = ConstantFP::get(*TheContext, APFloat(0.0));
   1186     }
   1187 
   1188     AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, VarName);
   1189     Builder->CreateStore(InitVal, Alloca);
   1190 
   1191     // Remember the old variable binding so that we can restore the binding when
   1192     // we unrecurse.
   1193     OldBindings.push_back(NamedValues[VarName]);
   1194 
   1195     // Remember this binding.
   1196     NamedValues[VarName] = Alloca;
   1197   }
   1198 
   1199   KSDbgInfo.emitLocation(this);
   1200 
   1201   // Codegen the body, now that all vars are in scope.
   1202   Value *BodyVal = Body->codegen();
   1203   if (!BodyVal)
   1204     return nullptr;
   1205 
   1206   // Pop all our variables from scope.
   1207   for (unsigned i = 0, e = VarNames.size(); i != e; ++i)
   1208     NamedValues[VarNames[i].first] = OldBindings[i];
   1209 
   1210   // Return the body computation.
   1211   return BodyVal;
   1212 }
   1213 
   1214 Function *PrototypeAST::codegen() {
   1215   // Make the function type:  double(double,double) etc.
   1216   std::vector<Type *> Doubles(Args.size(), Type::getDoubleTy(*TheContext));
   1217   FunctionType *FT =
   1218       FunctionType::get(Type::getDoubleTy(*TheContext), Doubles, false);
   1219 
   1220   Function *F =
   1221       Function::Create(FT, Function::ExternalLinkage, Name, TheModule.get());
   1222 
   1223   // Set names for all arguments.
   1224   unsigned Idx = 0;
   1225   for (auto &Arg : F->args())
   1226     Arg.setName(Args[Idx++]);
   1227 
   1228   return F;
   1229 }
   1230 
   1231 Function *FunctionAST::codegen() {
   1232   // Transfer ownership of the prototype to the FunctionProtos map, but keep a
   1233   // reference to it for use below.
   1234   auto &P = *Proto;
   1235   FunctionProtos[Proto->getName()] = std::move(Proto);
   1236   Function *TheFunction = getFunction(P.getName());
   1237   if (!TheFunction)
   1238     return nullptr;
   1239 
   1240   // If this is an operator, install it.
   1241   if (P.isBinaryOp())
   1242     BinopPrecedence[P.getOperatorName()] = P.getBinaryPrecedence();
   1243 
   1244   // Create a new basic block to start insertion into.
   1245   BasicBlock *BB = BasicBlock::Create(*TheContext, "entry", TheFunction);
   1246   Builder->SetInsertPoint(BB);
   1247 
   1248   // Create a subprogram DIE for this function.
   1249   DIFile *Unit = DBuilder->createFile(KSDbgInfo.TheCU->getFilename(),
   1250                                       KSDbgInfo.TheCU->getDirectory());
   1251   DIScope *FContext = Unit;
   1252   unsigned LineNo = P.getLine();
   1253   unsigned ScopeLine = LineNo;
   1254   DISubprogram *SP = DBuilder->createFunction(
   1255       FContext, P.getName(), StringRef(), Unit, LineNo,
   1256       CreateFunctionType(TheFunction->arg_size(), Unit), ScopeLine,
   1257       DINode::FlagPrototyped, DISubprogram::SPFlagDefinition);
   1258   TheFunction->setSubprogram(SP);
   1259 
   1260   // Push the current scope.
   1261   KSDbgInfo.LexicalBlocks.push_back(SP);
   1262 
   1263   // Unset the location for the prologue emission (leading instructions with no
   1264   // location in a function are considered part of the prologue and the debugger
   1265   // will run past them when breaking on a function)
   1266   KSDbgInfo.emitLocation(nullptr);
   1267 
   1268   // Record the function arguments in the NamedValues map.
   1269   NamedValues.clear();
   1270   unsigned ArgIdx = 0;
   1271   for (auto &Arg : TheFunction->args()) {
   1272     // Create an alloca for this variable.
   1273     AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, Arg.getName());
   1274 
   1275     // Create a debug descriptor for the variable.
   1276     DILocalVariable *D = DBuilder->createParameterVariable(
   1277         SP, Arg.getName(), ++ArgIdx, Unit, LineNo, KSDbgInfo.getDoubleTy(),
   1278         true);
   1279 
   1280     DBuilder->insertDeclare(Alloca, D, DBuilder->createExpression(),
   1281                             DILocation::get(SP->getContext(), LineNo, 0, SP),
   1282                             Builder->GetInsertBlock());
   1283 
   1284     // Store the initial value into the alloca.
   1285     Builder->CreateStore(&Arg, Alloca);
   1286 
   1287     // Add arguments to variable symbol table.
   1288     NamedValues[std::string(Arg.getName())] = Alloca;
   1289   }
   1290 
   1291   KSDbgInfo.emitLocation(Body.get());
   1292 
   1293   if (Value *RetVal = Body->codegen()) {
   1294     // Finish off the function.
   1295     Builder->CreateRet(RetVal);
   1296 
   1297     // Pop off the lexical block for the function.
   1298     KSDbgInfo.LexicalBlocks.pop_back();
   1299 
   1300     // Validate the generated code, checking for consistency.
   1301     verifyFunction(*TheFunction);
   1302 
   1303     return TheFunction;
   1304   }
   1305 
   1306   // Error reading body, remove function.
   1307   TheFunction->eraseFromParent();
   1308 
   1309   if (P.isBinaryOp())
   1310     BinopPrecedence.erase(Proto->getOperatorName());
   1311 
   1312   // Pop off the lexical block for the function since we added it
   1313   // unconditionally.
   1314   KSDbgInfo.LexicalBlocks.pop_back();
   1315 
   1316   return nullptr;
   1317 }
   1318 
   1319 //===----------------------------------------------------------------------===//
   1320 // Top-Level parsing and JIT Driver
   1321 //===----------------------------------------------------------------------===//
   1322 
   1323 static void InitializeModule() {
   1324   // Open a new module.
   1325   TheContext = std::make_unique<LLVMContext>();
   1326   TheModule = std::make_unique<Module>("my cool jit", *TheContext);
   1327   TheModule->setDataLayout(TheJIT->getDataLayout());
   1328 
   1329   Builder = std::make_unique<IRBuilder<>>(*TheContext);
   1330 }
   1331 
   1332 static void HandleDefinition() {
   1333   if (auto FnAST = ParseDefinition()) {
   1334     if (!FnAST->codegen())
   1335       fprintf(stderr, "Error reading function definition:");
   1336   } else {
   1337     // Skip token for error recovery.
   1338     getNextToken();
   1339   }
   1340 }
   1341 
   1342 static void HandleExtern() {
   1343   if (auto ProtoAST = ParseExtern()) {
   1344     if (!ProtoAST->codegen())
   1345       fprintf(stderr, "Error reading extern");
   1346     else
   1347       FunctionProtos[ProtoAST->getName()] = std::move(ProtoAST);
   1348   } else {
   1349     // Skip token for error recovery.
   1350     getNextToken();
   1351   }
   1352 }
   1353 
   1354 static void HandleTopLevelExpression() {
   1355   // Evaluate a top-level expression into an anonymous function.
   1356   if (auto FnAST = ParseTopLevelExpr()) {
   1357     if (!FnAST->codegen()) {
   1358       fprintf(stderr, "Error generating code for top level expr");
   1359     }
   1360   } else {
   1361     // Skip token for error recovery.
   1362     getNextToken();
   1363   }
   1364 }
   1365 
   1366 /// top ::= definition | external | expression | ';'
   1367 static void MainLoop() {
   1368   while (1) {
   1369     switch (CurTok) {
   1370     case tok_eof:
   1371       return;
   1372     case ';': // ignore top-level semicolons.
   1373       getNextToken();
   1374       break;
   1375     case tok_def:
   1376       HandleDefinition();
   1377       break;
   1378     case tok_extern:
   1379       HandleExtern();
   1380       break;
   1381     default:
   1382       HandleTopLevelExpression();
   1383       break;
   1384     }
   1385   }
   1386 }
   1387 
   1388 //===----------------------------------------------------------------------===//
   1389 // "Library" functions that can be "extern'd" from user code.
   1390 //===----------------------------------------------------------------------===//
   1391 
   1392 #ifdef _WIN32
   1393 #define DLLEXPORT __declspec(dllexport)
   1394 #else
   1395 #define DLLEXPORT
   1396 #endif
   1397 
   1398 /// putchard - putchar that takes a double and returns 0.
   1399 extern "C" DLLEXPORT double putchard(double X) {
   1400   fputc((char)X, stderr);
   1401   return 0;
   1402 }
   1403 
   1404 /// printd - printf that takes a double prints it as "%f\n", returning 0.
   1405 extern "C" DLLEXPORT double printd(double X) {
   1406   fprintf(stderr, "%f\n", X);
   1407   return 0;
   1408 }
   1409 
   1410 //===----------------------------------------------------------------------===//
   1411 // Main driver code.
   1412 //===----------------------------------------------------------------------===//
   1413 
   1414 int main() {
   1415   InitializeNativeTarget();
   1416   InitializeNativeTargetAsmPrinter();
   1417   InitializeNativeTargetAsmParser();
   1418 
   1419   // Install standard binary operators.
   1420   // 1 is lowest precedence.
   1421   BinopPrecedence['='] = 2;
   1422   BinopPrecedence['<'] = 10;
   1423   BinopPrecedence['+'] = 20;
   1424   BinopPrecedence['-'] = 20;
   1425   BinopPrecedence['*'] = 40; // highest.
   1426 
   1427   // Prime the first token.
   1428   getNextToken();
   1429 
   1430   TheJIT = ExitOnErr(KaleidoscopeJIT::Create());
   1431 
   1432   InitializeModule();
   1433 
   1434   // Add the current debug info version into the module.
   1435   TheModule->addModuleFlag(Module::Warning, "Debug Info Version",
   1436                            DEBUG_METADATA_VERSION);
   1437 
   1438   // Darwin only supports dwarf2.
   1439   if (Triple(sys::getProcessTriple()).isOSDarwin())
   1440     TheModule->addModuleFlag(llvm::Module::Warning, "Dwarf Version", 2);
   1441 
   1442   // Construct the DIBuilder, we do this here because we need the module.
   1443   DBuilder = std::make_unique<DIBuilder>(*TheModule);
   1444 
   1445   // Create the compile unit for the module.
   1446   // Currently down as "fib.ks" as a filename since we're redirecting stdin
   1447   // but we'd like actual source locations.
   1448   KSDbgInfo.TheCU = DBuilder->createCompileUnit(
   1449       dwarf::DW_LANG_C, DBuilder->createFile("fib.ks", "."),
   1450       "Kaleidoscope Compiler", 0, "", 0);
   1451 
   1452   // Run the main "interpreter loop" now.
   1453   MainLoop();
   1454 
   1455   // Finalize the debug info.
   1456   DBuilder->finalize();
   1457 
   1458   // Print out all of the generated code.
   1459   TheModule->print(errs(), nullptr);
   1460 
   1461   return 0;
   1462 }
   1463