blob: 836a2053cbe9f5831d2ef7f474b3be7154cfe8cf [file] [log] [blame]
Eugene Zelenkof981ec42016-05-19 01:08:04 +00001#include "llvm/ADT/APFloat.h"
Lang Hames09bf4c12015-08-18 18:11:06 +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"
Chandler Carruth005f27a2013-01-02 11:56:33 +00007#include "llvm/IR/IRBuilder.h"
8#include "llvm/IR/LLVMContext.h"
Chandler Carruth30d69c22015-02-13 10:01:29 +00009#include "llvm/IR/LegacyPassManager.h"
Chandler Carruth005f27a2013-01-02 11:56:33 +000010#include "llvm/IR/Module.h"
Eugene Zelenkof981ec42016-05-19 01:08:04 +000011#include "llvm/IR/Type.h"
Chandler Carruth20d4e6b2014-01-13 09:58:03 +000012#include "llvm/IR/Verifier.h"
Evan Cheng2bb40352011-08-24 18:08:43 +000013#include "llvm/Support/TargetSelect.h"
Eugene Zelenkof981ec42016-05-19 01:08:04 +000014#include "llvm/Target/TargetMachine.h"
Chandler Carruth605e30e2012-12-04 10:16:57 +000015#include "llvm/Transforms/Scalar.h"
Chandler Carruthec5872b2016-03-11 12:10:15 +000016#include "llvm/Transforms/Scalar/GVN.h"
Eugene Zelenkof981ec42016-05-19 01:08:04 +000017#include "../include/KaleidoscopeJIT.h"
18#include <cassert>
Will Dietz981af002013-10-12 00:55:57 +000019#include <cctype>
Eugene Zelenkof981ec42016-05-19 01:08:04 +000020#include <cstdint>
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000021#include <cstdio>
Eugene Zelenkof981ec42016-05-19 01:08:04 +000022#include <cstdlib>
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000023#include <map>
Eugene Zelenkof981ec42016-05-19 01:08:04 +000024#include <memory>
Chandler Carruth605e30e2012-12-04 10:16:57 +000025#include <string>
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000026#include <vector>
Lang Hames2d789c32015-08-26 03:07:41 +000027
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000028using namespace llvm;
Lang Hames2d789c32015-08-26 03:07:41 +000029using namespace llvm::orc;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000030
31//===----------------------------------------------------------------------===//
32// Lexer
33//===----------------------------------------------------------------------===//
34
35// The lexer returns tokens [0-255] if it is an unknown character, otherwise one
36// of these for known things.
37enum Token {
38 tok_eof = -1,
39
40 // commands
Eric Christopherc0239362014-12-08 18:12:28 +000041 tok_def = -2,
42 tok_extern = -3,
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000043
44 // primary
Eric Christopherc0239362014-12-08 18:12:28 +000045 tok_identifier = -4,
46 tok_number = -5
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000047};
48
Eric Christopherc0239362014-12-08 18:12:28 +000049static std::string IdentifierStr; // Filled in if tok_identifier
50static double NumVal; // Filled in if tok_number
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000051
52/// gettok - Return the next token from standard input.
53static int gettok() {
54 static int LastChar = ' ';
55
56 // Skip any whitespace.
57 while (isspace(LastChar))
58 LastChar = getchar();
59
60 if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
61 IdentifierStr = LastChar;
62 while (isalnum((LastChar = getchar())))
63 IdentifierStr += LastChar;
64
Eric Christopherc0239362014-12-08 18:12:28 +000065 if (IdentifierStr == "def")
66 return tok_def;
67 if (IdentifierStr == "extern")
68 return tok_extern;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000069 return tok_identifier;
70 }
71
Eric Christopherc0239362014-12-08 18:12:28 +000072 if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000073 std::string NumStr;
74 do {
75 NumStr += LastChar;
76 LastChar = getchar();
77 } while (isdigit(LastChar) || LastChar == '.');
78
Hans Wennborgcc9deb42015-09-29 18:02:48 +000079 NumVal = strtod(NumStr.c_str(), nullptr);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000080 return tok_number;
81 }
82
83 if (LastChar == '#') {
84 // Comment until end of line.
Eric Christopherc0239362014-12-08 18:12:28 +000085 do
86 LastChar = getchar();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000087 while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
Eric Christopherc0239362014-12-08 18:12:28 +000088
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000089 if (LastChar != EOF)
90 return gettok();
91 }
Eric Christopherc0239362014-12-08 18:12:28 +000092
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000093 // Check for end of file. Don't eat the EOF.
94 if (LastChar == EOF)
95 return tok_eof;
96
97 // Otherwise, just return the character as its ascii value.
98 int ThisChar = LastChar;
99 LastChar = getchar();
100 return ThisChar;
101}
102
103//===----------------------------------------------------------------------===//
104// Abstract Syntax Tree (aka Parse Tree)
105//===----------------------------------------------------------------------===//
Juergen Ributzka05c5a932013-11-19 03:08:35 +0000106namespace {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000107/// ExprAST - Base class for all expression nodes.
108class ExprAST {
109public:
Juergen Ributzka05c5a932013-11-19 03:08:35 +0000110 virtual ~ExprAST() {}
Lang Hames2d789c32015-08-26 03:07:41 +0000111 virtual Value *codegen() = 0;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000112};
113
114/// NumberExprAST - Expression class for numeric literals like "1.0".
115class NumberExprAST : public ExprAST {
116 double Val;
Lang Hames59b0da82015-08-19 18:15:58 +0000117
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000118public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000119 NumberExprAST(double Val) : Val(Val) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000120 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000121};
122
123/// VariableExprAST - Expression class for referencing a variable, like "a".
124class VariableExprAST : public ExprAST {
125 std::string Name;
Lang Hames59b0da82015-08-19 18:15:58 +0000126
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000127public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000128 VariableExprAST(const std::string &Name) : Name(Name) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000129 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000130};
131
132/// BinaryExprAST - Expression class for a binary operator.
133class BinaryExprAST : public ExprAST {
134 char Op;
Lang Hames09bf4c12015-08-18 18:11:06 +0000135 std::unique_ptr<ExprAST> LHS, RHS;
Lang Hames59b0da82015-08-19 18:15:58 +0000136
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000137public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000138 BinaryExprAST(char Op, std::unique_ptr<ExprAST> LHS,
139 std::unique_ptr<ExprAST> RHS)
140 : Op(Op), LHS(std::move(LHS)), RHS(std::move(RHS)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000141 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000142};
143
144/// CallExprAST - Expression class for function calls.
145class CallExprAST : public ExprAST {
146 std::string Callee;
Lang Hames09bf4c12015-08-18 18:11:06 +0000147 std::vector<std::unique_ptr<ExprAST>> Args;
Lang Hames59b0da82015-08-19 18:15:58 +0000148
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000149public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000150 CallExprAST(const std::string &Callee,
151 std::vector<std::unique_ptr<ExprAST>> Args)
152 : Callee(Callee), Args(std::move(Args)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000153 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000154};
155
156/// PrototypeAST - This class represents the "prototype" for a function,
157/// which captures its name, and its argument names (thus implicitly the number
158/// of arguments the function takes).
159class PrototypeAST {
160 std::string Name;
161 std::vector<std::string> Args;
Lang Hames59b0da82015-08-19 18:15:58 +0000162
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000163public:
Lang Hames59b0da82015-08-19 18:15:58 +0000164 PrototypeAST(const std::string &Name, std::vector<std::string> Args)
165 : Name(Name), Args(std::move(Args)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000166 Function *codegen();
167 const std::string &getName() const { return Name; }
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000168};
169
170/// FunctionAST - This class represents a function definition itself.
171class FunctionAST {
Lang Hames09bf4c12015-08-18 18:11:06 +0000172 std::unique_ptr<PrototypeAST> Proto;
173 std::unique_ptr<ExprAST> Body;
Lang Hames59b0da82015-08-19 18:15:58 +0000174
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000175public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000176 FunctionAST(std::unique_ptr<PrototypeAST> Proto,
177 std::unique_ptr<ExprAST> Body)
Lang Hames59b0da82015-08-19 18:15:58 +0000178 : Proto(std::move(Proto)), Body(std::move(Body)) {}
Lang Hames2d789c32015-08-26 03:07:41 +0000179 Function *codegen();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000180};
Juergen Ributzka05c5a932013-11-19 03:08:35 +0000181} // end anonymous namespace
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000182
183//===----------------------------------------------------------------------===//
184// Parser
185//===----------------------------------------------------------------------===//
186
187/// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
188/// token the parser is looking at. getNextToken reads another token from the
189/// lexer and updates CurTok with its results.
190static int CurTok;
Eric Christopherc0239362014-12-08 18:12:28 +0000191static int getNextToken() { return CurTok = gettok(); }
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000192
193/// BinopPrecedence - This holds the precedence for each binary operator that is
194/// defined.
195static std::map<char, int> BinopPrecedence;
196
197/// GetTokPrecedence - Get the precedence of the pending binary operator token.
198static int GetTokPrecedence() {
199 if (!isascii(CurTok))
200 return -1;
Eric Christopherc0239362014-12-08 18:12:28 +0000201
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000202 // Make sure it's a declared binop.
203 int TokPrec = BinopPrecedence[CurTok];
Eric Christopherc0239362014-12-08 18:12:28 +0000204 if (TokPrec <= 0)
205 return -1;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000206 return TokPrec;
207}
208
Lang Hames5d045a92016-03-25 17:41:26 +0000209/// LogError* - These are little helper functions for error handling.
210std::unique_ptr<ExprAST> LogError(const char *Str) {
Eric Christopherc0239362014-12-08 18:12:28 +0000211 fprintf(stderr, "Error: %s\n", Str);
Lang Hames09bf4c12015-08-18 18:11:06 +0000212 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000213}
Hans Wennborgcc9deb42015-09-29 18:02:48 +0000214
Lang Hames5d045a92016-03-25 17:41:26 +0000215std::unique_ptr<PrototypeAST> LogErrorP(const char *Str) {
216 LogError(Str);
Lang Hames09bf4c12015-08-18 18:11:06 +0000217 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000218}
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000219
Lang Hames09bf4c12015-08-18 18:11:06 +0000220static std::unique_ptr<ExprAST> ParseExpression();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000221
Lang Hames59b0da82015-08-19 18:15:58 +0000222/// numberexpr ::= number
223static std::unique_ptr<ExprAST> ParseNumberExpr() {
224 auto Result = llvm::make_unique<NumberExprAST>(NumVal);
225 getNextToken(); // consume the number
226 return std::move(Result);
227}
228
229/// parenexpr ::= '(' expression ')'
230static std::unique_ptr<ExprAST> ParseParenExpr() {
231 getNextToken(); // eat (.
232 auto V = ParseExpression();
233 if (!V)
234 return nullptr;
235
236 if (CurTok != ')')
Lang Hames5d045a92016-03-25 17:41:26 +0000237 return LogError("expected ')'");
Lang Hames59b0da82015-08-19 18:15:58 +0000238 getNextToken(); // eat ).
239 return V;
240}
241
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000242/// identifierexpr
243/// ::= identifier
244/// ::= identifier '(' expression* ')'
Lang Hames09bf4c12015-08-18 18:11:06 +0000245static std::unique_ptr<ExprAST> ParseIdentifierExpr() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000246 std::string IdName = IdentifierStr;
Eric Christopherc0239362014-12-08 18:12:28 +0000247
248 getNextToken(); // eat identifier.
249
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000250 if (CurTok != '(') // Simple variable ref.
Lang Hames09bf4c12015-08-18 18:11:06 +0000251 return llvm::make_unique<VariableExprAST>(IdName);
Eric Christopherc0239362014-12-08 18:12:28 +0000252
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000253 // Call.
Eric Christopherc0239362014-12-08 18:12:28 +0000254 getNextToken(); // eat (
Lang Hames09bf4c12015-08-18 18:11:06 +0000255 std::vector<std::unique_ptr<ExprAST>> Args;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000256 if (CurTok != ')') {
Eugene Zelenkof981ec42016-05-19 01:08:04 +0000257 while (true) {
Lang Hames09bf4c12015-08-18 18:11:06 +0000258 if (auto Arg = ParseExpression())
259 Args.push_back(std::move(Arg));
260 else
261 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000262
Eric Christopherc0239362014-12-08 18:12:28 +0000263 if (CurTok == ')')
264 break;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000265
266 if (CurTok != ',')
Lang Hames5d045a92016-03-25 17:41:26 +0000267 return LogError("Expected ')' or ',' in argument list");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000268 getNextToken();
269 }
270 }
271
272 // Eat the ')'.
273 getNextToken();
Eric Christopherc0239362014-12-08 18:12:28 +0000274
Lang Hames09bf4c12015-08-18 18:11:06 +0000275 return llvm::make_unique<CallExprAST>(IdName, std::move(Args));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000276}
277
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000278/// primary
279/// ::= identifierexpr
280/// ::= numberexpr
281/// ::= parenexpr
Lang Hames09bf4c12015-08-18 18:11:06 +0000282static std::unique_ptr<ExprAST> ParsePrimary() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000283 switch (CurTok) {
Eric Christopherc0239362014-12-08 18:12:28 +0000284 default:
Lang Hames5d045a92016-03-25 17:41:26 +0000285 return LogError("unknown token when expecting an expression");
Eric Christopherc0239362014-12-08 18:12:28 +0000286 case tok_identifier:
287 return ParseIdentifierExpr();
288 case tok_number:
289 return ParseNumberExpr();
290 case '(':
291 return ParseParenExpr();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000292 }
293}
294
295/// binoprhs
296/// ::= ('+' primary)*
Lang Hames09bf4c12015-08-18 18:11:06 +0000297static std::unique_ptr<ExprAST> ParseBinOpRHS(int ExprPrec,
298 std::unique_ptr<ExprAST> LHS) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000299 // If this is a binop, find its precedence.
Eugene Zelenkof981ec42016-05-19 01:08:04 +0000300 while (true) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000301 int TokPrec = GetTokPrecedence();
Eric Christopherc0239362014-12-08 18:12:28 +0000302
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000303 // If this is a binop that binds at least as tightly as the current binop,
304 // consume it, otherwise we are done.
305 if (TokPrec < ExprPrec)
306 return LHS;
Eric Christopherc0239362014-12-08 18:12:28 +0000307
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000308 // Okay, we know this is a binop.
309 int BinOp = CurTok;
Eric Christopherc0239362014-12-08 18:12:28 +0000310 getNextToken(); // eat binop
311
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000312 // Parse the primary expression after the binary operator.
Lang Hames09bf4c12015-08-18 18:11:06 +0000313 auto RHS = ParsePrimary();
Eric Christopherc0239362014-12-08 18:12:28 +0000314 if (!RHS)
Lang Hames09bf4c12015-08-18 18:11:06 +0000315 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000316
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000317 // If BinOp binds less tightly with RHS than the operator after RHS, let
318 // the pending operator take RHS as its LHS.
319 int NextPrec = GetTokPrecedence();
320 if (TokPrec < NextPrec) {
Lang Hames09bf4c12015-08-18 18:11:06 +0000321 RHS = ParseBinOpRHS(TokPrec + 1, std::move(RHS));
322 if (!RHS)
323 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000324 }
Eric Christopherc0239362014-12-08 18:12:28 +0000325
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000326 // Merge LHS/RHS.
Lang Hames59b0da82015-08-19 18:15:58 +0000327 LHS =
328 llvm::make_unique<BinaryExprAST>(BinOp, std::move(LHS), std::move(RHS));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000329 }
330}
331
332/// expression
333/// ::= primary binoprhs
334///
Lang Hames09bf4c12015-08-18 18:11:06 +0000335static std::unique_ptr<ExprAST> ParseExpression() {
336 auto LHS = ParsePrimary();
Eric Christopherc0239362014-12-08 18:12:28 +0000337 if (!LHS)
Lang Hames09bf4c12015-08-18 18:11:06 +0000338 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000339
Lang Hames09bf4c12015-08-18 18:11:06 +0000340 return ParseBinOpRHS(0, std::move(LHS));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000341}
342
343/// prototype
344/// ::= id '(' id* ')'
Lang Hames09bf4c12015-08-18 18:11:06 +0000345static std::unique_ptr<PrototypeAST> ParsePrototype() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000346 if (CurTok != tok_identifier)
Lang Hames5d045a92016-03-25 17:41:26 +0000347 return LogErrorP("Expected function name in prototype");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000348
349 std::string FnName = IdentifierStr;
350 getNextToken();
Eric Christopherc0239362014-12-08 18:12:28 +0000351
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000352 if (CurTok != '(')
Lang Hames5d045a92016-03-25 17:41:26 +0000353 return LogErrorP("Expected '(' in prototype");
Eric Christopherc0239362014-12-08 18:12:28 +0000354
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000355 std::vector<std::string> ArgNames;
356 while (getNextToken() == tok_identifier)
357 ArgNames.push_back(IdentifierStr);
358 if (CurTok != ')')
Lang Hames5d045a92016-03-25 17:41:26 +0000359 return LogErrorP("Expected ')' in prototype");
Eric Christopherc0239362014-12-08 18:12:28 +0000360
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000361 // success.
Eric Christopherc0239362014-12-08 18:12:28 +0000362 getNextToken(); // eat ')'.
363
Lang Hames09bf4c12015-08-18 18:11:06 +0000364 return llvm::make_unique<PrototypeAST>(FnName, std::move(ArgNames));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000365}
366
367/// definition ::= 'def' prototype expression
Lang Hames09bf4c12015-08-18 18:11:06 +0000368static std::unique_ptr<FunctionAST> ParseDefinition() {
Eric Christopherc0239362014-12-08 18:12:28 +0000369 getNextToken(); // eat def.
Lang Hames09bf4c12015-08-18 18:11:06 +0000370 auto Proto = ParsePrototype();
371 if (!Proto)
372 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000373
Lang Hames09bf4c12015-08-18 18:11:06 +0000374 if (auto E = ParseExpression())
375 return llvm::make_unique<FunctionAST>(std::move(Proto), std::move(E));
376 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000377}
378
379/// toplevelexpr ::= expression
Lang Hames09bf4c12015-08-18 18:11:06 +0000380static std::unique_ptr<FunctionAST> ParseTopLevelExpr() {
381 if (auto E = ParseExpression()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000382 // Make an anonymous proto.
Lang Hames2d789c32015-08-26 03:07:41 +0000383 auto Proto = llvm::make_unique<PrototypeAST>("__anon_expr",
384 std::vector<std::string>());
Lang Hames09bf4c12015-08-18 18:11:06 +0000385 return llvm::make_unique<FunctionAST>(std::move(Proto), std::move(E));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000386 }
Lang Hames09bf4c12015-08-18 18:11:06 +0000387 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000388}
389
390/// external ::= 'extern' prototype
Lang Hames09bf4c12015-08-18 18:11:06 +0000391static std::unique_ptr<PrototypeAST> ParseExtern() {
Eric Christopherc0239362014-12-08 18:12:28 +0000392 getNextToken(); // eat extern.
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000393 return ParsePrototype();
394}
395
396//===----------------------------------------------------------------------===//
397// Code Generation
398//===----------------------------------------------------------------------===//
399
Mehdi Amini03b42e42016-04-14 21:59:01 +0000400static LLVMContext TheContext;
401static IRBuilder<> Builder(TheContext);
Lang Hames24796802016-05-22 22:48:36 +0000402static std::unique_ptr<Module> TheModule;
Eric Christopherc0239362014-12-08 18:12:28 +0000403static std::map<std::string, Value *> NamedValues;
Lang Hames2d789c32015-08-26 03:07:41 +0000404static std::unique_ptr<legacy::FunctionPassManager> TheFPM;
405static std::unique_ptr<KaleidoscopeJIT> TheJIT;
406static std::map<std::string, std::unique_ptr<PrototypeAST>> FunctionProtos;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000407
Lang Hames5d045a92016-03-25 17:41:26 +0000408Value *LogErrorV(const char *Str) {
409 LogError(Str);
Lang Hames09bf4c12015-08-18 18:11:06 +0000410 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000411}
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000412
Lang Hames2d789c32015-08-26 03:07:41 +0000413Function *getFunction(std::string Name) {
414 // First, see if the function has already been added to the current module.
415 if (auto *F = TheModule->getFunction(Name))
416 return F;
417
418 // If not, check whether we can codegen the declaration from some existing
419 // prototype.
420 auto FI = FunctionProtos.find(Name);
421 if (FI != FunctionProtos.end())
422 return FI->second->codegen();
423
424 // If no existing prototype exists, return null.
425 return nullptr;
426}
427
428Value *NumberExprAST::codegen() {
Mehdi Amini03b42e42016-04-14 21:59:01 +0000429 return ConstantFP::get(TheContext, APFloat(Val));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000430}
431
Lang Hames2d789c32015-08-26 03:07:41 +0000432Value *VariableExprAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000433 // Look this variable up in the function.
434 Value *V = NamedValues[Name];
Lang Hames596aec92015-08-19 18:32:58 +0000435 if (!V)
Lang Hames5d045a92016-03-25 17:41:26 +0000436 return LogErrorV("Unknown variable name");
Lang Hames596aec92015-08-19 18:32:58 +0000437 return V;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000438}
439
Lang Hames2d789c32015-08-26 03:07:41 +0000440Value *BinaryExprAST::codegen() {
441 Value *L = LHS->codegen();
442 Value *R = RHS->codegen();
Lang Hames09bf4c12015-08-18 18:11:06 +0000443 if (!L || !R)
444 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000445
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000446 switch (Op) {
Eric Christopherc0239362014-12-08 18:12:28 +0000447 case '+':
448 return Builder.CreateFAdd(L, R, "addtmp");
449 case '-':
450 return Builder.CreateFSub(L, R, "subtmp");
451 case '*':
452 return Builder.CreateFMul(L, R, "multmp");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000453 case '<':
454 L = Builder.CreateFCmpULT(L, R, "cmptmp");
455 // Convert bool 0/1 to double 0.0 or 1.0
Mehdi Amini03b42e42016-04-14 21:59:01 +0000456 return Builder.CreateUIToFP(L, Type::getDoubleTy(TheContext), "booltmp");
Eric Christopherc0239362014-12-08 18:12:28 +0000457 default:
Lang Hames5d045a92016-03-25 17:41:26 +0000458 return LogErrorV("invalid binary operator");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000459 }
460}
461
Lang Hames2d789c32015-08-26 03:07:41 +0000462Value *CallExprAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000463 // Look up the name in the global module table.
Lang Hames2d789c32015-08-26 03:07:41 +0000464 Function *CalleeF = getFunction(Callee);
Lang Hames09bf4c12015-08-18 18:11:06 +0000465 if (!CalleeF)
Lang Hames5d045a92016-03-25 17:41:26 +0000466 return LogErrorV("Unknown function referenced");
Eric Christopherc0239362014-12-08 18:12:28 +0000467
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000468 // If argument mismatch error.
469 if (CalleeF->arg_size() != Args.size())
Lang Hames5d045a92016-03-25 17:41:26 +0000470 return LogErrorV("Incorrect # arguments passed");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000471
Eric Christopherc0239362014-12-08 18:12:28 +0000472 std::vector<Value *> ArgsV;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000473 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
Lang Hames2d789c32015-08-26 03:07:41 +0000474 ArgsV.push_back(Args[i]->codegen());
Lang Hames09bf4c12015-08-18 18:11:06 +0000475 if (!ArgsV.back())
476 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000477 }
Eric Christopherc0239362014-12-08 18:12:28 +0000478
Francois Pichetc5d10502011-07-15 10:59:52 +0000479 return Builder.CreateCall(CalleeF, ArgsV, "calltmp");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000480}
481
Lang Hames2d789c32015-08-26 03:07:41 +0000482Function *PrototypeAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000483 // Make the function type: double(double,double) etc.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000484 std::vector<Type *> Doubles(Args.size(), Type::getDoubleTy(TheContext));
Eric Christopherc0239362014-12-08 18:12:28 +0000485 FunctionType *FT =
Mehdi Amini03b42e42016-04-14 21:59:01 +0000486 FunctionType::get(Type::getDoubleTy(TheContext), Doubles, false);
Eric Christopherc0239362014-12-08 18:12:28 +0000487
Lang Hames2d789c32015-08-26 03:07:41 +0000488 Function *F =
489 Function::Create(FT, Function::ExternalLinkage, Name, TheModule.get());
Eric Christopherc0239362014-12-08 18:12:28 +0000490
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000491 // Set names for all arguments.
492 unsigned Idx = 0;
Lang Hames2d789c32015-08-26 03:07:41 +0000493 for (auto &Arg : F->args())
494 Arg.setName(Args[Idx++]);
Eric Christopherc0239362014-12-08 18:12:28 +0000495
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000496 return F;
497}
498
Lang Hames2d789c32015-08-26 03:07:41 +0000499Function *FunctionAST::codegen() {
500 // Transfer ownership of the prototype to the FunctionProtos map, but keep a
501 // reference to it for use below.
502 auto &P = *Proto;
503 FunctionProtos[Proto->getName()] = std::move(Proto);
504 Function *TheFunction = getFunction(P.getName());
Lang Hames09bf4c12015-08-18 18:11:06 +0000505 if (!TheFunction)
506 return nullptr;
Eric Christopherc0239362014-12-08 18:12:28 +0000507
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000508 // Create a new basic block to start insertion into.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000509 BasicBlock *BB = BasicBlock::Create(TheContext, "entry", TheFunction);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000510 Builder.SetInsertPoint(BB);
Eric Christopherc0239362014-12-08 18:12:28 +0000511
Lang Hames2d789c32015-08-26 03:07:41 +0000512 // Record the function arguments in the NamedValues map.
513 NamedValues.clear();
514 for (auto &Arg : TheFunction->args())
515 NamedValues[Arg.getName()] = &Arg;
516
517 if (Value *RetVal = Body->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000518 // Finish off the function.
519 Builder.CreateRet(RetVal);
520
521 // Validate the generated code, checking for consistency.
522 verifyFunction(*TheFunction);
523
Lang Hames2d789c32015-08-26 03:07:41 +0000524 // Run the optimizer on the function.
525 TheFPM->run(*TheFunction);
526
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000527 return TheFunction;
528 }
Eric Christopherc0239362014-12-08 18:12:28 +0000529
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000530 // Error reading body, remove function.
531 TheFunction->eraseFromParent();
Lang Hames09bf4c12015-08-18 18:11:06 +0000532 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000533}
534
535//===----------------------------------------------------------------------===//
536// Top-Level parsing and JIT Driver
537//===----------------------------------------------------------------------===//
538
Lang Hames2d789c32015-08-26 03:07:41 +0000539static void InitializeModuleAndPassManager() {
540 // Open a new module.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000541 TheModule = llvm::make_unique<Module>("my cool jit", TheContext);
Lang Hames2d789c32015-08-26 03:07:41 +0000542 TheModule->setDataLayout(TheJIT->getTargetMachine().createDataLayout());
543
544 // Create a new pass manager attached to it.
545 TheFPM = llvm::make_unique<legacy::FunctionPassManager>(TheModule.get());
546
Lang Hames2d789c32015-08-26 03:07:41 +0000547 // Do simple "peephole" optimizations and bit-twiddling optzns.
548 TheFPM->add(createInstructionCombiningPass());
549 // Reassociate expressions.
550 TheFPM->add(createReassociatePass());
551 // Eliminate Common SubExpressions.
552 TheFPM->add(createGVNPass());
553 // Simplify the control flow graph (deleting unreachable blocks, etc).
554 TheFPM->add(createCFGSimplificationPass());
555
556 TheFPM->doInitialization();
557}
558
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000559static void HandleDefinition() {
Lang Hames09bf4c12015-08-18 18:11:06 +0000560 if (auto FnAST = ParseDefinition()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000561 if (auto *FnIR = FnAST->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000562 fprintf(stderr, "Read function definition:");
Lang Hames09bf4c12015-08-18 18:11:06 +0000563 FnIR->dump();
Lang Hames2d789c32015-08-26 03:07:41 +0000564 TheJIT->addModule(std::move(TheModule));
565 InitializeModuleAndPassManager();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000566 }
567 } else {
568 // Skip token for error recovery.
569 getNextToken();
570 }
571}
572
573static void HandleExtern() {
Lang Hames09bf4c12015-08-18 18:11:06 +0000574 if (auto ProtoAST = ParseExtern()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000575 if (auto *FnIR = ProtoAST->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000576 fprintf(stderr, "Read extern: ");
Lang Hames09bf4c12015-08-18 18:11:06 +0000577 FnIR->dump();
Lang Hames2d789c32015-08-26 03:07:41 +0000578 FunctionProtos[ProtoAST->getName()] = std::move(ProtoAST);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000579 }
580 } else {
581 // Skip token for error recovery.
582 getNextToken();
583 }
584}
585
586static void HandleTopLevelExpression() {
587 // Evaluate a top-level expression into an anonymous function.
Lang Hames09bf4c12015-08-18 18:11:06 +0000588 if (auto FnAST = ParseTopLevelExpr()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000589 if (FnAST->codegen()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000590 // JIT the module containing the anonymous expression, keeping a handle so
591 // we can free it later.
592 auto H = TheJIT->addModule(std::move(TheModule));
593 InitializeModuleAndPassManager();
594
595 // Search the JIT for the __anon_expr symbol.
596 auto ExprSymbol = TheJIT->findSymbol("__anon_expr");
597 assert(ExprSymbol && "Function not found");
598
599 // Get the symbol's address and cast it to the right type (takes no
600 // arguments, returns a double) so we can call it as a native function.
601 double (*FP)() = (double (*)())(intptr_t)ExprSymbol.getAddress();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000602 fprintf(stderr, "Evaluated to %f\n", FP());
Lang Hames2d789c32015-08-26 03:07:41 +0000603
604 // Delete the anonymous expression module from the JIT.
605 TheJIT->removeModule(H);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000606 }
607 } else {
608 // Skip token for error recovery.
609 getNextToken();
610 }
611}
612
613/// top ::= definition | external | expression | ';'
614static void MainLoop() {
Eugene Zelenkof981ec42016-05-19 01:08:04 +0000615 while (true) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000616 fprintf(stderr, "ready> ");
617 switch (CurTok) {
Eric Christopherc0239362014-12-08 18:12:28 +0000618 case tok_eof:
619 return;
Lang Hames59b0da82015-08-19 18:15:58 +0000620 case ';': // ignore top-level semicolons.
Eric Christopherc0239362014-12-08 18:12:28 +0000621 getNextToken();
Lang Hames59b0da82015-08-19 18:15:58 +0000622 break;
Eric Christopherc0239362014-12-08 18:12:28 +0000623 case tok_def:
624 HandleDefinition();
625 break;
626 case tok_extern:
627 HandleExtern();
628 break;
629 default:
630 HandleTopLevelExpression();
631 break;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000632 }
633 }
634}
635
636//===----------------------------------------------------------------------===//
637// "Library" functions that can be "extern'd" from user code.
638//===----------------------------------------------------------------------===//
639
640/// putchard - putchar that takes a double and returns 0.
NAKAMURA Takumiac9d3732015-08-28 03:34:33 +0000641extern "C" double putchard(double X) {
Lang Hamesd76e0672015-08-27 20:31:44 +0000642 fputc((char)X, stderr);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000643 return 0;
644}
645
Lang Hames59b0da82015-08-19 18:15:58 +0000646/// printd - printf that takes a double prints it as "%f\n", returning 0.
NAKAMURA Takumiac9d3732015-08-28 03:34:33 +0000647extern "C" double printd(double X) {
Lang Hamesd76e0672015-08-27 20:31:44 +0000648 fprintf(stderr, "%f\n", X);
Lang Hames59b0da82015-08-19 18:15:58 +0000649 return 0;
650}
651
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000652//===----------------------------------------------------------------------===//
653// Main driver code.
654//===----------------------------------------------------------------------===//
655
656int main() {
657 InitializeNativeTarget();
Eric Christopher1b74b652014-12-08 18:00:38 +0000658 InitializeNativeTargetAsmPrinter();
659 InitializeNativeTargetAsmParser();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000660
661 // Install standard binary operators.
662 // 1 is lowest precedence.
663 BinopPrecedence['<'] = 10;
664 BinopPrecedence['+'] = 20;
665 BinopPrecedence['-'] = 20;
Eric Christopherc0239362014-12-08 18:12:28 +0000666 BinopPrecedence['*'] = 40; // highest.
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000667
668 // Prime the first token.
669 fprintf(stderr, "ready> ");
670 getNextToken();
671
Lang Hames2d789c32015-08-26 03:07:41 +0000672 TheJIT = llvm::make_unique<KaleidoscopeJIT>();
673
674 InitializeModuleAndPassManager();
675
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000676 // Run the main "interpreter loop" now.
677 MainLoop();
678
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000679 return 0;
680}