blob: 8aad3f4d7bec35bde8dbd24f0892aeddf9e696e8 [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"
9#include "llvm/IR/Module.h"
Eugene Zelenkof981ec42016-05-19 01:08:04 +000010#include "llvm/IR/Type.h"
Lang Hames2d789c32015-08-26 03:07:41 +000011#include "llvm/IR/Verifier.h"
Eugene Zelenkoae7ac952016-11-18 21:57:58 +000012#include <algorithm>
Will Dietz981af002013-10-12 00:55:57 +000013#include <cctype>
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000014#include <cstdio>
Eugene Zelenkof981ec42016-05-19 01:08:04 +000015#include <cstdlib>
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000016#include <map>
Eugene Zelenkof981ec42016-05-19 01:08:04 +000017#include <memory>
Chandler Carruth605e30e2012-12-04 10:16:57 +000018#include <string>
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000019#include <vector>
Hans Wennborgcc9deb42015-09-29 18:02:48 +000020
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000021using namespace llvm;
22
23//===----------------------------------------------------------------------===//
24// Lexer
25//===----------------------------------------------------------------------===//
26
27// The lexer returns tokens [0-255] if it is an unknown character, otherwise one
28// of these for known things.
29enum Token {
30 tok_eof = -1,
31
32 // commands
Lang Hames59b0da82015-08-19 18:15:58 +000033 tok_def = -2,
34 tok_extern = -3,
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000035
36 // primary
Lang Hames59b0da82015-08-19 18:15:58 +000037 tok_identifier = -4,
38 tok_number = -5
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000039};
40
Lang Hames59b0da82015-08-19 18:15:58 +000041static std::string IdentifierStr; // Filled in if tok_identifier
42static double NumVal; // Filled in if tok_number
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000043
44/// gettok - Return the next token from standard input.
45static int gettok() {
46 static int LastChar = ' ';
47
48 // Skip any whitespace.
49 while (isspace(LastChar))
50 LastChar = getchar();
51
52 if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
53 IdentifierStr = LastChar;
54 while (isalnum((LastChar = getchar())))
55 IdentifierStr += LastChar;
56
Lang Hames59b0da82015-08-19 18:15:58 +000057 if (IdentifierStr == "def")
58 return tok_def;
59 if (IdentifierStr == "extern")
60 return tok_extern;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000061 return tok_identifier;
62 }
63
Lang Hames59b0da82015-08-19 18:15:58 +000064 if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000065 std::string NumStr;
66 do {
67 NumStr += LastChar;
68 LastChar = getchar();
69 } while (isdigit(LastChar) || LastChar == '.');
70
Hans Wennborgcc9deb42015-09-29 18:02:48 +000071 NumVal = strtod(NumStr.c_str(), nullptr);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000072 return tok_number;
73 }
74
75 if (LastChar == '#') {
76 // Comment until end of line.
Lang Hames59b0da82015-08-19 18:15:58 +000077 do
78 LastChar = getchar();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000079 while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
Lang Hames59b0da82015-08-19 18:15:58 +000080
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000081 if (LastChar != EOF)
82 return gettok();
83 }
Lang Hames59b0da82015-08-19 18:15:58 +000084
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +000085 // Check for end of file. Don't eat the EOF.
86 if (LastChar == EOF)
87 return tok_eof;
88
89 // Otherwise, just return the character as its ascii value.
90 int ThisChar = LastChar;
91 LastChar = getchar();
92 return ThisChar;
93}
94
95//===----------------------------------------------------------------------===//
96// Abstract Syntax Tree (aka Parse Tree)
97//===----------------------------------------------------------------------===//
Eugene Zelenkoae7ac952016-11-18 21:57:58 +000098
Juergen Ributzka05c5a932013-11-19 03:08:35 +000099namespace {
Eugene Zelenkoae7ac952016-11-18 21:57:58 +0000100
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000101/// ExprAST - Base class for all expression nodes.
102class ExprAST {
103public:
Eugene Zelenkoae7ac952016-11-18 21:57:58 +0000104 virtual ~ExprAST() = default;
105
Lang Hames2d789c32015-08-26 03:07:41 +0000106 virtual Value *codegen() = 0;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000107};
108
109/// NumberExprAST - Expression class for numeric literals like "1.0".
110class NumberExprAST : public ExprAST {
111 double Val;
Lang Hames59b0da82015-08-19 18:15:58 +0000112
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000113public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000114 NumberExprAST(double Val) : Val(Val) {}
Eugene Zelenkoae7ac952016-11-18 21:57:58 +0000115
Lang Hames2d789c32015-08-26 03:07:41 +0000116 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000117};
118
119/// VariableExprAST - Expression class for referencing a variable, like "a".
120class VariableExprAST : public ExprAST {
121 std::string Name;
Lang Hames59b0da82015-08-19 18:15:58 +0000122
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000123public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000124 VariableExprAST(const std::string &Name) : Name(Name) {}
Eugene Zelenkoae7ac952016-11-18 21:57:58 +0000125
Lang Hames2d789c32015-08-26 03:07:41 +0000126 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000127};
128
129/// BinaryExprAST - Expression class for a binary operator.
130class BinaryExprAST : public ExprAST {
131 char Op;
Lang Hames09bf4c12015-08-18 18:11:06 +0000132 std::unique_ptr<ExprAST> LHS, RHS;
Lang Hames59b0da82015-08-19 18:15:58 +0000133
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000134public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000135 BinaryExprAST(char Op, std::unique_ptr<ExprAST> LHS,
136 std::unique_ptr<ExprAST> RHS)
Lang Hames59b0da82015-08-19 18:15:58 +0000137 : Op(Op), LHS(std::move(LHS)), RHS(std::move(RHS)) {}
Eugene Zelenkoae7ac952016-11-18 21:57:58 +0000138
Lang Hames2d789c32015-08-26 03:07:41 +0000139 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000140};
141
142/// CallExprAST - Expression class for function calls.
143class CallExprAST : public ExprAST {
144 std::string Callee;
Lang Hames09bf4c12015-08-18 18:11:06 +0000145 std::vector<std::unique_ptr<ExprAST>> Args;
Lang Hames59b0da82015-08-19 18:15:58 +0000146
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000147public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000148 CallExprAST(const std::string &Callee,
149 std::vector<std::unique_ptr<ExprAST>> Args)
Lang Hames59b0da82015-08-19 18:15:58 +0000150 : Callee(Callee), Args(std::move(Args)) {}
Eugene Zelenkoae7ac952016-11-18 21:57:58 +0000151
Lang Hames2d789c32015-08-26 03:07:41 +0000152 Value *codegen() override;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000153};
154
155/// PrototypeAST - This class represents the "prototype" for a function,
156/// which captures its name, and its argument names (thus implicitly the number
157/// of arguments the function takes).
158class PrototypeAST {
159 std::string Name;
160 std::vector<std::string> Args;
Lang Hames59b0da82015-08-19 18:15:58 +0000161
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000162public:
Lang Hames09bf4c12015-08-18 18:11:06 +0000163 PrototypeAST(const std::string &Name, std::vector<std::string> Args)
Lang Hames59b0da82015-08-19 18:15:58 +0000164 : Name(Name), Args(std::move(Args)) {}
Eugene Zelenkoae7ac952016-11-18 21:57:58 +0000165
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)) {}
Eugene Zelenkoae7ac952016-11-18 21:57:58 +0000179
Lang Hames2d789c32015-08-26 03:07:41 +0000180 Function *codegen();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000181};
Eugene Zelenkoae7ac952016-11-18 21:57:58 +0000182
Juergen Ributzka05c5a932013-11-19 03:08:35 +0000183} // end anonymous namespace
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000184
185//===----------------------------------------------------------------------===//
186// Parser
187//===----------------------------------------------------------------------===//
188
189/// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
190/// token the parser is looking at. getNextToken reads another token from the
191/// lexer and updates CurTok with its results.
192static int CurTok;
Lang Hames59b0da82015-08-19 18:15:58 +0000193static int getNextToken() { return CurTok = gettok(); }
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000194
195/// BinopPrecedence - This holds the precedence for each binary operator that is
196/// defined.
197static std::map<char, int> BinopPrecedence;
198
199/// GetTokPrecedence - Get the precedence of the pending binary operator token.
200static int GetTokPrecedence() {
201 if (!isascii(CurTok))
202 return -1;
Lang Hames59b0da82015-08-19 18:15:58 +0000203
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000204 // Make sure it's a declared binop.
205 int TokPrec = BinopPrecedence[CurTok];
Lang Hames59b0da82015-08-19 18:15:58 +0000206 if (TokPrec <= 0)
207 return -1;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000208 return TokPrec;
209}
210
Lang Hames5d045a92016-03-25 17:41:26 +0000211/// LogError* - These are little helper functions for error handling.
212std::unique_ptr<ExprAST> LogError(const char *Str) {
Lang Hames09bf4c12015-08-18 18:11:06 +0000213 fprintf(stderr, "Error: %s\n", Str);
214 return nullptr;
215}
Hans Wennborgcc9deb42015-09-29 18:02:48 +0000216
Lang Hames5d045a92016-03-25 17:41:26 +0000217std::unique_ptr<PrototypeAST> LogErrorP(const char *Str) {
218 LogError(Str);
Lang Hames09bf4c12015-08-18 18:11:06 +0000219 return nullptr;
220}
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000221
Lang Hames09bf4c12015-08-18 18:11:06 +0000222static std::unique_ptr<ExprAST> ParseExpression();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000223
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000224/// numberexpr ::= number
Lang Hames09bf4c12015-08-18 18:11:06 +0000225static std::unique_ptr<ExprAST> ParseNumberExpr() {
226 auto Result = llvm::make_unique<NumberExprAST>(NumVal);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000227 getNextToken(); // consume the number
Lang Hames09bf4c12015-08-18 18:11:06 +0000228 return std::move(Result);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000229}
230
231/// parenexpr ::= '(' expression ')'
Lang Hames09bf4c12015-08-18 18:11:06 +0000232static std::unique_ptr<ExprAST> ParseParenExpr() {
Lang Hames59b0da82015-08-19 18:15:58 +0000233 getNextToken(); // eat (.
Lang Hames09bf4c12015-08-18 18:11:06 +0000234 auto V = ParseExpression();
235 if (!V)
236 return nullptr;
Lang Hames59b0da82015-08-19 18:15:58 +0000237
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000238 if (CurTok != ')')
Lang Hames5d045a92016-03-25 17:41:26 +0000239 return LogError("expected ')'");
Lang Hames59b0da82015-08-19 18:15:58 +0000240 getNextToken(); // eat ).
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000241 return V;
242}
243
Lang Hames59b0da82015-08-19 18:15:58 +0000244/// identifierexpr
245/// ::= identifier
246/// ::= identifier '(' expression* ')'
247static std::unique_ptr<ExprAST> ParseIdentifierExpr() {
248 std::string IdName = IdentifierStr;
249
250 getNextToken(); // eat identifier.
251
252 if (CurTok != '(') // Simple variable ref.
253 return llvm::make_unique<VariableExprAST>(IdName);
254
255 // Call.
256 getNextToken(); // eat (
257 std::vector<std::unique_ptr<ExprAST>> Args;
258 if (CurTok != ')') {
Eugene Zelenkof981ec42016-05-19 01:08:04 +0000259 while (true) {
Lang Hames59b0da82015-08-19 18:15:58 +0000260 if (auto Arg = ParseExpression())
261 Args.push_back(std::move(Arg));
262 else
263 return nullptr;
264
265 if (CurTok == ')')
266 break;
267
268 if (CurTok != ',')
Lang Hames5d045a92016-03-25 17:41:26 +0000269 return LogError("Expected ')' or ',' in argument list");
Lang Hames59b0da82015-08-19 18:15:58 +0000270 getNextToken();
271 }
272 }
273
274 // Eat the ')'.
275 getNextToken();
276
277 return llvm::make_unique<CallExprAST>(IdName, std::move(Args));
278}
279
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000280/// primary
281/// ::= identifierexpr
282/// ::= numberexpr
283/// ::= parenexpr
Lang Hames09bf4c12015-08-18 18:11:06 +0000284static std::unique_ptr<ExprAST> ParsePrimary() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000285 switch (CurTok) {
Lang Hames59b0da82015-08-19 18:15:58 +0000286 default:
Lang Hames5d045a92016-03-25 17:41:26 +0000287 return LogError("unknown token when expecting an expression");
Lang Hames59b0da82015-08-19 18:15:58 +0000288 case tok_identifier:
289 return ParseIdentifierExpr();
290 case tok_number:
291 return ParseNumberExpr();
292 case '(':
293 return ParseParenExpr();
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000294 }
295}
296
297/// binoprhs
298/// ::= ('+' primary)*
Lang Hames09bf4c12015-08-18 18:11:06 +0000299static std::unique_ptr<ExprAST> ParseBinOpRHS(int ExprPrec,
300 std::unique_ptr<ExprAST> LHS) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000301 // If this is a binop, find its precedence.
Eugene Zelenkof981ec42016-05-19 01:08:04 +0000302 while (true) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000303 int TokPrec = GetTokPrecedence();
Lang Hames59b0da82015-08-19 18:15:58 +0000304
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000305 // If this is a binop that binds at least as tightly as the current binop,
306 // consume it, otherwise we are done.
307 if (TokPrec < ExprPrec)
308 return LHS;
Lang Hames59b0da82015-08-19 18:15:58 +0000309
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000310 // Okay, we know this is a binop.
311 int BinOp = CurTok;
Lang Hames59b0da82015-08-19 18:15:58 +0000312 getNextToken(); // eat binop
313
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000314 // Parse the primary expression after the binary operator.
Lang Hames09bf4c12015-08-18 18:11:06 +0000315 auto RHS = ParsePrimary();
Lang Hames59b0da82015-08-19 18:15:58 +0000316 if (!RHS)
317 return nullptr;
318
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000319 // If BinOp binds less tightly with RHS than the operator after RHS, let
320 // the pending operator take RHS as its LHS.
321 int NextPrec = GetTokPrecedence();
322 if (TokPrec < NextPrec) {
Lang Hames59b0da82015-08-19 18:15:58 +0000323 RHS = ParseBinOpRHS(TokPrec + 1, std::move(RHS));
324 if (!RHS)
325 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000326 }
Lang Hames59b0da82015-08-19 18:15:58 +0000327
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000328 // Merge LHS/RHS.
Lang Hames59b0da82015-08-19 18:15:58 +0000329 LHS =
330 llvm::make_unique<BinaryExprAST>(BinOp, std::move(LHS), std::move(RHS));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000331 }
332}
333
334/// expression
335/// ::= primary binoprhs
336///
Lang Hames09bf4c12015-08-18 18:11:06 +0000337static std::unique_ptr<ExprAST> ParseExpression() {
338 auto LHS = ParsePrimary();
Lang Hames59b0da82015-08-19 18:15:58 +0000339 if (!LHS)
340 return nullptr;
341
Lang Hames09bf4c12015-08-18 18:11:06 +0000342 return ParseBinOpRHS(0, std::move(LHS));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000343}
344
345/// prototype
346/// ::= id '(' id* ')'
Lang Hames09bf4c12015-08-18 18:11:06 +0000347static std::unique_ptr<PrototypeAST> ParsePrototype() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000348 if (CurTok != tok_identifier)
Lang Hames5d045a92016-03-25 17:41:26 +0000349 return LogErrorP("Expected function name in prototype");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000350
351 std::string FnName = IdentifierStr;
352 getNextToken();
Lang Hames59b0da82015-08-19 18:15:58 +0000353
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000354 if (CurTok != '(')
Lang Hames5d045a92016-03-25 17:41:26 +0000355 return LogErrorP("Expected '(' in prototype");
Lang Hames59b0da82015-08-19 18:15:58 +0000356
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000357 std::vector<std::string> ArgNames;
358 while (getNextToken() == tok_identifier)
359 ArgNames.push_back(IdentifierStr);
360 if (CurTok != ')')
Lang Hames5d045a92016-03-25 17:41:26 +0000361 return LogErrorP("Expected ')' in prototype");
Lang Hames59b0da82015-08-19 18:15:58 +0000362
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000363 // success.
Lang Hames59b0da82015-08-19 18:15:58 +0000364 getNextToken(); // eat ')'.
365
366 return llvm::make_unique<PrototypeAST>(FnName, std::move(ArgNames));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000367}
368
369/// definition ::= 'def' prototype expression
Lang Hames09bf4c12015-08-18 18:11:06 +0000370static std::unique_ptr<FunctionAST> ParseDefinition() {
Lang Hames59b0da82015-08-19 18:15:58 +0000371 getNextToken(); // eat def.
Lang Hames09bf4c12015-08-18 18:11:06 +0000372 auto Proto = ParsePrototype();
Lang Hames59b0da82015-08-19 18:15:58 +0000373 if (!Proto)
374 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000375
Lang Hames09bf4c12015-08-18 18:11:06 +0000376 if (auto E = ParseExpression())
377 return llvm::make_unique<FunctionAST>(std::move(Proto), std::move(E));
378 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000379}
380
381/// toplevelexpr ::= expression
Lang Hames09bf4c12015-08-18 18:11:06 +0000382static std::unique_ptr<FunctionAST> ParseTopLevelExpr() {
383 if (auto E = ParseExpression()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000384 // Make an anonymous proto.
Lang Hames2d789c32015-08-26 03:07:41 +0000385 auto Proto = llvm::make_unique<PrototypeAST>("__anon_expr",
386 std::vector<std::string>());
Lang Hames09bf4c12015-08-18 18:11:06 +0000387 return llvm::make_unique<FunctionAST>(std::move(Proto), std::move(E));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000388 }
Lang Hames09bf4c12015-08-18 18:11:06 +0000389 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000390}
391
392/// external ::= 'extern' prototype
Lang Hames09bf4c12015-08-18 18:11:06 +0000393static std::unique_ptr<PrototypeAST> ParseExtern() {
Lang Hames59b0da82015-08-19 18:15:58 +0000394 getNextToken(); // eat extern.
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000395 return ParsePrototype();
396}
397
398//===----------------------------------------------------------------------===//
399// Code Generation
400//===----------------------------------------------------------------------===//
401
Mehdi Amini03b42e42016-04-14 21:59:01 +0000402static LLVMContext TheContext;
403static IRBuilder<> Builder(TheContext);
Lang Hames24796802016-05-22 22:48:36 +0000404static std::unique_ptr<Module> TheModule;
Lang Hames2d789c32015-08-26 03:07:41 +0000405static std::map<std::string, Value *> NamedValues;
406
Lang Hames5d045a92016-03-25 17:41:26 +0000407Value *LogErrorV(const char *Str) {
408 LogError(Str);
Lang Hames59b0da82015-08-19 18:15:58 +0000409 return nullptr;
410}
411
Lang Hames2d789c32015-08-26 03:07:41 +0000412Value *NumberExprAST::codegen() {
Mehdi Amini03b42e42016-04-14 21:59:01 +0000413 return ConstantFP::get(TheContext, APFloat(Val));
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000414}
415
Lang Hames2d789c32015-08-26 03:07:41 +0000416Value *VariableExprAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000417 // Look this variable up in the function.
418 Value *V = NamedValues[Name];
Lang Hames596aec92015-08-19 18:32:58 +0000419 if (!V)
Lang Hames5d045a92016-03-25 17:41:26 +0000420 return LogErrorV("Unknown variable name");
Lang Hames596aec92015-08-19 18:32:58 +0000421 return V;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000422}
423
Lang Hames2d789c32015-08-26 03:07:41 +0000424Value *BinaryExprAST::codegen() {
425 Value *L = LHS->codegen();
426 Value *R = RHS->codegen();
Lang Hames59b0da82015-08-19 18:15:58 +0000427 if (!L || !R)
428 return nullptr;
429
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000430 switch (Op) {
Lang Hames59b0da82015-08-19 18:15:58 +0000431 case '+':
432 return Builder.CreateFAdd(L, R, "addtmp");
433 case '-':
434 return Builder.CreateFSub(L, R, "subtmp");
435 case '*':
436 return Builder.CreateFMul(L, R, "multmp");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000437 case '<':
438 L = Builder.CreateFCmpULT(L, R, "cmptmp");
439 // Convert bool 0/1 to double 0.0 or 1.0
Mehdi Amini03b42e42016-04-14 21:59:01 +0000440 return Builder.CreateUIToFP(L, Type::getDoubleTy(TheContext), "booltmp");
Lang Hames59b0da82015-08-19 18:15:58 +0000441 default:
Lang Hames5d045a92016-03-25 17:41:26 +0000442 return LogErrorV("invalid binary operator");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000443 }
444}
445
Lang Hames2d789c32015-08-26 03:07:41 +0000446Value *CallExprAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000447 // Look up the name in the global module table.
448 Function *CalleeF = TheModule->getFunction(Callee);
Lang Hames09bf4c12015-08-18 18:11:06 +0000449 if (!CalleeF)
Lang Hames5d045a92016-03-25 17:41:26 +0000450 return LogErrorV("Unknown function referenced");
Lang Hames59b0da82015-08-19 18:15:58 +0000451
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000452 // If argument mismatch error.
453 if (CalleeF->arg_size() != Args.size())
Lang Hames5d045a92016-03-25 17:41:26 +0000454 return LogErrorV("Incorrect # arguments passed");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000455
Lang Hames59b0da82015-08-19 18:15:58 +0000456 std::vector<Value *> ArgsV;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000457 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
Lang Hames2d789c32015-08-26 03:07:41 +0000458 ArgsV.push_back(Args[i]->codegen());
Lang Hames59b0da82015-08-19 18:15:58 +0000459 if (!ArgsV.back())
460 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000461 }
Lang Hames59b0da82015-08-19 18:15:58 +0000462
Francois Pichetc5d10502011-07-15 10:59:52 +0000463 return Builder.CreateCall(CalleeF, ArgsV, "calltmp");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000464}
465
Lang Hames2d789c32015-08-26 03:07:41 +0000466Function *PrototypeAST::codegen() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000467 // Make the function type: double(double,double) etc.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000468 std::vector<Type *> Doubles(Args.size(), Type::getDoubleTy(TheContext));
Lang Hames59b0da82015-08-19 18:15:58 +0000469 FunctionType *FT =
Mehdi Amini03b42e42016-04-14 21:59:01 +0000470 FunctionType::get(Type::getDoubleTy(TheContext), Doubles, false);
Lang Hames59b0da82015-08-19 18:15:58 +0000471
472 Function *F =
Lang Hames2d789c32015-08-26 03:07:41 +0000473 Function::Create(FT, Function::ExternalLinkage, Name, TheModule.get());
Lang Hames59b0da82015-08-19 18:15:58 +0000474
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000475 // Set names for all arguments.
476 unsigned Idx = 0;
Lang Hames2d789c32015-08-26 03:07:41 +0000477 for (auto &Arg : F->args())
478 Arg.setName(Args[Idx++]);
Lang Hames59b0da82015-08-19 18:15:58 +0000479
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000480 return F;
481}
482
Lang Hames2d789c32015-08-26 03:07:41 +0000483Function *FunctionAST::codegen() {
484 // First, check for an existing function from a previous 'extern' declaration.
485 Function *TheFunction = TheModule->getFunction(Proto->getName());
Lang Hames59b0da82015-08-19 18:15:58 +0000486
Lang Hames2d789c32015-08-26 03:07:41 +0000487 if (!TheFunction)
488 TheFunction = Proto->codegen();
489
Lang Hames09bf4c12015-08-18 18:11:06 +0000490 if (!TheFunction)
491 return nullptr;
Lang Hames59b0da82015-08-19 18:15:58 +0000492
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000493 // Create a new basic block to start insertion into.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000494 BasicBlock *BB = BasicBlock::Create(TheContext, "entry", TheFunction);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000495 Builder.SetInsertPoint(BB);
Lang Hames59b0da82015-08-19 18:15:58 +0000496
Lang Hames2d789c32015-08-26 03:07:41 +0000497 // Record the function arguments in the NamedValues map.
498 NamedValues.clear();
499 for (auto &Arg : TheFunction->args())
500 NamedValues[Arg.getName()] = &Arg;
501
502 if (Value *RetVal = Body->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000503 // Finish off the function.
504 Builder.CreateRet(RetVal);
505
506 // Validate the generated code, checking for consistency.
507 verifyFunction(*TheFunction);
508
509 return TheFunction;
510 }
Lang Hames59b0da82015-08-19 18:15:58 +0000511
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000512 // Error reading body, remove function.
513 TheFunction->eraseFromParent();
Lang Hames09bf4c12015-08-18 18:11:06 +0000514 return nullptr;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000515}
516
517//===----------------------------------------------------------------------===//
518// Top-Level parsing and JIT Driver
519//===----------------------------------------------------------------------===//
520
521static void HandleDefinition() {
Lang Hames09bf4c12015-08-18 18:11:06 +0000522 if (auto FnAST = ParseDefinition()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000523 if (auto *FnIR = FnAST->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000524 fprintf(stderr, "Read function definition:");
Matthias Braun25bcaba2017-01-28 02:47:46 +0000525 FnIR->print(errs());
526 fprintf(stderr, "\n");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000527 }
528 } else {
529 // Skip token for error recovery.
530 getNextToken();
531 }
532}
533
534static void HandleExtern() {
Lang Hames09bf4c12015-08-18 18:11:06 +0000535 if (auto ProtoAST = ParseExtern()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000536 if (auto *FnIR = ProtoAST->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000537 fprintf(stderr, "Read extern: ");
Matthias Braun25bcaba2017-01-28 02:47:46 +0000538 FnIR->print(errs());
539 fprintf(stderr, "\n");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000540 }
541 } else {
542 // Skip token for error recovery.
543 getNextToken();
544 }
545}
546
547static void HandleTopLevelExpression() {
548 // Evaluate a top-level expression into an anonymous function.
Lang Hames09bf4c12015-08-18 18:11:06 +0000549 if (auto FnAST = ParseTopLevelExpr()) {
Lang Hames2d789c32015-08-26 03:07:41 +0000550 if (auto *FnIR = FnAST->codegen()) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000551 fprintf(stderr, "Read top-level expression:");
Matthias Braun25bcaba2017-01-28 02:47:46 +0000552 FnIR->print(errs());
553 fprintf(stderr, "\n");
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000554 }
555 } else {
556 // Skip token for error recovery.
557 getNextToken();
558 }
559}
560
561/// top ::= definition | external | expression | ';'
562static void MainLoop() {
Eugene Zelenkof981ec42016-05-19 01:08:04 +0000563 while (true) {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000564 fprintf(stderr, "ready> ");
565 switch (CurTok) {
Lang Hames59b0da82015-08-19 18:15:58 +0000566 case tok_eof:
567 return;
568 case ';': // ignore top-level semicolons.
569 getNextToken();
570 break;
571 case tok_def:
572 HandleDefinition();
573 break;
574 case tok_extern:
575 HandleExtern();
576 break;
577 default:
578 HandleTopLevelExpression();
579 break;
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000580 }
581 }
582}
583
584//===----------------------------------------------------------------------===//
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000585// Main driver code.
586//===----------------------------------------------------------------------===//
587
588int main() {
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000589 // Install standard binary operators.
590 // 1 is lowest precedence.
591 BinopPrecedence['<'] = 10;
592 BinopPrecedence['+'] = 20;
593 BinopPrecedence['-'] = 20;
Lang Hames59b0da82015-08-19 18:15:58 +0000594 BinopPrecedence['*'] = 40; // highest.
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000595
596 // Prime the first token.
597 fprintf(stderr, "ready> ");
598 getNextToken();
599
600 // Make the module, which holds all the code.
Mehdi Amini03b42e42016-04-14 21:59:01 +0000601 TheModule = llvm::make_unique<Module>("my cool jit", TheContext);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000602
603 // Run the main "interpreter loop" now.
604 MainLoop();
605
606 // Print out all of the generated code.
Matthias Braun25bcaba2017-01-28 02:47:46 +0000607 TheModule->print(errs(), nullptr);
Erick Tryzelaar21e83ea2009-09-22 21:15:19 +0000608
609 return 0;
610}