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 
getTokName(int Tok)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 
advance()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.
gettok()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 
indent(raw_ostream & O,int size)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:
ExprAST(SourceLocation Loc=CurLoc)205   ExprAST(SourceLocation Loc = CurLoc) : Loc(Loc) {}
~ExprAST()206   virtual ~ExprAST() {}
207   virtual Value *codegen() = 0;
getLine() const208   int getLine() const { return Loc.Line; }
getCol() const209   int getCol() const { return Loc.Col; }
dump(raw_ostream & out,int ind)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:
NumberExprAST(double Val)220   NumberExprAST(double Val) : Val(Val) {}
dump(raw_ostream & out,int ind)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:
VariableExprAST(SourceLocation Loc,const std::string & Name)232   VariableExprAST(SourceLocation Loc, const std::string &Name)
233       : ExprAST(Loc), Name(Name) {}
getName() const234   const std::string &getName() const { return Name; }
235   Value *codegen() override;
dump(raw_ostream & out,int ind)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:
UnaryExprAST(char Opcode,std::unique_ptr<ExprAST> Operand)247   UnaryExprAST(char Opcode, std::unique_ptr<ExprAST> Operand)
248       : Opcode(Opcode), Operand(std::move(Operand)) {}
249   Value *codegen() override;
dump(raw_ostream & out,int ind)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:
BinaryExprAST(SourceLocation Loc,char Op,std::unique_ptr<ExprAST> LHS,std::unique_ptr<ExprAST> RHS)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;
dump(raw_ostream & out,int ind)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:
CallExprAST(SourceLocation Loc,const std::string & Callee,std::vector<std::unique_ptr<ExprAST>> Args)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;
dump(raw_ostream & out,int ind)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:
IfExprAST(SourceLocation Loc,std::unique_ptr<ExprAST> Cond,std::unique_ptr<ExprAST> Then,std::unique_ptr<ExprAST> Else)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;
dump(raw_ostream & out,int ind)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:
ForExprAST(const std::string & VarName,std::unique_ptr<ExprAST> Start,std::unique_ptr<ExprAST> End,std::unique_ptr<ExprAST> Step,std::unique_ptr<ExprAST> Body)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;
dump(raw_ostream & out,int ind)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:
VarExprAST(std::vector<std::pair<std::string,std::unique_ptr<ExprAST>>> VarNames,std::unique_ptr<ExprAST> Body)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;
dump(raw_ostream & out,int ind)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:
PrototypeAST(SourceLocation Loc,const std::string & Name,std::vector<std::string> Args,bool IsOperator=false,unsigned Prec=0)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();
getName() const371   const std::string &getName() const { return Name; }
372 
isUnaryOp() const373   bool isUnaryOp() const { return IsOperator && Args.size() == 1; }
isBinaryOp() const374   bool isBinaryOp() const { return IsOperator && Args.size() == 2; }
375 
getOperatorName() const376   char getOperatorName() const {
377     assert(isUnaryOp() || isBinaryOp());
378     return Name[Name.size() - 1];
379   }
380 
getBinaryPrecedence() const381   unsigned getBinaryPrecedence() const { return Precedence; }
getLine() const382   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:
FunctionAST(std::unique_ptr<PrototypeAST> Proto,std::unique_ptr<ExprAST> Body)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();
dump(raw_ostream & out,int ind)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;
getNextToken()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.
GetTokPrecedence()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.
LogError(const char * Str)431 std::unique_ptr<ExprAST> LogError(const char *Str) {
432   fprintf(stderr, "Error: %s\n", Str);
433   return nullptr;
434 }
435 
LogErrorP(const char * Str)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
ParseNumberExpr()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 ')'
ParseParenExpr()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* ')'
ParseIdentifierExpr()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
ParseIfExpr()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
ParseForExpr()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
ParseVarExpr()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
ParsePrimary()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
ParseUnary()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)*
ParseBinOpRHS(int ExprPrec,std::unique_ptr<ExprAST> LHS)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 ///
ParseExpression()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)
ParsePrototype()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
ParseDefinition()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
ParseTopLevelExpr()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
ParseExtern()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 
getDoubleTy()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 
emitLocation(ExprAST * AST)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 
CreateFunctionType(unsigned NumArgs,DIFile * Unit)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 
LogErrorV(const char * Str)864 Value *LogErrorV(const char *Str) {
865   LogError(Str);
866   return nullptr;
867 }
868 
getFunction(std::string Name)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.
CreateEntryBlockAlloca(Function * TheFunction,const std::string & VarName)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 
codegen()894 Value *NumberExprAST::codegen() {
895   KSDbgInfo.emitLocation(this);
896   return ConstantFP::get(TheContext, APFloat(Val));
897 }
898 
codegen()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 
codegen()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 
codegen()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 
codegen()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 
codegen()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:
codegen()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 
codegen()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 
codegen()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 
codegen()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 
InitializeModule()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 
HandleDefinition()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 
HandleExtern()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 
HandleTopLevelExpression()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 | ';'
MainLoop()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.
putchard(double X)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.
printd(double X)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 
main()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