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