blob: a080bd00cb5806e6e6bafb0ea4d1161052408bbe [file] [log] [blame]
Eugene Zelenkof981ec42016-05-19 01:08:04 +00001#include "llvm/ADT/APFloat.h"
NAKAMURA Takumi85c9bac2015-03-02 01:04:34 +00002#include "llvm/ADT/STLExtras.h"
Eugene Zelenkof981ec42016-05-19 01:08:04 +00003#include "llvm/IR/BasicBlock.h"
4#include "llvm/IR/Constants.h"
5#include "llvm/IR/DerivedTypes.h"
6#include "llvm/IR/Function.h"
7#include "llvm/IR/Instructions.h"
Chandler Carruth005f27a2013-01-02 11:56:33 +00008#include "llvm/IR/IRBuilder.h"
9#include "llvm/IR/LLVMContext.h"
Chandler Carruth30d69c22015-02-13 10:01:29 +000010#include "llvm/IR/LegacyPassManager.h"
Chandler Carruth005f27a2013-01-02 11:56:33 +000011#include "llvm/IR/Module.h"
Eugene Zelenkof981ec42016-05-19 01:08:04 +000012#include "llvm/IR/Type.h"
Chandler Carruth20d4e6b2014-01-13 09:58:03 +000013#include "llvm/IR/Verifier.h"
Evan Cheng2bb40352011-08-24 18:08:43 +000014#include "llvm/Support/TargetSelect.h"
Eugene Zelenkof981ec42016-05-19 01:08:04 +000015#include "llvm/Target/TargetMachine.h"
Chandler Carruth605e30e2012-12-04 10:16:57 +000016#include "llvm/Transforms/Scalar.h"
Chandler Carruthec5872b2016-03-11 12:10:15 +000017#include "llvm/Transforms/Scalar/GVN.h"
Eugene Zelenkof981ec42016-05-19 01:08:04 +000018#include "../include/KaleidoscopeJIT.h"
19#include <cassert>
Will Dietz981af002013-10-12 00:55:57 +000020#include <cctype>
Eugene Zelenkof981ec42016-05-19 01:08:04 +000021#include <cstdint>
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000022#include <cstdio>
Eugene Zelenkof981ec42016-05-19 01:08:04 +000023#include <cstdlib>
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000024#include <map>
Eugene Zelenkof981ec42016-05-19 01:08:04 +000025#include <memory>
Chandler Carruth605e30e2012-12-04 10:16:57 +000026#include <string>
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000027#include <vector>
Lang Hames2d789c32015-08-26 03:07:41 +000028
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000029using namespace llvm;
Lang Hames2d789c32015-08-26 03:07:41 +000030using namespace llvm::orc;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000031
32//===----------------------------------------------------------------------===//
33// Lexer
34//===----------------------------------------------------------------------===//
35
36// The lexer returns tokens [0-255] if it is an unknown character, otherwise one
37// of these for known things.
38enum Token {
39 tok_eof = -1,
40
41 // commands
Eric Christopherc0239362014-12-08 18:12:28 +000042 tok_def = -2,
43 tok_extern = -3,
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000044
45 // primary
Eric Christopherc0239362014-12-08 18:12:28 +000046 tok_identifier = -4,
47 tok_number = -5,
48
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000049 // control
Eric Christopherc0239362014-12-08 18:12:28 +000050 tok_if = -6,
51 tok_then = -7,
52 tok_else = -8,
53 tok_for = -9,
54 tok_in = -10
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000055};
56
Eric Christopherc0239362014-12-08 18:12:28 +000057static std::string IdentifierStr; // Filled in if tok_identifier
58static double NumVal; // Filled in if tok_number
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000059
60/// gettok - Return the next token from standard input.
61static int gettok() {
62 static int LastChar = ' ';
63
64 // Skip any whitespace.
65 while (isspace(LastChar))
66 LastChar = getchar();
67
68 if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
69 IdentifierStr = LastChar;
70 while (isalnum((LastChar = getchar())))
71 IdentifierStr += LastChar;
72
Eric Christopherc0239362014-12-08 18:12:28 +000073 if (IdentifierStr == "def")
74 return tok_def;
75 if (IdentifierStr == "extern")
76 return tok_extern;
77 if (IdentifierStr == "if")
78 return tok_if;
79 if (IdentifierStr == "then")
80 return tok_then;
81 if (IdentifierStr == "else")
82 return tok_else;
83 if (IdentifierStr == "for")
84 return tok_for;
85 if (IdentifierStr == "in")
86 return tok_in;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000087 return tok_identifier;
88 }
89
Eric Christopherc0239362014-12-08 18:12:28 +000090 if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000091 std::string NumStr;
92 do {
93 NumStr += LastChar;
94 LastChar = getchar();
95 } while (isdigit(LastChar) || LastChar == '.');
96
Hans Wennborgcc9deb42015-09-29 18:02:48 +000097 NumVal = strtod(NumStr.c_str(), nullptr);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000098 return tok_number;
99 }
100
101 if (LastChar == '#') {
102 // Comment until end of line.
Eric Christopherc0239362014-12-08 18:12:28 +0000103 do
104 LastChar = getchar();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000105 while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
Eric Christopherc0239362014-12-08 18:12:28 +0000106
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000107 if (LastChar != EOF)
108 return gettok();
109 }
Eric Christopherc0239362014-12-08 18:12:28 +0000110
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000111 // Check for end of file. Don't eat the EOF.
112 if (LastChar == EOF)
113 return tok_eof;
114
115 // Otherwise, just return the character as its ascii value.
116 int ThisChar = LastChar;
117 LastChar = getchar();
118 return ThisChar;
119}
120
121//===----------------------------------------------------------------------===//
122// Abstract Syntax Tree (aka Parse Tree)
123//===----------------------------------------------------------------------===//
Juergen Ributzka05c5a932013-11-19 03:08:35 +0000124namespace {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000125/// ExprAST - Base class for all expression nodes.
126class ExprAST {
127public:
Juergen Ributzka05c5a932013-11-19 03:08:35 +0000128 virtual ~ExprAST() {}
Lang Hames2d789c32015-08-26 03:07:41 +0000129 virtual Value *codegen() = 0;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000130};
131
132/// NumberExprAST - Expression class for numeric literals like "1.0".
133class NumberExprAST : public ExprAST {
134 double Val;
Lang Hames59b0da82015-08-19 18:15:58 +0000135
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000136public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000137 NumberExprAST(double Val) : Val(Val) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000138 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000139};
140
141/// VariableExprAST - Expression class for referencing a variable, like "a".
142class VariableExprAST : public ExprAST {
143 std::string Name;
Lang Hames59b0da82015-08-19 18:15:58 +0000144
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000145public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000146 VariableExprAST(const std::string &Name) : Name(Name) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000147 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000148};
149
150/// BinaryExprAST - Expression class for a binary operator.
151class BinaryExprAST : public ExprAST {
152 char Op;
Lang Hames09bf4c12015-08-18 18:11:06 +0000153 std::unique_ptr<ExprAST> LHS, RHS;
Lang Hames59b0da82015-08-19 18:15:58 +0000154
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000155public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000156 BinaryExprAST(char Op, std::unique_ptr<ExprAST> LHS,
157 std::unique_ptr<ExprAST> RHS)
158 : Op(Op), LHS(std::move(LHS)), RHS(std::move(RHS)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000159 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000160};
161
162/// CallExprAST - Expression class for function calls.
163class CallExprAST : public ExprAST {
164 std::string Callee;
Lang Hames09bf4c12015-08-18 18:11:06 +0000165 std::vector<std::unique_ptr<ExprAST>> Args;
Lang Hames59b0da82015-08-19 18:15:58 +0000166
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000167public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000168 CallExprAST(const std::string &Callee,
169 std::vector<std::unique_ptr<ExprAST>> Args)
170 : Callee(Callee), Args(std::move(Args)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000171 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000172};
173
174/// IfExprAST - Expression class for if/then/else.
175class IfExprAST : public ExprAST {
Lang Hames09bf4c12015-08-18 18:11:06 +0000176 std::unique_ptr<ExprAST> Cond, Then, Else;
Lang Hames59b0da82015-08-19 18:15:58 +0000177
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000178public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000179 IfExprAST(std::unique_ptr<ExprAST> Cond, std::unique_ptr<ExprAST> Then,
180 std::unique_ptr<ExprAST> Else)
181 : Cond(std::move(Cond)), Then(std::move(Then)), Else(std::move(Else)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000182 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000183};
184
185/// ForExprAST - Expression class for for/in.
186class ForExprAST : public ExprAST {
187 std::string VarName;
Lang Hames09bf4c12015-08-18 18:11:06 +0000188 std::unique_ptr<ExprAST> Start, End, Step, Body;
Lang Hames59b0da82015-08-19 18:15:58 +0000189
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000190public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000191 ForExprAST(const std::string &VarName, std::unique_ptr<ExprAST> Start,
192 std::unique_ptr<ExprAST> End, std::unique_ptr<ExprAST> Step,
193 std::unique_ptr<ExprAST> Body)
194 : VarName(VarName), Start(std::move(Start)), End(std::move(End)),
195 Step(std::move(Step)), Body(std::move(Body)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000196 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000197};
198
199/// PrototypeAST - This class represents the "prototype" for a function,
200/// which captures its name, and its argument names (thus implicitly the number
201/// of arguments the function takes).
202class PrototypeAST {
203 std::string Name;
204 std::vector<std::string> Args;
Lang Hames59b0da82015-08-19 18:15:58 +0000205
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000206public:
Lang Hames59b0da82015-08-19 18:15:58 +0000207 PrototypeAST(const std::string &Name, std::vector<std::string> Args)
208 : Name(Name), Args(std::move(Args)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000209 Function *codegen();
210 const std::string &getName() const { return Name; }
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000211};
212
213/// FunctionAST - This class represents a function definition itself.
214class FunctionAST {
Lang Hames09bf4c12015-08-18 18:11:06 +0000215 std::unique_ptr<PrototypeAST> Proto;
216 std::unique_ptr<ExprAST> Body;
Lang Hames59b0da82015-08-19 18:15:58 +0000217
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000218public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000219 FunctionAST(std::unique_ptr<PrototypeAST> Proto,
220 std::unique_ptr<ExprAST> Body)
Lang Hames59b0da82015-08-19 18:15:58 +0000221 : Proto(std::move(Proto)), Body(std::move(Body)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000222 Function *codegen();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000223};
Juergen Ributzka05c5a932013-11-19 03:08:35 +0000224} // end anonymous namespace
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000225
226//===----------------------------------------------------------------------===//
227// Parser
228//===----------------------------------------------------------------------===//
229
230/// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
231/// token the parser is looking at. getNextToken reads another token from the
232/// lexer and updates CurTok with its results.
233static int CurTok;
Eric Christopherc0239362014-12-08 18:12:28 +0000234static int getNextToken() { return CurTok = gettok(); }
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000235
236/// BinopPrecedence - This holds the precedence for each binary operator that is
237/// defined.
238static std::map<char, int> BinopPrecedence;
239
240/// GetTokPrecedence - Get the precedence of the pending binary operator token.
241static int GetTokPrecedence() {
242 if (!isascii(CurTok))
243 return -1;
Eric Christopherc0239362014-12-08 18:12:28 +0000244
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000245 // Make sure it's a declared binop.
246 int TokPrec = BinopPrecedence[CurTok];
Eric Christopherc0239362014-12-08 18:12:28 +0000247 if (TokPrec <= 0)
248 return -1;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000249 return TokPrec;
250}
251
Lang Hames5d045a92016-03-25 17:41:26 +0000252/// LogError* - These are little helper functions for error handling.
253std::unique_ptr<ExprAST> LogError(const char *Str) {
Eric Christopherc0239362014-12-08 18:12:28 +0000254 fprintf(stderr, "Error: %s\n", Str);
Lang Hames09bf4c12015-08-18 18:11:06 +0000255 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000256}
Hans Wennborgcc9deb42015-09-29 18:02:48 +0000257
Lang Hames5d045a92016-03-25 17:41:26 +0000258std::unique_ptr<PrototypeAST> LogErrorP(const char *Str) {
259 LogError(Str);
Lang Hames09bf4c12015-08-18 18:11:06 +0000260 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000261}
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000262
Lang Hames09bf4c12015-08-18 18:11:06 +0000263static std::unique_ptr<ExprAST> ParseExpression();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000264
Lang Hames59b0da82015-08-19 18:15:58 +0000265/// numberexpr ::= number
266static std::unique_ptr<ExprAST> ParseNumberExpr() {
267 auto Result = llvm::make_unique<NumberExprAST>(NumVal);
268 getNextToken(); // consume the number
269 return std::move(Result);
270}
271
272/// parenexpr ::= '(' expression ')'
273static std::unique_ptr<ExprAST> ParseParenExpr() {
274 getNextToken(); // eat (.
275 auto V = ParseExpression();
276 if (!V)
277 return nullptr;
278
279 if (CurTok != ')')
Lang Hames5d045a92016-03-25 17:41:26 +0000280 return LogError("expected ')'");
Lang Hames59b0da82015-08-19 18:15:58 +0000281 getNextToken(); // eat ).
282 return V;
283}
284
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000285/// identifierexpr
286/// ::= identifier
287/// ::= identifier '(' expression* ')'
Lang Hames09bf4c12015-08-18 18:11:06 +0000288static std::unique_ptr<ExprAST> ParseIdentifierExpr() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000289 std::string IdName = IdentifierStr;
Eric Christopherc0239362014-12-08 18:12:28 +0000290
291 getNextToken(); // eat identifier.
292
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000293 if (CurTok != '(') // Simple variable ref.
Lang Hames09bf4c12015-08-18 18:11:06 +0000294 return llvm::make_unique<VariableExprAST>(IdName);
Eric Christopherc0239362014-12-08 18:12:28 +0000295
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000296 // Call.
Eric Christopherc0239362014-12-08 18:12:28 +0000297 getNextToken(); // eat (
Lang Hames09bf4c12015-08-18 18:11:06 +0000298 std::vector<std::unique_ptr<ExprAST>> Args;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000299 if (CurTok != ')') {
Eugene Zelenkof981ec42016-05-19 01:08:04 +0000300 while (true) {
Lang Hames09bf4c12015-08-18 18:11:06 +0000301 if (auto Arg = ParseExpression())
302 Args.push_back(std::move(Arg));
303 else
304 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000305
Eric Christopherc0239362014-12-08 18:12:28 +0000306 if (CurTok == ')')
307 break;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000308
309 if (CurTok != ',')
Lang Hames5d045a92016-03-25 17:41:26 +0000310 return LogError("Expected ')' or ',' in argument list");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000311 getNextToken();
312 }
313 }
314
315 // Eat the ')'.
316 getNextToken();
Eric Christopherc0239362014-12-08 18:12:28 +0000317
Lang Hames09bf4c12015-08-18 18:11:06 +0000318 return llvm::make_unique<CallExprAST>(IdName, std::move(Args));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000319}
320
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000321/// ifexpr ::= 'if' expression 'then' expression 'else' expression
Lang Hames09bf4c12015-08-18 18:11:06 +0000322static std::unique_ptr<ExprAST> ParseIfExpr() {
Eric Christopherc0239362014-12-08 18:12:28 +0000323 getNextToken(); // eat the if.
324
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000325 // condition.
Lang Hames09bf4c12015-08-18 18:11:06 +0000326 auto Cond = ParseExpression();
Eric Christopherc0239362014-12-08 18:12:28 +0000327 if (!Cond)
Lang Hames09bf4c12015-08-18 18:11:06 +0000328 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000329
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000330 if (CurTok != tok_then)
Lang Hames5d045a92016-03-25 17:41:26 +0000331 return LogError("expected then");
Eric Christopherc0239362014-12-08 18:12:28 +0000332 getNextToken(); // eat the then
333
Lang Hames09bf4c12015-08-18 18:11:06 +0000334 auto Then = ParseExpression();
335 if (!Then)
336 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000337
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000338 if (CurTok != tok_else)
Lang Hames5d045a92016-03-25 17:41:26 +0000339 return LogError("expected else");
Eric Christopherc0239362014-12-08 18:12:28 +0000340
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000341 getNextToken();
Eric Christopherc0239362014-12-08 18:12:28 +0000342
Lang Hames09bf4c12015-08-18 18:11:06 +0000343 auto Else = ParseExpression();
Eric Christopherc0239362014-12-08 18:12:28 +0000344 if (!Else)
Lang Hames09bf4c12015-08-18 18:11:06 +0000345 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000346
Lang Hames09bf4c12015-08-18 18:11:06 +0000347 return llvm::make_unique<IfExprAST>(std::move(Cond), std::move(Then),
348 std::move(Else));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000349}
350
351/// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
Lang Hames09bf4c12015-08-18 18:11:06 +0000352static std::unique_ptr<ExprAST> ParseForExpr() {
Eric Christopherc0239362014-12-08 18:12:28 +0000353 getNextToken(); // eat the for.
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000354
355 if (CurTok != tok_identifier)
Lang Hames5d045a92016-03-25 17:41:26 +0000356 return LogError("expected identifier after for");
Eric Christopherc0239362014-12-08 18:12:28 +0000357
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000358 std::string IdName = IdentifierStr;
Eric Christopherc0239362014-12-08 18:12:28 +0000359 getNextToken(); // eat identifier.
360
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000361 if (CurTok != '=')
Lang Hames5d045a92016-03-25 17:41:26 +0000362 return LogError("expected '=' after for");
Eric Christopherc0239362014-12-08 18:12:28 +0000363 getNextToken(); // eat '='.
364
Lang Hames09bf4c12015-08-18 18:11:06 +0000365 auto Start = ParseExpression();
366 if (!Start)
367 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000368 if (CurTok != ',')
Lang Hames5d045a92016-03-25 17:41:26 +0000369 return LogError("expected ',' after for start value");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000370 getNextToken();
Eric Christopherc0239362014-12-08 18:12:28 +0000371
Lang Hames09bf4c12015-08-18 18:11:06 +0000372 auto End = ParseExpression();
373 if (!End)
374 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000375
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000376 // The step value is optional.
Lang Hames09bf4c12015-08-18 18:11:06 +0000377 std::unique_ptr<ExprAST> Step;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000378 if (CurTok == ',') {
379 getNextToken();
380 Step = ParseExpression();
Lang Hames09bf4c12015-08-18 18:11:06 +0000381 if (!Step)
382 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000383 }
Eric Christopherc0239362014-12-08 18:12:28 +0000384
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000385 if (CurTok != tok_in)
Lang Hames5d045a92016-03-25 17:41:26 +0000386 return LogError("expected 'in' after for");
Eric Christopherc0239362014-12-08 18:12:28 +0000387 getNextToken(); // eat 'in'.
388
Lang Hames09bf4c12015-08-18 18:11:06 +0000389 auto Body = ParseExpression();
390 if (!Body)
391 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000392
Lang Hames09bf4c12015-08-18 18:11:06 +0000393 return llvm::make_unique<ForExprAST>(IdName, std::move(Start), std::move(End),
394 std::move(Step), std::move(Body));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000395}
396
397/// primary
398/// ::= identifierexpr
399/// ::= numberexpr
400/// ::= parenexpr
401/// ::= ifexpr
402/// ::= forexpr
Lang Hames09bf4c12015-08-18 18:11:06 +0000403static std::unique_ptr<ExprAST> ParsePrimary() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000404 switch (CurTok) {
Eric Christopherc0239362014-12-08 18:12:28 +0000405 default:
Lang Hames5d045a92016-03-25 17:41:26 +0000406 return LogError("unknown token when expecting an expression");
Eric Christopherc0239362014-12-08 18:12:28 +0000407 case tok_identifier:
408 return ParseIdentifierExpr();
409 case tok_number:
410 return ParseNumberExpr();
411 case '(':
412 return ParseParenExpr();
413 case tok_if:
414 return ParseIfExpr();
415 case tok_for:
416 return ParseForExpr();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000417 }
418}
419
420/// binoprhs
421/// ::= ('+' primary)*
Lang Hames09bf4c12015-08-18 18:11:06 +0000422static std::unique_ptr<ExprAST> ParseBinOpRHS(int ExprPrec,
423 std::unique_ptr<ExprAST> LHS) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000424 // If this is a binop, find its precedence.
Eugene Zelenkof981ec42016-05-19 01:08:04 +0000425 while (true) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000426 int TokPrec = GetTokPrecedence();
Eric Christopherc0239362014-12-08 18:12:28 +0000427
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000428 // If this is a binop that binds at least as tightly as the current binop,
429 // consume it, otherwise we are done.
430 if (TokPrec < ExprPrec)
431 return LHS;
Eric Christopherc0239362014-12-08 18:12:28 +0000432
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000433 // Okay, we know this is a binop.
434 int BinOp = CurTok;
Eric Christopherc0239362014-12-08 18:12:28 +0000435 getNextToken(); // eat binop
436
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000437 // Parse the primary expression after the binary operator.
Lang Hames09bf4c12015-08-18 18:11:06 +0000438 auto RHS = ParsePrimary();
Eric Christopherc0239362014-12-08 18:12:28 +0000439 if (!RHS)
Lang Hames09bf4c12015-08-18 18:11:06 +0000440 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000441
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000442 // If BinOp binds less tightly with RHS than the operator after RHS, let
443 // the pending operator take RHS as its LHS.
444 int NextPrec = GetTokPrecedence();
445 if (TokPrec < NextPrec) {
Lang Hames09bf4c12015-08-18 18:11:06 +0000446 RHS = ParseBinOpRHS(TokPrec + 1, std::move(RHS));
447 if (!RHS)
448 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000449 }
Eric Christopherc0239362014-12-08 18:12:28 +0000450
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000451 // Merge LHS/RHS.
Lang Hames59b0da82015-08-19 18:15:58 +0000452 LHS =
453 llvm::make_unique<BinaryExprAST>(BinOp, std::move(LHS), std::move(RHS));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000454 }
455}
456
457/// expression
458/// ::= primary binoprhs
459///
Lang Hames09bf4c12015-08-18 18:11:06 +0000460static std::unique_ptr<ExprAST> ParseExpression() {
461 auto LHS = ParsePrimary();
Eric Christopherc0239362014-12-08 18:12:28 +0000462 if (!LHS)
Lang Hames09bf4c12015-08-18 18:11:06 +0000463 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000464
Lang Hames09bf4c12015-08-18 18:11:06 +0000465 return ParseBinOpRHS(0, std::move(LHS));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000466}
467
468/// prototype
469/// ::= id '(' id* ')'
Lang Hames09bf4c12015-08-18 18:11:06 +0000470static std::unique_ptr<PrototypeAST> ParsePrototype() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000471 if (CurTok != tok_identifier)
Lang Hames5d045a92016-03-25 17:41:26 +0000472 return LogErrorP("Expected function name in prototype");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000473
474 std::string FnName = IdentifierStr;
475 getNextToken();
Eric Christopherc0239362014-12-08 18:12:28 +0000476
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000477 if (CurTok != '(')
Lang Hames5d045a92016-03-25 17:41:26 +0000478 return LogErrorP("Expected '(' in prototype");
Eric Christopherc0239362014-12-08 18:12:28 +0000479
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000480 std::vector<std::string> ArgNames;
481 while (getNextToken() == tok_identifier)
482 ArgNames.push_back(IdentifierStr);
483 if (CurTok != ')')
Lang Hames5d045a92016-03-25 17:41:26 +0000484 return LogErrorP("Expected ')' in prototype");
Eric Christopherc0239362014-12-08 18:12:28 +0000485
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000486 // success.
Eric Christopherc0239362014-12-08 18:12:28 +0000487 getNextToken(); // eat ')'.
488
Lang Hames09bf4c12015-08-18 18:11:06 +0000489 return llvm::make_unique<PrototypeAST>(FnName, std::move(ArgNames));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000490}
491
492/// definition ::= 'def' prototype expression
Lang Hames09bf4c12015-08-18 18:11:06 +0000493static std::unique_ptr<FunctionAST> ParseDefinition() {
Eric Christopherc0239362014-12-08 18:12:28 +0000494 getNextToken(); // eat def.
Lang Hames09bf4c12015-08-18 18:11:06 +0000495 auto Proto = ParsePrototype();
496 if (!Proto)
497 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000498
Lang Hames09bf4c12015-08-18 18:11:06 +0000499 if (auto E = ParseExpression())
500 return llvm::make_unique<FunctionAST>(std::move(Proto), std::move(E));
501 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000502}
503
504/// toplevelexpr ::= expression
Lang Hames09bf4c12015-08-18 18:11:06 +0000505static std::unique_ptr<FunctionAST> ParseTopLevelExpr() {
506 if (auto E = ParseExpression()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000507 // Make an anonymous proto.
Lang Hames2d789c32015-08-26 03:07:41 +0000508 auto Proto = llvm::make_unique<PrototypeAST>("__anon_expr",
509 std::vector<std::string>());
Lang Hames09bf4c12015-08-18 18:11:06 +0000510 return llvm::make_unique<FunctionAST>(std::move(Proto), std::move(E));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000511 }
Lang Hames09bf4c12015-08-18 18:11:06 +0000512 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000513}
514
515/// external ::= 'extern' prototype
Lang Hames09bf4c12015-08-18 18:11:06 +0000516static std::unique_ptr<PrototypeAST> ParseExtern() {
Eric Christopherc0239362014-12-08 18:12:28 +0000517 getNextToken(); // eat extern.
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000518 return ParsePrototype();
519}
520
521//===----------------------------------------------------------------------===//
522// Code Generation
523//===----------------------------------------------------------------------===//
524
Mehdi Amini03b42e42016-04-14 21:59:01 +0000525static LLVMContext TheContext;
526static IRBuilder<> Builder(TheContext);
Lang Hames24796802016-05-22 22:48:36 +0000527static std::unique_ptr<Module> TheModule;
Eric Christopherc0239362014-12-08 18:12:28 +0000528static std::map<std::string, Value *> NamedValues;
Lang Hames2d789c32015-08-26 03:07:41 +0000529static std::unique_ptr<legacy::FunctionPassManager> TheFPM;
530static std::unique_ptr<KaleidoscopeJIT> TheJIT;
531static std::map<std::string, std::unique_ptr<PrototypeAST>> FunctionProtos;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000532
Lang Hames5d045a92016-03-25 17:41:26 +0000533Value *LogErrorV(const char *Str) {
534 LogError(Str);
Lang Hames09bf4c12015-08-18 18:11:06 +0000535 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000536}
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000537
Lang Hames2d789c32015-08-26 03:07:41 +0000538Function *getFunction(std::string Name) {
539 // First, see if the function has already been added to the current module.
540 if (auto *F = TheModule->getFunction(Name))
541 return F;
542
543 // If not, check whether we can codegen the declaration from some existing
544 // prototype.
545 auto FI = FunctionProtos.find(Name);
546 if (FI != FunctionProtos.end())
547 return FI->second->codegen();
548
549 // If no existing prototype exists, return null.
550 return nullptr;
551}
552
553Value *NumberExprAST::codegen() {
Mehdi Amini03b42e42016-04-14 21:59:01 +0000554 return ConstantFP::get(TheContext, APFloat(Val));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000555}
556
Lang Hames2d789c32015-08-26 03:07:41 +0000557Value *VariableExprAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000558 // Look this variable up in the function.
559 Value *V = NamedValues[Name];
Lang Hames596aec92015-08-19 18:32:58 +0000560 if (!V)
Lang Hames5d045a92016-03-25 17:41:26 +0000561 return LogErrorV("Unknown variable name");
Lang Hames596aec92015-08-19 18:32:58 +0000562 return V;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000563}
564
Lang Hames2d789c32015-08-26 03:07:41 +0000565Value *BinaryExprAST::codegen() {
566 Value *L = LHS->codegen();
567 Value *R = RHS->codegen();
Lang Hames09bf4c12015-08-18 18:11:06 +0000568 if (!L || !R)
569 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000570
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000571 switch (Op) {
Eric Christopherc0239362014-12-08 18:12:28 +0000572 case '+':
573 return Builder.CreateFAdd(L, R, "addtmp");
574 case '-':
575 return Builder.CreateFSub(L, R, "subtmp");
576 case '*':
577 return Builder.CreateFMul(L, R, "multmp");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000578 case '<':
579 L = Builder.CreateFCmpULT(L, R, "cmptmp");
580 // Convert bool 0/1 to double 0.0 or 1.0
Mehdi Amini03b42e42016-04-14 21:59:01 +0000581 return Builder.CreateUIToFP(L, Type::getDoubleTy(TheContext), "booltmp");
Eric Christopherc0239362014-12-08 18:12:28 +0000582 default:
Lang Hames5d045a92016-03-25 17:41:26 +0000583 return LogErrorV("invalid binary operator");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000584 }
585}
586
Lang Hames2d789c32015-08-26 03:07:41 +0000587Value *CallExprAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000588 // Look up the name in the global module table.
Lang Hames2d789c32015-08-26 03:07:41 +0000589 Function *CalleeF = getFunction(Callee);
Lang Hames09bf4c12015-08-18 18:11:06 +0000590 if (!CalleeF)
Lang Hames5d045a92016-03-25 17:41:26 +0000591 return LogErrorV("Unknown function referenced");
Eric Christopherc0239362014-12-08 18:12:28 +0000592
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000593 // If argument mismatch error.
594 if (CalleeF->arg_size() != Args.size())
Lang Hames5d045a92016-03-25 17:41:26 +0000595 return LogErrorV("Incorrect # arguments passed");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000596
Eric Christopherc0239362014-12-08 18:12:28 +0000597 std::vector<Value *> ArgsV;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000598 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
Lang Hames2d789c32015-08-26 03:07:41 +0000599 ArgsV.push_back(Args[i]->codegen());
Lang Hames09bf4c12015-08-18 18:11:06 +0000600 if (!ArgsV.back())
601 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000602 }
Eric Christopherc0239362014-12-08 18:12:28 +0000603
Francois Pichetc5d10502011-07-15 10:59:52 +0000604 return Builder.CreateCall(CalleeF, ArgsV, "calltmp");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000605}
606
Lang Hames2d789c32015-08-26 03:07:41 +0000607Value *IfExprAST::codegen() {
608 Value *CondV = Cond->codegen();
Lang Hames09bf4c12015-08-18 18:11:06 +0000609 if (!CondV)
610 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000611
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000612 // Convert condition to a bool by comparing equal to 0.0.
Eric Christopherc0239362014-12-08 18:12:28 +0000613 CondV = Builder.CreateFCmpONE(
Mehdi Amini03b42e42016-04-14 21:59:01 +0000614 CondV, ConstantFP::get(TheContext, APFloat(0.0)), "ifcond");
Eric Christopherc0239362014-12-08 18:12:28 +0000615
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000616 Function *TheFunction = Builder.GetInsertBlock()->getParent();
Eric Christopherc0239362014-12-08 18:12:28 +0000617
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000618 // Create blocks for the then and else cases. Insert the 'then' block at the
619 // end of the function.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000620 BasicBlock *ThenBB = BasicBlock::Create(TheContext, "then", TheFunction);
621 BasicBlock *ElseBB = BasicBlock::Create(TheContext, "else");
622 BasicBlock *MergeBB = BasicBlock::Create(TheContext, "ifcont");
Eric Christopherc0239362014-12-08 18:12:28 +0000623
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000624 Builder.CreateCondBr(CondV, ThenBB, ElseBB);
Eric Christopherc0239362014-12-08 18:12:28 +0000625
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000626 // Emit then value.
627 Builder.SetInsertPoint(ThenBB);
Eric Christopherc0239362014-12-08 18:12:28 +0000628
Lang Hames2d789c32015-08-26 03:07:41 +0000629 Value *ThenV = Then->codegen();
Lang Hames09bf4c12015-08-18 18:11:06 +0000630 if (!ThenV)
631 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000632
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000633 Builder.CreateBr(MergeBB);
634 // Codegen of 'Then' can change the current block, update ThenBB for the PHI.
635 ThenBB = Builder.GetInsertBlock();
Eric Christopherc0239362014-12-08 18:12:28 +0000636
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000637 // Emit else block.
638 TheFunction->getBasicBlockList().push_back(ElseBB);
639 Builder.SetInsertPoint(ElseBB);
Eric Christopherc0239362014-12-08 18:12:28 +0000640
Lang Hames2d789c32015-08-26 03:07:41 +0000641 Value *ElseV = Else->codegen();
Lang Hames09bf4c12015-08-18 18:11:06 +0000642 if (!ElseV)
643 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000644
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000645 Builder.CreateBr(MergeBB);
646 // Codegen of 'Else' can change the current block, update ElseBB for the PHI.
647 ElseBB = Builder.GetInsertBlock();
Eric Christopherc0239362014-12-08 18:12:28 +0000648
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000649 // Emit merge block.
650 TheFunction->getBasicBlockList().push_back(MergeBB);
651 Builder.SetInsertPoint(MergeBB);
Mehdi Amini03b42e42016-04-14 21:59:01 +0000652 PHINode *PN = Builder.CreatePHI(Type::getDoubleTy(TheContext), 2, "iftmp");
Eric Christopherc0239362014-12-08 18:12:28 +0000653
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000654 PN->addIncoming(ThenV, ThenBB);
655 PN->addIncoming(ElseV, ElseBB);
656 return PN;
657}
658
Lang Hames59b0da82015-08-19 18:15:58 +0000659// Output for-loop as:
660// ...
661// start = startexpr
662// goto loop
663// loop:
664// variable = phi [start, loopheader], [nextvariable, loopend]
665// ...
666// bodyexpr
667// ...
668// loopend:
669// step = stepexpr
670// nextvariable = variable + step
671// endcond = endexpr
672// br endcond, loop, endloop
673// outloop:
Lang Hames2d789c32015-08-26 03:07:41 +0000674Value *ForExprAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000675 // Emit the start code first, without 'variable' in scope.
Lang Hames2d789c32015-08-26 03:07:41 +0000676 Value *StartVal = Start->codegen();
Lang Hames09bf4c12015-08-18 18:11:06 +0000677 if (!StartVal)
678 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000679
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000680 // Make the new basic block for the loop header, inserting after current
681 // block.
682 Function *TheFunction = Builder.GetInsertBlock()->getParent();
683 BasicBlock *PreheaderBB = Builder.GetInsertBlock();
Mehdi Amini03b42e42016-04-14 21:59:01 +0000684 BasicBlock *LoopBB = BasicBlock::Create(TheContext, "loop", TheFunction);
Eric Christopherc0239362014-12-08 18:12:28 +0000685
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000686 // Insert an explicit fall through from the current block to the LoopBB.
687 Builder.CreateBr(LoopBB);
688
689 // Start insertion in LoopBB.
690 Builder.SetInsertPoint(LoopBB);
Eric Christopherc0239362014-12-08 18:12:28 +0000691
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000692 // Start the PHI node with an entry for Start.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000693 PHINode *Variable =
Eugene Zelenkof981ec42016-05-19 01:08:04 +0000694 Builder.CreatePHI(Type::getDoubleTy(TheContext), 2, VarName);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000695 Variable->addIncoming(StartVal, PreheaderBB);
Eric Christopherc0239362014-12-08 18:12:28 +0000696
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000697 // Within the loop, the variable is defined equal to the PHI node. If it
698 // shadows an existing variable, we have to restore it, so save it now.
699 Value *OldVal = NamedValues[VarName];
700 NamedValues[VarName] = Variable;
Eric Christopherc0239362014-12-08 18:12:28 +0000701
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000702 // Emit the body of the loop. This, like any other expr, can change the
703 // current BB. Note that we ignore the value computed by the body, but don't
704 // allow an error.
Lang Hames2d789c32015-08-26 03:07:41 +0000705 if (!Body->codegen())
Lang Hames09bf4c12015-08-18 18:11:06 +0000706 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000707
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000708 // Emit the step value.
Lang Hames59b0da82015-08-19 18:15:58 +0000709 Value *StepVal = nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000710 if (Step) {
Lang Hames2d789c32015-08-26 03:07:41 +0000711 StepVal = Step->codegen();
Lang Hames09bf4c12015-08-18 18:11:06 +0000712 if (!StepVal)
713 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000714 } else {
715 // If not specified, use 1.0.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000716 StepVal = ConstantFP::get(TheContext, APFloat(1.0));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000717 }
Eric Christopherc0239362014-12-08 18:12:28 +0000718
Chris Lattner26d79502010-06-21 22:51:14 +0000719 Value *NextVar = Builder.CreateFAdd(Variable, StepVal, "nextvar");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000720
721 // Compute the end condition.
Lang Hames2d789c32015-08-26 03:07:41 +0000722 Value *EndCond = End->codegen();
Lang Hames09bf4c12015-08-18 18:11:06 +0000723 if (!EndCond)
Lang Hames59b0da82015-08-19 18:15:58 +0000724 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000725
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000726 // Convert condition to a bool by comparing equal to 0.0.
Eric Christopherc0239362014-12-08 18:12:28 +0000727 EndCond = Builder.CreateFCmpONE(
Mehdi Amini03b42e42016-04-14 21:59:01 +0000728 EndCond, ConstantFP::get(TheContext, APFloat(0.0)), "loopcond");
Eric Christopherc0239362014-12-08 18:12:28 +0000729
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000730 // Create the "after loop" block and insert it.
731 BasicBlock *LoopEndBB = Builder.GetInsertBlock();
Eric Christopherc0239362014-12-08 18:12:28 +0000732 BasicBlock *AfterBB =
Mehdi Amini03b42e42016-04-14 21:59:01 +0000733 BasicBlock::Create(TheContext, "afterloop", TheFunction);
Eric Christopherc0239362014-12-08 18:12:28 +0000734
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000735 // Insert the conditional branch into the end of LoopEndBB.
736 Builder.CreateCondBr(EndCond, LoopBB, AfterBB);
Eric Christopherc0239362014-12-08 18:12:28 +0000737
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000738 // Any new code will be inserted in AfterBB.
739 Builder.SetInsertPoint(AfterBB);
Eric Christopherc0239362014-12-08 18:12:28 +0000740
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000741 // Add a new entry to the PHI node for the backedge.
742 Variable->addIncoming(NextVar, LoopEndBB);
Eric Christopherc0239362014-12-08 18:12:28 +0000743
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000744 // Restore the unshadowed variable.
745 if (OldVal)
746 NamedValues[VarName] = OldVal;
747 else
748 NamedValues.erase(VarName);
749
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000750 // for expr always returns 0.0.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000751 return Constant::getNullValue(Type::getDoubleTy(TheContext));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000752}
753
Lang Hames2d789c32015-08-26 03:07:41 +0000754Function *PrototypeAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000755 // Make the function type: double(double,double) etc.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000756 std::vector<Type *> Doubles(Args.size(), Type::getDoubleTy(TheContext));
Eric Christopherc0239362014-12-08 18:12:28 +0000757 FunctionType *FT =
Mehdi Amini03b42e42016-04-14 21:59:01 +0000758 FunctionType::get(Type::getDoubleTy(TheContext), Doubles, false);
Eric Christopherc0239362014-12-08 18:12:28 +0000759
760 Function *F =
Lang Hames2d789c32015-08-26 03:07:41 +0000761 Function::Create(FT, Function::ExternalLinkage, Name, TheModule.get());
Eric Christopherc0239362014-12-08 18:12:28 +0000762
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000763 // Set names for all arguments.
764 unsigned Idx = 0;
Lang Hames2d789c32015-08-26 03:07:41 +0000765 for (auto &Arg : F->args())
766 Arg.setName(Args[Idx++]);
Eric Christopherc0239362014-12-08 18:12:28 +0000767
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000768 return F;
769}
770
Lang Hames2d789c32015-08-26 03:07:41 +0000771Function *FunctionAST::codegen() {
772 // Transfer ownership of the prototype to the FunctionProtos map, but keep a
773 // reference to it for use below.
774 auto &P = *Proto;
775 FunctionProtos[Proto->getName()] = std::move(Proto);
776 Function *TheFunction = getFunction(P.getName());
Lang Hames09bf4c12015-08-18 18:11:06 +0000777 if (!TheFunction)
778 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000779
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000780 // Create a new basic block to start insertion into.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000781 BasicBlock *BB = BasicBlock::Create(TheContext, "entry", TheFunction);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000782 Builder.SetInsertPoint(BB);
Eric Christopherc0239362014-12-08 18:12:28 +0000783
Lang Hames2d789c32015-08-26 03:07:41 +0000784 // Record the function arguments in the NamedValues map.
785 NamedValues.clear();
786 for (auto &Arg : TheFunction->args())
787 NamedValues[Arg.getName()] = &Arg;
788
789 if (Value *RetVal = Body->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000790 // Finish off the function.
791 Builder.CreateRet(RetVal);
792
793 // Validate the generated code, checking for consistency.
794 verifyFunction(*TheFunction);
795
Lang Hames2d789c32015-08-26 03:07:41 +0000796 // Run the optimizer on the function.
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000797 TheFPM->run(*TheFunction);
Eric Christopherc0239362014-12-08 18:12:28 +0000798
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000799 return TheFunction;
800 }
Eric Christopherc0239362014-12-08 18:12:28 +0000801
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000802 // Error reading body, remove function.
803 TheFunction->eraseFromParent();
Lang Hames09bf4c12015-08-18 18:11:06 +0000804 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000805}
806
807//===----------------------------------------------------------------------===//
808// Top-Level parsing and JIT Driver
809//===----------------------------------------------------------------------===//
810
Lang Hames2d789c32015-08-26 03:07:41 +0000811static void InitializeModuleAndPassManager() {
812 // Open a new module.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000813 TheModule = llvm::make_unique<Module>("my cool jit", TheContext);
Lang Hames2d789c32015-08-26 03:07:41 +0000814 TheModule->setDataLayout(TheJIT->getTargetMachine().createDataLayout());
815
816 // Create a new pass manager attached to it.
817 TheFPM = llvm::make_unique<legacy::FunctionPassManager>(TheModule.get());
818
Lang Hames2d789c32015-08-26 03:07:41 +0000819 // Do simple "peephole" optimizations and bit-twiddling optzns.
820 TheFPM->add(createInstructionCombiningPass());
821 // Reassociate expressions.
822 TheFPM->add(createReassociatePass());
823 // Eliminate Common SubExpressions.
824 TheFPM->add(createGVNPass());
825 // Simplify the control flow graph (deleting unreachable blocks, etc).
826 TheFPM->add(createCFGSimplificationPass());
827
828 TheFPM->doInitialization();
829}
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000830
831static void HandleDefinition() {
Lang Hames09bf4c12015-08-18 18:11:06 +0000832 if (auto FnAST = ParseDefinition()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000833 if (auto *FnIR = FnAST->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000834 fprintf(stderr, "Read function definition:");
Lang Hames09bf4c12015-08-18 18:11:06 +0000835 FnIR->dump();
Lang Hames2d789c32015-08-26 03:07:41 +0000836 TheJIT->addModule(std::move(TheModule));
837 InitializeModuleAndPassManager();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000838 }
839 } else {
840 // Skip token for error recovery.
841 getNextToken();
842 }
843}
844
845static void HandleExtern() {
Lang Hames09bf4c12015-08-18 18:11:06 +0000846 if (auto ProtoAST = ParseExtern()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000847 if (auto *FnIR = ProtoAST->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000848 fprintf(stderr, "Read extern: ");
Lang Hames09bf4c12015-08-18 18:11:06 +0000849 FnIR->dump();
Lang Hames2d789c32015-08-26 03:07:41 +0000850 FunctionProtos[ProtoAST->getName()] = std::move(ProtoAST);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000851 }
852 } else {
853 // Skip token for error recovery.
854 getNextToken();
855 }
856}
857
858static void HandleTopLevelExpression() {
859 // Evaluate a top-level expression into an anonymous function.
Lang Hames09bf4c12015-08-18 18:11:06 +0000860 if (auto FnAST = ParseTopLevelExpr()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000861 if (FnAST->codegen()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000862 // JIT the module containing the anonymous expression, keeping a handle so
863 // we can free it later.
864 auto H = TheJIT->addModule(std::move(TheModule));
865 InitializeModuleAndPassManager();
866
867 // Search the JIT for the __anon_expr symbol.
868 auto ExprSymbol = TheJIT->findSymbol("__anon_expr");
869 assert(ExprSymbol && "Function not found");
870
871 // Get the symbol's address and cast it to the right type (takes no
872 // arguments, returns a double) so we can call it as a native function.
873 double (*FP)() = (double (*)())(intptr_t)ExprSymbol.getAddress();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000874 fprintf(stderr, "Evaluated to %f\n", FP());
Lang Hames2d789c32015-08-26 03:07:41 +0000875
876 // Delete the anonymous expression module from the JIT.
877 TheJIT->removeModule(H);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000878 }
879 } else {
880 // Skip token for error recovery.
881 getNextToken();
882 }
883}
884
885/// top ::= definition | external | expression | ';'
886static void MainLoop() {
Eugene Zelenkof981ec42016-05-19 01:08:04 +0000887 while (true) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000888 fprintf(stderr, "ready> ");
889 switch (CurTok) {
Eric Christopherc0239362014-12-08 18:12:28 +0000890 case tok_eof:
891 return;
Lang Hames59b0da82015-08-19 18:15:58 +0000892 case ';': // ignore top-level semicolons.
Eric Christopherc0239362014-12-08 18:12:28 +0000893 getNextToken();
Lang Hames59b0da82015-08-19 18:15:58 +0000894 break;
Eric Christopherc0239362014-12-08 18:12:28 +0000895 case tok_def:
896 HandleDefinition();
897 break;
898 case tok_extern:
899 HandleExtern();
900 break;
901 default:
902 HandleTopLevelExpression();
903 break;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000904 }
905 }
906}
907
908//===----------------------------------------------------------------------===//
909// "Library" functions that can be "extern'd" from user code.
910//===----------------------------------------------------------------------===//
911
912/// putchard - putchar that takes a double and returns 0.
NAKAMURA Takumiac9d3732015-08-28 03:34:33 +0000913extern "C" double putchard(double X) {
Lang Hamesd76e0672015-08-27 20:31:44 +0000914 fputc((char)X, stderr);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000915 return 0;
916}
917
Lang Hames59b0da82015-08-19 18:15:58 +0000918/// printd - printf that takes a double prints it as "%f\n", returning 0.
NAKAMURA Takumiac9d3732015-08-28 03:34:33 +0000919extern "C" double printd(double X) {
Lang Hamesd76e0672015-08-27 20:31:44 +0000920 fprintf(stderr, "%f\n", X);
Lang Hames59b0da82015-08-19 18:15:58 +0000921 return 0;
922}
923
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000924//===----------------------------------------------------------------------===//
925// Main driver code.
926//===----------------------------------------------------------------------===//
927
928int main() {
929 InitializeNativeTarget();
Eric Christopher1b74b652014-12-08 18:00:38 +0000930 InitializeNativeTargetAsmPrinter();
931 InitializeNativeTargetAsmParser();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000932
933 // Install standard binary operators.
934 // 1 is lowest precedence.
935 BinopPrecedence['<'] = 10;
936 BinopPrecedence['+'] = 20;
937 BinopPrecedence['-'] = 20;
Eric Christopherc0239362014-12-08 18:12:28 +0000938 BinopPrecedence['*'] = 40; // highest.
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000939
940 // Prime the first token.
941 fprintf(stderr, "ready> ");
942 getNextToken();
943
Lang Hames2d789c32015-08-26 03:07:41 +0000944 TheJIT = llvm::make_unique<KaleidoscopeJIT>();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000945
Lang Hames2d789c32015-08-26 03:07:41 +0000946 InitializeModuleAndPassManager();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000947
948 // Run the main "interpreter loop" now.
949 MainLoop();
950
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000951 return 0;
952}