blob: e9fc5a05fb004dbb336af67d1a2f09b93301b3b2 [file] [log] [blame]
Lang Hames09bf4c12015-08-18 18:11:06 +00001#include "llvm/ADT/STLExtras.h"
Chandler Carruth605e30e2012-12-04 10:16:57 +00002#include "llvm/Analysis/Passes.h"
Chandler Carruth005f27a2013-01-02 11:56:33 +00003#include "llvm/IR/IRBuilder.h"
4#include "llvm/IR/LLVMContext.h"
Chandler Carruth30d69c22015-02-13 10:01:29 +00005#include "llvm/IR/LegacyPassManager.h"
Chandler Carruth005f27a2013-01-02 11:56:33 +00006#include "llvm/IR/Module.h"
Chandler Carruth20d4e6b2014-01-13 09:58:03 +00007#include "llvm/IR/Verifier.h"
Evan Cheng2bb40352011-08-24 18:08:43 +00008#include "llvm/Support/TargetSelect.h"
Chandler Carruth605e30e2012-12-04 10:16:57 +00009#include "llvm/Transforms/Scalar.h"
Chandler Carruthec5872b2016-03-11 12:10:15 +000010#include "llvm/Transforms/Scalar/GVN.h"
Will Dietz981af002013-10-12 00:55:57 +000011#include <cctype>
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000012#include <cstdio>
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000013#include <map>
Chandler Carruth605e30e2012-12-04 10:16:57 +000014#include <string>
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000015#include <vector>
Lang Hames2d789c32015-08-26 03:07:41 +000016#include "../include/KaleidoscopeJIT.h"
17
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000018using namespace llvm;
Lang Hames2d789c32015-08-26 03:07:41 +000019using namespace llvm::orc;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000020
21//===----------------------------------------------------------------------===//
22// Lexer
23//===----------------------------------------------------------------------===//
24
25// The lexer returns tokens [0-255] if it is an unknown character, otherwise one
26// of these for known things.
27enum Token {
28 tok_eof = -1,
29
30 // commands
Eric Christopherc0239362014-12-08 18:12:28 +000031 tok_def = -2,
32 tok_extern = -3,
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000033
34 // primary
Eric Christopherc0239362014-12-08 18:12:28 +000035 tok_identifier = -4,
36 tok_number = -5
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000037};
38
Eric Christopherc0239362014-12-08 18:12:28 +000039static std::string IdentifierStr; // Filled in if tok_identifier
40static double NumVal; // Filled in if tok_number
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000041
42/// gettok - Return the next token from standard input.
43static int gettok() {
44 static int LastChar = ' ';
45
46 // Skip any whitespace.
47 while (isspace(LastChar))
48 LastChar = getchar();
49
50 if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
51 IdentifierStr = LastChar;
52 while (isalnum((LastChar = getchar())))
53 IdentifierStr += LastChar;
54
Eric Christopherc0239362014-12-08 18:12:28 +000055 if (IdentifierStr == "def")
56 return tok_def;
57 if (IdentifierStr == "extern")
58 return tok_extern;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000059 return tok_identifier;
60 }
61
Eric Christopherc0239362014-12-08 18:12:28 +000062 if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000063 std::string NumStr;
64 do {
65 NumStr += LastChar;
66 LastChar = getchar();
67 } while (isdigit(LastChar) || LastChar == '.');
68
Hans Wennborgcc9deb42015-09-29 18:02:48 +000069 NumVal = strtod(NumStr.c_str(), nullptr);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000070 return tok_number;
71 }
72
73 if (LastChar == '#') {
74 // Comment until end of line.
Eric Christopherc0239362014-12-08 18:12:28 +000075 do
76 LastChar = getchar();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000077 while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
Eric Christopherc0239362014-12-08 18:12:28 +000078
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000079 if (LastChar != EOF)
80 return gettok();
81 }
Eric Christopherc0239362014-12-08 18:12:28 +000082
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000083 // Check for end of file. Don't eat the EOF.
84 if (LastChar == EOF)
85 return tok_eof;
86
87 // Otherwise, just return the character as its ascii value.
88 int ThisChar = LastChar;
89 LastChar = getchar();
90 return ThisChar;
91}
92
93//===----------------------------------------------------------------------===//
94// Abstract Syntax Tree (aka Parse Tree)
95//===----------------------------------------------------------------------===//
Juergen Ributzka05c5a932013-11-19 03:08:35 +000096namespace {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000097/// ExprAST - Base class for all expression nodes.
98class ExprAST {
99public:
Juergen Ributzka05c5a932013-11-19 03:08:35 +0000100 virtual ~ExprAST() {}
Lang Hames2d789c32015-08-26 03:07:41 +0000101 virtual Value *codegen() = 0;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000102};
103
104/// NumberExprAST - Expression class for numeric literals like "1.0".
105class NumberExprAST : public ExprAST {
106 double Val;
Lang Hames59b0da82015-08-19 18:15:58 +0000107
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000108public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000109 NumberExprAST(double Val) : Val(Val) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000110 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000111};
112
113/// VariableExprAST - Expression class for referencing a variable, like "a".
114class VariableExprAST : public ExprAST {
115 std::string Name;
Lang Hames59b0da82015-08-19 18:15:58 +0000116
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000117public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000118 VariableExprAST(const std::string &Name) : Name(Name) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000119 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000120};
121
122/// BinaryExprAST - Expression class for a binary operator.
123class BinaryExprAST : public ExprAST {
124 char Op;
Lang Hames09bf4c12015-08-18 18:11:06 +0000125 std::unique_ptr<ExprAST> LHS, RHS;
Lang Hames59b0da82015-08-19 18:15:58 +0000126
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000127public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000128 BinaryExprAST(char Op, std::unique_ptr<ExprAST> LHS,
129 std::unique_ptr<ExprAST> RHS)
130 : Op(Op), LHS(std::move(LHS)), RHS(std::move(RHS)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000131 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000132};
133
134/// CallExprAST - Expression class for function calls.
135class CallExprAST : public ExprAST {
136 std::string Callee;
Lang Hames09bf4c12015-08-18 18:11:06 +0000137 std::vector<std::unique_ptr<ExprAST>> Args;
Lang Hames59b0da82015-08-19 18:15:58 +0000138
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000139public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000140 CallExprAST(const std::string &Callee,
141 std::vector<std::unique_ptr<ExprAST>> Args)
142 : Callee(Callee), Args(std::move(Args)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000143 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000144};
145
146/// PrototypeAST - This class represents the "prototype" for a function,
147/// which captures its name, and its argument names (thus implicitly the number
148/// of arguments the function takes).
149class PrototypeAST {
150 std::string Name;
151 std::vector<std::string> Args;
Lang Hames59b0da82015-08-19 18:15:58 +0000152
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000153public:
Lang Hames59b0da82015-08-19 18:15:58 +0000154 PrototypeAST(const std::string &Name, std::vector<std::string> Args)
155 : Name(Name), Args(std::move(Args)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000156 Function *codegen();
157 const std::string &getName() const { return Name; }
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000158};
159
160/// FunctionAST - This class represents a function definition itself.
161class FunctionAST {
Lang Hames09bf4c12015-08-18 18:11:06 +0000162 std::unique_ptr<PrototypeAST> Proto;
163 std::unique_ptr<ExprAST> Body;
Lang Hames59b0da82015-08-19 18:15:58 +0000164
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000165public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000166 FunctionAST(std::unique_ptr<PrototypeAST> Proto,
167 std::unique_ptr<ExprAST> Body)
Lang Hames59b0da82015-08-19 18:15:58 +0000168 : Proto(std::move(Proto)), Body(std::move(Body)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000169 Function *codegen();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000170};
Juergen Ributzka05c5a932013-11-19 03:08:35 +0000171} // end anonymous namespace
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000172
173//===----------------------------------------------------------------------===//
174// Parser
175//===----------------------------------------------------------------------===//
176
177/// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
178/// token the parser is looking at. getNextToken reads another token from the
179/// lexer and updates CurTok with its results.
180static int CurTok;
Eric Christopherc0239362014-12-08 18:12:28 +0000181static int getNextToken() { return CurTok = gettok(); }
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000182
183/// BinopPrecedence - This holds the precedence for each binary operator that is
184/// defined.
185static std::map<char, int> BinopPrecedence;
186
187/// GetTokPrecedence - Get the precedence of the pending binary operator token.
188static int GetTokPrecedence() {
189 if (!isascii(CurTok))
190 return -1;
Eric Christopherc0239362014-12-08 18:12:28 +0000191
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000192 // Make sure it's a declared binop.
193 int TokPrec = BinopPrecedence[CurTok];
Eric Christopherc0239362014-12-08 18:12:28 +0000194 if (TokPrec <= 0)
195 return -1;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000196 return TokPrec;
197}
198
199/// Error* - These are little helper functions for error handling.
Lang Hames09bf4c12015-08-18 18:11:06 +0000200std::unique_ptr<ExprAST> Error(const char *Str) {
Eric Christopherc0239362014-12-08 18:12:28 +0000201 fprintf(stderr, "Error: %s\n", Str);
Lang Hames09bf4c12015-08-18 18:11:06 +0000202 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000203}
Hans Wennborgcc9deb42015-09-29 18:02:48 +0000204
Lang Hames09bf4c12015-08-18 18:11:06 +0000205std::unique_ptr<PrototypeAST> ErrorP(const char *Str) {
Eric Christopherc0239362014-12-08 18:12:28 +0000206 Error(Str);
Lang Hames09bf4c12015-08-18 18:11:06 +0000207 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000208}
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000209
Lang Hames09bf4c12015-08-18 18:11:06 +0000210static std::unique_ptr<ExprAST> ParseExpression();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000211
Lang Hames59b0da82015-08-19 18:15:58 +0000212/// numberexpr ::= number
213static std::unique_ptr<ExprAST> ParseNumberExpr() {
214 auto Result = llvm::make_unique<NumberExprAST>(NumVal);
215 getNextToken(); // consume the number
216 return std::move(Result);
217}
218
219/// parenexpr ::= '(' expression ')'
220static std::unique_ptr<ExprAST> ParseParenExpr() {
221 getNextToken(); // eat (.
222 auto V = ParseExpression();
223 if (!V)
224 return nullptr;
225
226 if (CurTok != ')')
227 return Error("expected ')'");
228 getNextToken(); // eat ).
229 return V;
230}
231
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000232/// identifierexpr
233/// ::= identifier
234/// ::= identifier '(' expression* ')'
Lang Hames09bf4c12015-08-18 18:11:06 +0000235static std::unique_ptr<ExprAST> ParseIdentifierExpr() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000236 std::string IdName = IdentifierStr;
Eric Christopherc0239362014-12-08 18:12:28 +0000237
238 getNextToken(); // eat identifier.
239
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000240 if (CurTok != '(') // Simple variable ref.
Lang Hames09bf4c12015-08-18 18:11:06 +0000241 return llvm::make_unique<VariableExprAST>(IdName);
Eric Christopherc0239362014-12-08 18:12:28 +0000242
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000243 // Call.
Eric Christopherc0239362014-12-08 18:12:28 +0000244 getNextToken(); // eat (
Lang Hames09bf4c12015-08-18 18:11:06 +0000245 std::vector<std::unique_ptr<ExprAST>> Args;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000246 if (CurTok != ')') {
247 while (1) {
Lang Hames09bf4c12015-08-18 18:11:06 +0000248 if (auto Arg = ParseExpression())
249 Args.push_back(std::move(Arg));
250 else
251 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000252
Eric Christopherc0239362014-12-08 18:12:28 +0000253 if (CurTok == ')')
254 break;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000255
256 if (CurTok != ',')
257 return Error("Expected ')' or ',' in argument list");
258 getNextToken();
259 }
260 }
261
262 // Eat the ')'.
263 getNextToken();
Eric Christopherc0239362014-12-08 18:12:28 +0000264
Lang Hames09bf4c12015-08-18 18:11:06 +0000265 return llvm::make_unique<CallExprAST>(IdName, std::move(Args));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000266}
267
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000268/// primary
269/// ::= identifierexpr
270/// ::= numberexpr
271/// ::= parenexpr
Lang Hames09bf4c12015-08-18 18:11:06 +0000272static std::unique_ptr<ExprAST> ParsePrimary() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000273 switch (CurTok) {
Eric Christopherc0239362014-12-08 18:12:28 +0000274 default:
275 return Error("unknown token when expecting an expression");
276 case tok_identifier:
277 return ParseIdentifierExpr();
278 case tok_number:
279 return ParseNumberExpr();
280 case '(':
281 return ParseParenExpr();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000282 }
283}
284
285/// binoprhs
286/// ::= ('+' primary)*
Lang Hames09bf4c12015-08-18 18:11:06 +0000287static std::unique_ptr<ExprAST> ParseBinOpRHS(int ExprPrec,
288 std::unique_ptr<ExprAST> LHS) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000289 // If this is a binop, find its precedence.
290 while (1) {
291 int TokPrec = GetTokPrecedence();
Eric Christopherc0239362014-12-08 18:12:28 +0000292
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000293 // If this is a binop that binds at least as tightly as the current binop,
294 // consume it, otherwise we are done.
295 if (TokPrec < ExprPrec)
296 return LHS;
Eric Christopherc0239362014-12-08 18:12:28 +0000297
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000298 // Okay, we know this is a binop.
299 int BinOp = CurTok;
Eric Christopherc0239362014-12-08 18:12:28 +0000300 getNextToken(); // eat binop
301
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000302 // Parse the primary expression after the binary operator.
Lang Hames09bf4c12015-08-18 18:11:06 +0000303 auto RHS = ParsePrimary();
Eric Christopherc0239362014-12-08 18:12:28 +0000304 if (!RHS)
Lang Hames09bf4c12015-08-18 18:11:06 +0000305 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000306
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000307 // If BinOp binds less tightly with RHS than the operator after RHS, let
308 // the pending operator take RHS as its LHS.
309 int NextPrec = GetTokPrecedence();
310 if (TokPrec < NextPrec) {
Lang Hames09bf4c12015-08-18 18:11:06 +0000311 RHS = ParseBinOpRHS(TokPrec + 1, std::move(RHS));
312 if (!RHS)
313 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000314 }
Eric Christopherc0239362014-12-08 18:12:28 +0000315
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000316 // Merge LHS/RHS.
Lang Hames59b0da82015-08-19 18:15:58 +0000317 LHS =
318 llvm::make_unique<BinaryExprAST>(BinOp, std::move(LHS), std::move(RHS));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000319 }
320}
321
322/// expression
323/// ::= primary binoprhs
324///
Lang Hames09bf4c12015-08-18 18:11:06 +0000325static std::unique_ptr<ExprAST> ParseExpression() {
326 auto LHS = ParsePrimary();
Eric Christopherc0239362014-12-08 18:12:28 +0000327 if (!LHS)
Lang Hames09bf4c12015-08-18 18:11:06 +0000328 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000329
Lang Hames09bf4c12015-08-18 18:11:06 +0000330 return ParseBinOpRHS(0, std::move(LHS));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000331}
332
333/// prototype
334/// ::= id '(' id* ')'
Lang Hames09bf4c12015-08-18 18:11:06 +0000335static std::unique_ptr<PrototypeAST> ParsePrototype() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000336 if (CurTok != tok_identifier)
337 return ErrorP("Expected function name in prototype");
338
339 std::string FnName = IdentifierStr;
340 getNextToken();
Eric Christopherc0239362014-12-08 18:12:28 +0000341
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000342 if (CurTok != '(')
343 return ErrorP("Expected '(' in prototype");
Eric Christopherc0239362014-12-08 18:12:28 +0000344
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000345 std::vector<std::string> ArgNames;
346 while (getNextToken() == tok_identifier)
347 ArgNames.push_back(IdentifierStr);
348 if (CurTok != ')')
349 return ErrorP("Expected ')' in prototype");
Eric Christopherc0239362014-12-08 18:12:28 +0000350
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000351 // success.
Eric Christopherc0239362014-12-08 18:12:28 +0000352 getNextToken(); // eat ')'.
353
Lang Hames09bf4c12015-08-18 18:11:06 +0000354 return llvm::make_unique<PrototypeAST>(FnName, std::move(ArgNames));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000355}
356
357/// definition ::= 'def' prototype expression
Lang Hames09bf4c12015-08-18 18:11:06 +0000358static std::unique_ptr<FunctionAST> ParseDefinition() {
Eric Christopherc0239362014-12-08 18:12:28 +0000359 getNextToken(); // eat def.
Lang Hames09bf4c12015-08-18 18:11:06 +0000360 auto Proto = ParsePrototype();
361 if (!Proto)
362 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000363
Lang Hames09bf4c12015-08-18 18:11:06 +0000364 if (auto E = ParseExpression())
365 return llvm::make_unique<FunctionAST>(std::move(Proto), std::move(E));
366 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000367}
368
369/// toplevelexpr ::= expression
Lang Hames09bf4c12015-08-18 18:11:06 +0000370static std::unique_ptr<FunctionAST> ParseTopLevelExpr() {
371 if (auto E = ParseExpression()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000372 // Make an anonymous proto.
Lang Hames2d789c32015-08-26 03:07:41 +0000373 auto Proto = llvm::make_unique<PrototypeAST>("__anon_expr",
374 std::vector<std::string>());
Lang Hames09bf4c12015-08-18 18:11:06 +0000375 return llvm::make_unique<FunctionAST>(std::move(Proto), std::move(E));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000376 }
Lang Hames09bf4c12015-08-18 18:11:06 +0000377 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000378}
379
380/// external ::= 'extern' prototype
Lang Hames09bf4c12015-08-18 18:11:06 +0000381static std::unique_ptr<PrototypeAST> ParseExtern() {
Eric Christopherc0239362014-12-08 18:12:28 +0000382 getNextToken(); // eat extern.
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000383 return ParsePrototype();
384}
385
386//===----------------------------------------------------------------------===//
387// Code Generation
388//===----------------------------------------------------------------------===//
389
Lang Hames2d789c32015-08-26 03:07:41 +0000390static std::unique_ptr<Module> TheModule;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000391static IRBuilder<> Builder(getGlobalContext());
Eric Christopherc0239362014-12-08 18:12:28 +0000392static std::map<std::string, Value *> NamedValues;
Lang Hames2d789c32015-08-26 03:07:41 +0000393static std::unique_ptr<legacy::FunctionPassManager> TheFPM;
394static std::unique_ptr<KaleidoscopeJIT> TheJIT;
395static std::map<std::string, std::unique_ptr<PrototypeAST>> FunctionProtos;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000396
Eric Christopherc0239362014-12-08 18:12:28 +0000397Value *ErrorV(const char *Str) {
398 Error(Str);
Lang Hames09bf4c12015-08-18 18:11:06 +0000399 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000400}
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000401
Lang Hames2d789c32015-08-26 03:07:41 +0000402Function *getFunction(std::string Name) {
403 // First, see if the function has already been added to the current module.
404 if (auto *F = TheModule->getFunction(Name))
405 return F;
406
407 // If not, check whether we can codegen the declaration from some existing
408 // prototype.
409 auto FI = FunctionProtos.find(Name);
410 if (FI != FunctionProtos.end())
411 return FI->second->codegen();
412
413 // If no existing prototype exists, return null.
414 return nullptr;
415}
416
417Value *NumberExprAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000418 return ConstantFP::get(getGlobalContext(), APFloat(Val));
419}
420
Lang Hames2d789c32015-08-26 03:07:41 +0000421Value *VariableExprAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000422 // Look this variable up in the function.
423 Value *V = NamedValues[Name];
Lang Hames596aec92015-08-19 18:32:58 +0000424 if (!V)
425 return ErrorV("Unknown variable name");
426 return V;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000427}
428
Lang Hames2d789c32015-08-26 03:07:41 +0000429Value *BinaryExprAST::codegen() {
430 Value *L = LHS->codegen();
431 Value *R = RHS->codegen();
Lang Hames09bf4c12015-08-18 18:11:06 +0000432 if (!L || !R)
433 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000434
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000435 switch (Op) {
Eric Christopherc0239362014-12-08 18:12:28 +0000436 case '+':
437 return Builder.CreateFAdd(L, R, "addtmp");
438 case '-':
439 return Builder.CreateFSub(L, R, "subtmp");
440 case '*':
441 return Builder.CreateFMul(L, R, "multmp");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000442 case '<':
443 L = Builder.CreateFCmpULT(L, R, "cmptmp");
444 // Convert bool 0/1 to double 0.0 or 1.0
445 return Builder.CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()),
446 "booltmp");
Eric Christopherc0239362014-12-08 18:12:28 +0000447 default:
448 return ErrorV("invalid binary operator");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000449 }
450}
451
Lang Hames2d789c32015-08-26 03:07:41 +0000452Value *CallExprAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000453 // Look up the name in the global module table.
Lang Hames2d789c32015-08-26 03:07:41 +0000454 Function *CalleeF = getFunction(Callee);
Lang Hames09bf4c12015-08-18 18:11:06 +0000455 if (!CalleeF)
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000456 return ErrorV("Unknown function referenced");
Eric Christopherc0239362014-12-08 18:12:28 +0000457
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000458 // If argument mismatch error.
459 if (CalleeF->arg_size() != Args.size())
460 return ErrorV("Incorrect # arguments passed");
461
Eric Christopherc0239362014-12-08 18:12:28 +0000462 std::vector<Value *> ArgsV;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000463 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
Lang Hames2d789c32015-08-26 03:07:41 +0000464 ArgsV.push_back(Args[i]->codegen());
Lang Hames09bf4c12015-08-18 18:11:06 +0000465 if (!ArgsV.back())
466 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000467 }
Eric Christopherc0239362014-12-08 18:12:28 +0000468
Francois Pichetc5d10502011-07-15 10:59:52 +0000469 return Builder.CreateCall(CalleeF, ArgsV, "calltmp");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000470}
471
Lang Hames2d789c32015-08-26 03:07:41 +0000472Function *PrototypeAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000473 // Make the function type: double(double,double) etc.
Eric Christopherc0239362014-12-08 18:12:28 +0000474 std::vector<Type *> Doubles(Args.size(),
475 Type::getDoubleTy(getGlobalContext()));
476 FunctionType *FT =
477 FunctionType::get(Type::getDoubleTy(getGlobalContext()), Doubles, false);
478
Lang Hames2d789c32015-08-26 03:07:41 +0000479 Function *F =
480 Function::Create(FT, Function::ExternalLinkage, Name, TheModule.get());
Eric Christopherc0239362014-12-08 18:12:28 +0000481
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000482 // Set names for all arguments.
483 unsigned Idx = 0;
Lang Hames2d789c32015-08-26 03:07:41 +0000484 for (auto &Arg : F->args())
485 Arg.setName(Args[Idx++]);
Eric Christopherc0239362014-12-08 18:12:28 +0000486
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000487 return F;
488}
489
Lang Hames2d789c32015-08-26 03:07:41 +0000490Function *FunctionAST::codegen() {
491 // Transfer ownership of the prototype to the FunctionProtos map, but keep a
492 // reference to it for use below.
493 auto &P = *Proto;
494 FunctionProtos[Proto->getName()] = std::move(Proto);
495 Function *TheFunction = getFunction(P.getName());
Lang Hames09bf4c12015-08-18 18:11:06 +0000496 if (!TheFunction)
497 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000498
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000499 // Create a new basic block to start insertion into.
500 BasicBlock *BB = BasicBlock::Create(getGlobalContext(), "entry", TheFunction);
501 Builder.SetInsertPoint(BB);
Eric Christopherc0239362014-12-08 18:12:28 +0000502
Lang Hames2d789c32015-08-26 03:07:41 +0000503 // Record the function arguments in the NamedValues map.
504 NamedValues.clear();
505 for (auto &Arg : TheFunction->args())
506 NamedValues[Arg.getName()] = &Arg;
507
508 if (Value *RetVal = Body->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000509 // Finish off the function.
510 Builder.CreateRet(RetVal);
511
512 // Validate the generated code, checking for consistency.
513 verifyFunction(*TheFunction);
514
Lang Hames2d789c32015-08-26 03:07:41 +0000515 // Run the optimizer on the function.
516 TheFPM->run(*TheFunction);
517
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000518 return TheFunction;
519 }
Eric Christopherc0239362014-12-08 18:12:28 +0000520
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000521 // Error reading body, remove function.
522 TheFunction->eraseFromParent();
Lang Hames09bf4c12015-08-18 18:11:06 +0000523 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000524}
525
526//===----------------------------------------------------------------------===//
527// Top-Level parsing and JIT Driver
528//===----------------------------------------------------------------------===//
529
Lang Hames2d789c32015-08-26 03:07:41 +0000530static void InitializeModuleAndPassManager() {
531 // Open a new module.
532 TheModule = llvm::make_unique<Module>("my cool jit", getGlobalContext());
533 TheModule->setDataLayout(TheJIT->getTargetMachine().createDataLayout());
534
535 // Create a new pass manager attached to it.
536 TheFPM = llvm::make_unique<legacy::FunctionPassManager>(TheModule.get());
537
Lang Hames2d789c32015-08-26 03:07:41 +0000538 // Do simple "peephole" optimizations and bit-twiddling optzns.
539 TheFPM->add(createInstructionCombiningPass());
540 // Reassociate expressions.
541 TheFPM->add(createReassociatePass());
542 // Eliminate Common SubExpressions.
543 TheFPM->add(createGVNPass());
544 // Simplify the control flow graph (deleting unreachable blocks, etc).
545 TheFPM->add(createCFGSimplificationPass());
546
547 TheFPM->doInitialization();
548}
549
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000550static void HandleDefinition() {
Lang Hames09bf4c12015-08-18 18:11:06 +0000551 if (auto FnAST = ParseDefinition()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000552 if (auto *FnIR = FnAST->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000553 fprintf(stderr, "Read function definition:");
Lang Hames09bf4c12015-08-18 18:11:06 +0000554 FnIR->dump();
Lang Hames2d789c32015-08-26 03:07:41 +0000555 TheJIT->addModule(std::move(TheModule));
556 InitializeModuleAndPassManager();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000557 }
558 } else {
559 // Skip token for error recovery.
560 getNextToken();
561 }
562}
563
564static void HandleExtern() {
Lang Hames09bf4c12015-08-18 18:11:06 +0000565 if (auto ProtoAST = ParseExtern()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000566 if (auto *FnIR = ProtoAST->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000567 fprintf(stderr, "Read extern: ");
Lang Hames09bf4c12015-08-18 18:11:06 +0000568 FnIR->dump();
Lang Hames2d789c32015-08-26 03:07:41 +0000569 FunctionProtos[ProtoAST->getName()] = std::move(ProtoAST);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000570 }
571 } else {
572 // Skip token for error recovery.
573 getNextToken();
574 }
575}
576
577static void HandleTopLevelExpression() {
578 // Evaluate a top-level expression into an anonymous function.
Lang Hames09bf4c12015-08-18 18:11:06 +0000579 if (auto FnAST = ParseTopLevelExpr()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000580 if (FnAST->codegen()) {
Eric Christopherc0239362014-12-08 18:12:28 +0000581
Lang Hames2d789c32015-08-26 03:07:41 +0000582 // JIT the module containing the anonymous expression, keeping a handle so
583 // we can free it later.
584 auto H = TheJIT->addModule(std::move(TheModule));
585 InitializeModuleAndPassManager();
586
587 // Search the JIT for the __anon_expr symbol.
588 auto ExprSymbol = TheJIT->findSymbol("__anon_expr");
589 assert(ExprSymbol && "Function not found");
590
591 // Get the symbol's address and cast it to the right type (takes no
592 // arguments, returns a double) so we can call it as a native function.
593 double (*FP)() = (double (*)())(intptr_t)ExprSymbol.getAddress();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000594 fprintf(stderr, "Evaluated to %f\n", FP());
Lang Hames2d789c32015-08-26 03:07:41 +0000595
596 // Delete the anonymous expression module from the JIT.
597 TheJIT->removeModule(H);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000598 }
599 } else {
600 // Skip token for error recovery.
601 getNextToken();
602 }
603}
604
605/// top ::= definition | external | expression | ';'
606static void MainLoop() {
607 while (1) {
608 fprintf(stderr, "ready> ");
609 switch (CurTok) {
Eric Christopherc0239362014-12-08 18:12:28 +0000610 case tok_eof:
611 return;
Lang Hames59b0da82015-08-19 18:15:58 +0000612 case ';': // ignore top-level semicolons.
Eric Christopherc0239362014-12-08 18:12:28 +0000613 getNextToken();
Lang Hames59b0da82015-08-19 18:15:58 +0000614 break;
Eric Christopherc0239362014-12-08 18:12:28 +0000615 case tok_def:
616 HandleDefinition();
617 break;
618 case tok_extern:
619 HandleExtern();
620 break;
621 default:
622 HandleTopLevelExpression();
623 break;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000624 }
625 }
626}
627
628//===----------------------------------------------------------------------===//
629// "Library" functions that can be "extern'd" from user code.
630//===----------------------------------------------------------------------===//
631
632/// putchard - putchar that takes a double and returns 0.
NAKAMURA Takumiac9d3732015-08-28 03:34:33 +0000633extern "C" double putchard(double X) {
Lang Hamesd76e0672015-08-27 20:31:44 +0000634 fputc((char)X, stderr);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000635 return 0;
636}
637
Lang Hames59b0da82015-08-19 18:15:58 +0000638/// printd - printf that takes a double prints it as "%f\n", returning 0.
NAKAMURA Takumiac9d3732015-08-28 03:34:33 +0000639extern "C" double printd(double X) {
Lang Hamesd76e0672015-08-27 20:31:44 +0000640 fprintf(stderr, "%f\n", X);
Lang Hames59b0da82015-08-19 18:15:58 +0000641 return 0;
642}
643
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000644//===----------------------------------------------------------------------===//
645// Main driver code.
646//===----------------------------------------------------------------------===//
647
648int main() {
649 InitializeNativeTarget();
Eric Christopher1b74b652014-12-08 18:00:38 +0000650 InitializeNativeTargetAsmPrinter();
651 InitializeNativeTargetAsmParser();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000652
653 // Install standard binary operators.
654 // 1 is lowest precedence.
655 BinopPrecedence['<'] = 10;
656 BinopPrecedence['+'] = 20;
657 BinopPrecedence['-'] = 20;
Eric Christopherc0239362014-12-08 18:12:28 +0000658 BinopPrecedence['*'] = 40; // highest.
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000659
660 // Prime the first token.
661 fprintf(stderr, "ready> ");
662 getNextToken();
663
Lang Hames2d789c32015-08-26 03:07:41 +0000664 TheJIT = llvm::make_unique<KaleidoscopeJIT>();
665
666 InitializeModuleAndPassManager();
667
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000668 // Run the main "interpreter loop" now.
669 MainLoop();
670
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000671 return 0;
672}