blob: f113e96651e990d9511bdf8ec5898a351bc3dc25 [file] [log] [blame]
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +00001<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
3
4<html>
5<head>
Chris Lattner58f2c872007-11-02 05:42:52 +00006 <title>Kaleidoscope: Extending the Language: User-defined Operators</title>
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +00007 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
8 <meta name="author" content="Chris Lattner">
9 <link rel="stylesheet" href="../llvm.css" type="text/css">
10</head>
11
12<body>
13
Chris Lattner58f2c872007-11-02 05:42:52 +000014<div class="doc_title">Kaleidoscope: Extending the Language: User-defined Operators</div>
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +000015
Chris Lattner128eb862007-11-05 19:06:59 +000016<ul>
Chris Lattner0e555b12007-11-05 20:04:56 +000017<li><a href="index.html">Up to Tutorial Index</a></li>
Chris Lattner128eb862007-11-05 19:06:59 +000018<li>Chapter 6
19 <ol>
20 <li><a href="#intro">Chapter 6 Introduction</a></li>
21 <li><a href="#idea">User-defined Operators: the Idea</a></li>
22 <li><a href="#binary">User-defined Binary Operators</a></li>
23 <li><a href="#unary">User-defined Unary Operators</a></li>
24 <li><a href="#example">Kicking the Tires</a></li>
25 <li><a href="#code">Full Code Listing</a></li>
26 </ol>
27</li>
Chris Lattner0e555b12007-11-05 20:04:56 +000028<li><a href="LangImpl7.html">Chapter 7</a>: Extending the Language: Mutable
29Variables / SSA Construction</li>
Chris Lattner128eb862007-11-05 19:06:59 +000030</ul>
31
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +000032<div class="doc_author">
33 <p>Written by <a href="mailto:sabre@nondot.org">Chris Lattner</a></p>
34</div>
35
36<!-- *********************************************************************** -->
Chris Lattner128eb862007-11-05 19:06:59 +000037<div class="doc_section"><a name="intro">Chapter 6 Introduction</a></div>
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +000038<!-- *********************************************************************** -->
39
40<div class="doc_text">
41
Chris Lattner128eb862007-11-05 19:06:59 +000042<p>Welcome to Chapter 6 of the "<a href="index.html">Implementing a language
43with LLVM</a>" tutorial. At this point in our tutorial, we now have a fully
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +000044functional language that is fairly minimal, but also useful. There
45is still one big problem with it, however. Our language doesn't have many
46useful operators (like division, logical negation, or even any comparisons
47besides less-than).</p>
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +000048
Chris Lattner58f2c872007-11-02 05:42:52 +000049<p>This chapter of the tutorial takes a wild digression into adding user-defined
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +000050operators to the simple and beautiful Kaleidoscope language. This digression now gives
51us a simple and ugly language in some ways, but also a powerful one at the same time.
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +000052One of the great things about creating your own language is that you get to
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +000053decide what is good or bad. In this tutorial we'll assume that it is okay to
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +000054use this as a way to show some interesting parsing techniques.</p>
55
Chris Lattner3616a8a2007-11-07 06:06:38 +000056<p>At the end of this tutorial, we'll run through an example Kaleidoscope
57application that <a href="#example">renders the Mandelbrot set</a>. This gives
58an example of what you can build with Kaleidoscope and its feature set.</p>
Chris Lattner58f2c872007-11-02 05:42:52 +000059
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +000060</div>
61
62<!-- *********************************************************************** -->
Chris Lattner58f2c872007-11-02 05:42:52 +000063<div class="doc_section"><a name="idea">User-defined Operators: the Idea</a></div>
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +000064<!-- *********************************************************************** -->
65
66<div class="doc_text">
67
68<p>
Chris Lattner58f2c872007-11-02 05:42:52 +000069The "operator overloading" that we will add to Kaleidoscope is more general than
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +000070languages like C++. In C++, you are only allowed to redefine existing
71operators: you can't programatically change the grammar, introduce new
72operators, change precedence levels, etc. In this chapter, we will add this
Chris Lattner3616a8a2007-11-07 06:06:38 +000073capability to Kaleidoscope, which will let the user round out the set of
74operators that are supported.</p>
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +000075
Chris Lattner58f2c872007-11-02 05:42:52 +000076<p>The point of going into user-defined operators in a tutorial like this is to
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +000077show the power and flexibility of using a hand-written parser. Thus far, the parser
78we have been implementing uses recursive descent for most parts of the grammar and
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +000079operator precedence parsing for the expressions. See <a
80href="LangImpl2.html">Chapter 2</a> for details. Without using operator
81precedence parsing, it would be very difficult to allow the programmer to
82introduce new operators into the grammar: the grammar is dynamically extensible
83as the JIT runs.</p>
84
85<p>The two specific features we'll add are programmable unary operators (right
86now, Kaleidoscope has no unary operators at all) as well as binary operators.
87An example of this is:</p>
88
89<div class="doc_code">
90<pre>
91# Logical unary not.
92def unary!(v)
93 if v then
94 0
95 else
96 1;
97
98# Define &gt; with the same precedence as &lt;.
99def binary&gt; 10 (LHS RHS)
Chris Lattner61ad4492007-11-23 22:19:33 +0000100 RHS &lt; LHS;
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +0000101
102# Binary "logical or", (note that it does not "short circuit")
103def binary| 5 (LHS RHS)
104 if LHS then
105 1
106 else if RHS then
107 1
108 else
109 0;
110
111# Define = with slightly lower precedence than relationals.
112def binary= 9 (LHS RHS)
113 !(LHS &lt; RHS | LHS &gt; RHS);
114</pre>
115</div>
116
117<p>Many languages aspire to being able to implement their standard runtime
118library in the language itself. In Kaleidoscope, we can implement significant
119parts of the language in the library!</p>
120
121<p>We will break down implementation of these features into two parts:
Chris Lattner58f2c872007-11-02 05:42:52 +0000122implementing support for user-defined binary operators and adding unary
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +0000123operators.</p>
124
125</div>
126
127<!-- *********************************************************************** -->
Chris Lattner58f2c872007-11-02 05:42:52 +0000128<div class="doc_section"><a name="binary">User-defined Binary Operators</a></div>
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +0000129<!-- *********************************************************************** -->
130
131<div class="doc_text">
132
Chris Lattner58f2c872007-11-02 05:42:52 +0000133<p>Adding support for user-defined binary operators is pretty simple with our
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +0000134current framework. We'll first add support for the unary/binary keywords:</p>
135
136<div class="doc_code">
137<pre>
138enum Token {
139 ...
140 <b>// operators
141 tok_binary = -11, tok_unary = -12</b>
142};
143...
144static int gettok() {
145...
146 if (IdentifierStr == "for") return tok_for;
147 if (IdentifierStr == "in") return tok_in;
148 <b>if (IdentifierStr == "binary") return tok_binary;
149 if (IdentifierStr == "unary") return tok_unary;</b>
150 return tok_identifier;
151</pre>
152</div>
153
154<p>This just adds lexer support for the unary and binary keywords, like we
155did in <a href="LangImpl5.html#iflexer">previous chapters</a>. One nice thing
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000156about our current AST, is that we represent binary operators with full generalisation
157by using their ASCII code as the opcode. For our extended operators, we'll use this
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +0000158same representation, so we don't need any new AST or parser support.</p>
159
160<p>On the other hand, we have to be able to represent the definitions of these
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000161new operators, in the "def binary| 5" part of the function definition. In our
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +0000162grammar so far, the "name" for the function definition is parsed as the
163"prototype" production and into the <tt>PrototypeAST</tt> AST node. To
164represent our new user-defined operators as prototypes, we have to extend
165the <tt>PrototypeAST</tt> AST node like this:</p>
166
167<div class="doc_code">
168<pre>
169/// PrototypeAST - This class represents the "prototype" for a function,
170/// which captures its argument names as well as if it is an operator.
171class PrototypeAST {
172 std::string Name;
173 std::vector&lt;std::string&gt; Args;
174 <b>bool isOperator;
175 unsigned Precedence; // Precedence if a binary op.</b>
176public:
177 PrototypeAST(const std::string &amp;name, const std::vector&lt;std::string&gt; &amp;args,
178 <b>bool isoperator = false, unsigned prec = 0</b>)
179 : Name(name), Args(args), <b>isOperator(isoperator), Precedence(prec)</b> {}
180
181 <b>bool isUnaryOp() const { return isOperator &amp;&amp; Args.size() == 1; }
182 bool isBinaryOp() const { return isOperator &amp;&amp; Args.size() == 2; }
183
184 char getOperatorName() const {
185 assert(isUnaryOp() || isBinaryOp());
186 return Name[Name.size()-1];
187 }
188
189 unsigned getBinaryPrecedence() const { return Precedence; }</b>
190
191 Function *Codegen();
192};
193</pre>
194</div>
195
196<p>Basically, in addition to knowing a name for the prototype, we now keep track
197of whether it was an operator, and if it was, what precedence level the operator
Chris Lattner58f2c872007-11-02 05:42:52 +0000198is at. The precedence is only used for binary operators (as you'll see below,
199it just doesn't apply for unary operators). Now that we have a way to represent
200the prototype for a user-defined operator, we need to parse it:</p>
201
202<div class="doc_code">
203<pre>
204/// prototype
205/// ::= id '(' id* ')'
206<b>/// ::= binary LETTER number? (id, id)</b>
207static PrototypeAST *ParsePrototype() {
208 std::string FnName;
209
Nick Lewycky422094c2009-09-13 21:38:54 +0000210 <b>unsigned Kind = 0; // 0 = identifier, 1 = unary, 2 = binary.
Chris Lattner58f2c872007-11-02 05:42:52 +0000211 unsigned BinaryPrecedence = 30;</b>
212
213 switch (CurTok) {
214 default:
215 return ErrorP("Expected function name in prototype");
216 case tok_identifier:
217 FnName = IdentifierStr;
218 Kind = 0;
219 getNextToken();
220 break;
221 <b>case tok_binary:
222 getNextToken();
223 if (!isascii(CurTok))
224 return ErrorP("Expected binary operator");
225 FnName = "binary";
226 FnName += (char)CurTok;
227 Kind = 2;
228 getNextToken();
229
230 // Read the precedence if present.
231 if (CurTok == tok_number) {
232 if (NumVal &lt; 1 || NumVal &gt; 100)
233 return ErrorP("Invalid precedecnce: must be 1..100");
234 BinaryPrecedence = (unsigned)NumVal;
235 getNextToken();
236 }
237 break;</b>
238 }
239
240 if (CurTok != '(')
241 return ErrorP("Expected '(' in prototype");
242
243 std::vector&lt;std::string&gt; ArgNames;
244 while (getNextToken() == tok_identifier)
245 ArgNames.push_back(IdentifierStr);
246 if (CurTok != ')')
247 return ErrorP("Expected ')' in prototype");
248
249 // success.
250 getNextToken(); // eat ')'.
251
252 <b>// Verify right number of names for operator.
253 if (Kind &amp;&amp; ArgNames.size() != Kind)
254 return ErrorP("Invalid number of operands for operator");
255
256 return new PrototypeAST(FnName, ArgNames, Kind != 0, BinaryPrecedence);</b>
257}
258</pre>
259</div>
260
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000261<p>This is all fairly straightforward parsing code, and we have already seen
262a lot of similar code in the past. One interesting part about the code above is
263the couple lines that set up <tt>FnName</tt> for binary operators. This builds names
264like "binary@" for a newly defined "@" operator. This then takes advantage of the
265fact that symbol names in the LLVM symbol table are allowed to have any character in
266them, including embedded nul characters.</p>
Chris Lattner58f2c872007-11-02 05:42:52 +0000267
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000268<p>The next interesting thing to add, is codegen support for these binary operators.
Chris Lattner58f2c872007-11-02 05:42:52 +0000269Given our current structure, this is a simple addition of a default case for our
270existing binary operator node:</p>
271
272<div class="doc_code">
273<pre>
274Value *BinaryExprAST::Codegen() {
275 Value *L = LHS-&gt;Codegen();
276 Value *R = RHS-&gt;Codegen();
277 if (L == 0 || R == 0) return 0;
278
279 switch (Op) {
280 case '+': return Builder.CreateAdd(L, R, "addtmp");
281 case '-': return Builder.CreateSub(L, R, "subtmp");
282 case '*': return Builder.CreateMul(L, R, "multmp");
283 case '&lt;':
Chris Lattner71155212007-11-06 01:39:12 +0000284 L = Builder.CreateFCmpULT(L, R, "cmptmp");
Chris Lattner58f2c872007-11-02 05:42:52 +0000285 // Convert bool 0/1 to double 0.0 or 1.0
Nick Lewycky422094c2009-09-13 21:38:54 +0000286 return Builder.CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()),
287 "booltmp");
Chris Lattner58f2c872007-11-02 05:42:52 +0000288 <b>default: break;</b>
289 }
290
291 <b>// If it wasn't a builtin binary operator, it must be a user defined one. Emit
292 // a call to it.
293 Function *F = TheModule-&gt;getFunction(std::string("binary")+Op);
294 assert(F &amp;&amp; "binary operator not found!");
295
296 Value *Ops[] = { L, R };
297 return Builder.CreateCall(F, Ops, Ops+2, "binop");</b>
298}
299
300</pre>
301</div>
302
303<p>As you can see above, the new code is actually really simple. It just does
304a lookup for the appropriate operator in the symbol table and generates a
305function call to it. Since user-defined operators are just built as normal
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000306functions (because the "prototype" boils down to a function with the right
Chris Lattner58f2c872007-11-02 05:42:52 +0000307name) everything falls into place.</p>
308
Erick Tryzelaarfd1ec5e2009-09-22 21:14:49 +0000309<p>The final piece of code we are missing, is a bit of top-level magic:</p>
Chris Lattner58f2c872007-11-02 05:42:52 +0000310
311<div class="doc_code">
312<pre>
313Function *FunctionAST::Codegen() {
314 NamedValues.clear();
315
316 Function *TheFunction = Proto->Codegen();
317 if (TheFunction == 0)
318 return 0;
319
320 <b>// If this is an operator, install it.
321 if (Proto-&gt;isBinaryOp())
322 BinopPrecedence[Proto->getOperatorName()] = Proto->getBinaryPrecedence();</b>
323
324 // Create a new basic block to start insertion into.
Owen Anderson1d0be152009-08-13 21:58:54 +0000325 BasicBlock *BB = BasicBlock::Create(getGlobalContext(), "entry", TheFunction);
Chris Lattner58f2c872007-11-02 05:42:52 +0000326 Builder.SetInsertPoint(BB);
327
328 if (Value *RetVal = Body-&gt;Codegen()) {
329 ...
330</pre>
331</div>
332
333<p>Basically, before codegening a function, if it is a user-defined operator, we
334register it in the precedence table. This allows the binary operator parsing
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000335logic we already have in place to handle it. Since we are working on a fully-general operator precedence parser, this is all we need to do to "extend the grammar".</p>
Chris Lattner58f2c872007-11-02 05:42:52 +0000336
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000337<p>Now we have useful user-defined binary operators. This builds a lot
Chris Lattner58f2c872007-11-02 05:42:52 +0000338on the previous framework we built for other operators. Adding unary operators
Chris Lattner3616a8a2007-11-07 06:06:38 +0000339is a bit more challenging, because we don't have any framework for it yet - lets
Chris Lattner58f2c872007-11-02 05:42:52 +0000340see what it takes.</p>
341
342</div>
343
344<!-- *********************************************************************** -->
345<div class="doc_section"><a name="unary">User-defined Unary Operators</a></div>
346<!-- *********************************************************************** -->
347
348<div class="doc_text">
349
350<p>Since we don't currently support unary operators in the Kaleidoscope
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000351language, we'll need to add everything to support them. Above, we added simple
Chris Lattner58f2c872007-11-02 05:42:52 +0000352support for the 'unary' keyword to the lexer. In addition to that, we need an
353AST node:</p>
354
355<div class="doc_code">
356<pre>
357/// UnaryExprAST - Expression class for a unary operator.
358class UnaryExprAST : public ExprAST {
359 char Opcode;
360 ExprAST *Operand;
361public:
362 UnaryExprAST(char opcode, ExprAST *operand)
363 : Opcode(opcode), Operand(operand) {}
364 virtual Value *Codegen();
365};
366</pre>
367</div>
368
369<p>This AST node is very simple and obvious by now. It directly mirrors the
370binary operator AST node, except that it only has one child. With this, we
371need to add the parsing logic. Parsing a unary operator is pretty simple: we'll
372add a new function to do it:</p>
373
374<div class="doc_code">
375<pre>
376/// unary
377/// ::= primary
378/// ::= '!' unary
379static ExprAST *ParseUnary() {
380 // If the current token is not an operator, it must be a primary expr.
381 if (!isascii(CurTok) || CurTok == '(' || CurTok == ',')
382 return ParsePrimary();
383
384 // If this is a unary operator, read it.
385 int Opc = CurTok;
386 getNextToken();
387 if (ExprAST *Operand = ParseUnary())
388 return new UnaryExprAST(Opc, Operand);
389 return 0;
390}
391</pre>
392</div>
393
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000394<p>The grammar we add is pretty straightforward here. If we see a unary
Chris Lattner58f2c872007-11-02 05:42:52 +0000395operator when parsing a primary operator, we eat the operator as a prefix and
396parse the remaining piece as another unary operator. This allows us to handle
397multiple unary operators (e.g. "!!x"). Note that unary operators can't have
398ambiguous parses like binary operators can, so there is no need for precedence
399information.</p>
400
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000401<p>The problem with this function, is that we need to call ParseUnary from somewhere.
Chris Lattner58f2c872007-11-02 05:42:52 +0000402To do this, we change previous callers of ParsePrimary to call ParseUnary
403instead:</p>
404
405<div class="doc_code">
406<pre>
407/// binoprhs
408/// ::= ('+' unary)*
409static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
410 ...
411 <b>// Parse the unary expression after the binary operator.
412 ExprAST *RHS = ParseUnary();
413 if (!RHS) return 0;</b>
414 ...
415}
416/// expression
417/// ::= unary binoprhs
418///
419static ExprAST *ParseExpression() {
420 <b>ExprAST *LHS = ParseUnary();</b>
421 if (!LHS) return 0;
422
423 return ParseBinOpRHS(0, LHS);
424}
425</pre>
426</div>
427
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000428<p>With these two simple changes, we are now able to parse unary operators and build the
Chris Lattner58f2c872007-11-02 05:42:52 +0000429AST for them. Next up, we need to add parser support for prototypes, to parse
430the unary operator prototype. We extend the binary operator code above
431with:</p>
432
433<div class="doc_code">
434<pre>
435/// prototype
436/// ::= id '(' id* ')'
437/// ::= binary LETTER number? (id, id)
438<b>/// ::= unary LETTER (id)</b>
439static PrototypeAST *ParsePrototype() {
440 std::string FnName;
441
Nick Lewycky422094c2009-09-13 21:38:54 +0000442 unsigned Kind = 0; // 0 = identifier, 1 = unary, 2 = binary.
Chris Lattner58f2c872007-11-02 05:42:52 +0000443 unsigned BinaryPrecedence = 30;
444
445 switch (CurTok) {
446 default:
447 return ErrorP("Expected function name in prototype");
448 case tok_identifier:
449 FnName = IdentifierStr;
450 Kind = 0;
451 getNextToken();
452 break;
453 <b>case tok_unary:
454 getNextToken();
455 if (!isascii(CurTok))
456 return ErrorP("Expected unary operator");
457 FnName = "unary";
458 FnName += (char)CurTok;
459 Kind = 1;
460 getNextToken();
461 break;</b>
462 case tok_binary:
463 ...
464</pre>
465</div>
466
467<p>As with binary operators, we name unary operators with a name that includes
468the operator character. This assists us at code generation time. Speaking of,
469the final piece we need to add is codegen support for unary operators. It looks
470like this:</p>
471
472<div class="doc_code">
473<pre>
474Value *UnaryExprAST::Codegen() {
475 Value *OperandV = Operand->Codegen();
476 if (OperandV == 0) return 0;
477
478 Function *F = TheModule->getFunction(std::string("unary")+Opcode);
479 if (F == 0)
480 return ErrorV("Unknown unary operator");
481
482 return Builder.CreateCall(F, OperandV, "unop");
483}
484</pre>
485</div>
486
487<p>This code is similar to, but simpler than, the code for binary operators. It
488is simpler primarily because it doesn't need to handle any predefined operators.
489</p>
490
491</div>
492
493<!-- *********************************************************************** -->
494<div class="doc_section"><a name="example">Kicking the Tires</a></div>
495<!-- *********************************************************************** -->
496
497<div class="doc_text">
498
499<p>It is somewhat hard to believe, but with a few simple extensions we've
Chris Lattnerb5d81b32007-11-02 05:54:25 +0000500covered in the last chapters, we have grown a real-ish language. With this, we
Chris Lattner58f2c872007-11-02 05:42:52 +0000501can do a lot of interesting things, including I/O, math, and a bunch of other
502things. For example, we can now add a nice sequencing operator (printd is
503defined to print out the specified value and a newline):</p>
504
505<div class="doc_code">
506<pre>
507ready&gt; <b>extern printd(x);</b>
508Read extern: declare double @printd(double)
509ready&gt; <b>def binary : 1 (x y) 0; # Low-precedence operator that ignores operands.</b>
510..
511ready&gt; <b>printd(123) : printd(456) : printd(789);</b>
512123.000000
513456.000000
514789.000000
515Evaluated to 0.000000
516</pre>
517</div>
518
Chris Lattnerb5d81b32007-11-02 05:54:25 +0000519<p>We can also define a bunch of other "primitive" operations, such as:</p>
Chris Lattner58f2c872007-11-02 05:42:52 +0000520
521<div class="doc_code">
522<pre>
523# Logical unary not.
524def unary!(v)
525 if v then
526 0
527 else
528 1;
529
530# Unary negate.
531def unary-(v)
532 0-v;
533
Chris Lattner3616a8a2007-11-07 06:06:38 +0000534# Define &gt; with the same precedence as &gt;.
Chris Lattner58f2c872007-11-02 05:42:52 +0000535def binary&gt; 10 (LHS RHS)
Chris Lattner61ad4492007-11-23 22:19:33 +0000536 RHS &lt; LHS;
Chris Lattner58f2c872007-11-02 05:42:52 +0000537
538# Binary logical or, which does not short circuit.
539def binary| 5 (LHS RHS)
540 if LHS then
541 1
542 else if RHS then
543 1
544 else
545 0;
546
547# Binary logical and, which does not short circuit.
548def binary&amp; 6 (LHS RHS)
549 if !LHS then
550 0
551 else
552 !!RHS;
553
554# Define = with slightly lower precedence than relationals.
555def binary = 9 (LHS RHS)
556 !(LHS &lt; RHS | LHS &gt; RHS);
557
558</pre>
559</div>
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +0000560
561
Chris Lattner58f2c872007-11-02 05:42:52 +0000562<p>Given the previous if/then/else support, we can also define interesting
563functions for I/O. For example, the following prints out a character whose
564"density" reflects the value passed in: the lower the value, the denser the
565character:</p>
566
567<div class="doc_code">
568<pre>
569ready&gt;
570<b>
571extern putchard(char)
572def printdensity(d)
573 if d &gt; 8 then
574 putchard(32) # ' '
575 else if d &gt; 4 then
576 putchard(46) # '.'
577 else if d &gt; 2 then
578 putchard(43) # '+'
579 else
580 putchard(42); # '*'</b>
581...
582ready&gt; <b>printdensity(1): printdensity(2): printdensity(3) :
583 printdensity(4): printdensity(5): printdensity(9): putchard(10);</b>
584*++..
585Evaluated to 0.000000
586</pre>
587</div>
588
589<p>Based on these simple primitive operations, we can start to define more
590interesting things. For example, here's a little function that solves for the
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000591number of iterations it takes a function in the complex plane to
Chris Lattner58f2c872007-11-02 05:42:52 +0000592converge:</p>
593
594<div class="doc_code">
595<pre>
596# determine whether the specific location diverges.
597# Solve for z = z^2 + c in the complex plane.
598def mandleconverger(real imag iters creal cimag)
599 if iters &gt; 255 | (real*real + imag*imag &gt; 4) then
600 iters
601 else
602 mandleconverger(real*real - imag*imag + creal,
603 2*real*imag + cimag,
604 iters+1, creal, cimag);
605
606# return the number of iterations required for the iteration to escape
607def mandleconverge(real imag)
608 mandleconverger(real, imag, 0, real, imag);
609</pre>
610</div>
611
Chris Lattnerb5d81b32007-11-02 05:54:25 +0000612<p>This "z = z<sup>2</sup> + c" function is a beautiful little creature that is the basis
Chris Lattner58f2c872007-11-02 05:42:52 +0000613for computation of the <a
614href="http://en.wikipedia.org/wiki/Mandelbrot_set">Mandelbrot Set</a>. Our
615<tt>mandelconverge</tt> function returns the number of iterations that it takes
616for a complex orbit to escape, saturating to 255. This is not a very useful
617function by itself, but if you plot its value over a two-dimensional plane,
Chris Lattner3616a8a2007-11-07 06:06:38 +0000618you can see the Mandelbrot set. Given that we are limited to using putchard
Chris Lattner58f2c872007-11-02 05:42:52 +0000619here, our amazing graphical output is limited, but we can whip together
620something using the density plotter above:</p>
621
622<div class="doc_code">
623<pre>
Chris Lattner3616a8a2007-11-07 06:06:38 +0000624# compute and plot the mandlebrot set with the specified 2 dimensional range
Chris Lattner58f2c872007-11-02 05:42:52 +0000625# info.
626def mandelhelp(xmin xmax xstep ymin ymax ystep)
627 for y = ymin, y &lt; ymax, ystep in (
628 (for x = xmin, x &lt; xmax, xstep in
629 printdensity(mandleconverge(x,y)))
630 : putchard(10)
631 )
632
633# mandel - This is a convenient helper function for ploting the mandelbrot set
Chris Lattner3616a8a2007-11-07 06:06:38 +0000634# from the specified position with the specified Magnification.
Chris Lattner58f2c872007-11-02 05:42:52 +0000635def mandel(realstart imagstart realmag imagmag)
636 mandelhelp(realstart, realstart+realmag*78, realmag,
637 imagstart, imagstart+imagmag*40, imagmag);
638</pre>
639</div>
640
641<p>Given this, we can try plotting out the mandlebrot set! Lets try it out:</p>
642
643<div class="doc_code">
644<pre>
645ready&gt; <b>mandel(-2.3, -1.3, 0.05, 0.07);</b>
646*******************************+++++++++++*************************************
647*************************+++++++++++++++++++++++*******************************
648**********************+++++++++++++++++++++++++++++****************************
649*******************+++++++++++++++++++++.. ...++++++++*************************
650*****************++++++++++++++++++++++.... ...+++++++++***********************
651***************+++++++++++++++++++++++..... ...+++++++++*********************
652**************+++++++++++++++++++++++.... ....+++++++++********************
653*************++++++++++++++++++++++...... .....++++++++*******************
654************+++++++++++++++++++++....... .......+++++++******************
655***********+++++++++++++++++++.... ... .+++++++*****************
656**********+++++++++++++++++....... .+++++++****************
657*********++++++++++++++........... ...+++++++***************
658********++++++++++++............ ...++++++++**************
659********++++++++++... .......... .++++++++**************
660*******+++++++++..... .+++++++++*************
661*******++++++++...... ..+++++++++*************
662*******++++++....... ..+++++++++*************
663*******+++++...... ..+++++++++*************
664*******.... .... ...+++++++++*************
665*******.... . ...+++++++++*************
666*******+++++...... ...+++++++++*************
667*******++++++....... ..+++++++++*************
668*******++++++++...... .+++++++++*************
669*******+++++++++..... ..+++++++++*************
670********++++++++++... .......... .++++++++**************
671********++++++++++++............ ...++++++++**************
672*********++++++++++++++.......... ...+++++++***************
673**********++++++++++++++++........ .+++++++****************
674**********++++++++++++++++++++.... ... ..+++++++****************
675***********++++++++++++++++++++++....... .......++++++++*****************
676************+++++++++++++++++++++++...... ......++++++++******************
677**************+++++++++++++++++++++++.... ....++++++++********************
678***************+++++++++++++++++++++++..... ...+++++++++*********************
679*****************++++++++++++++++++++++.... ...++++++++***********************
680*******************+++++++++++++++++++++......++++++++*************************
681*********************++++++++++++++++++++++.++++++++***************************
682*************************+++++++++++++++++++++++*******************************
683******************************+++++++++++++************************************
684*******************************************************************************
685*******************************************************************************
686*******************************************************************************
687Evaluated to 0.000000
688ready&gt; <b>mandel(-2, -1, 0.02, 0.04);</b>
689**************************+++++++++++++++++++++++++++++++++++++++++++++++++++++
690***********************++++++++++++++++++++++++++++++++++++++++++++++++++++++++
691*********************+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
692*******************+++++++++++++++++++++++++++++++++++++++++++++++++++++++++...
693*****************+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.....
694***************++++++++++++++++++++++++++++++++++++++++++++++++++++++++........
695**************++++++++++++++++++++++++++++++++++++++++++++++++++++++...........
696************+++++++++++++++++++++++++++++++++++++++++++++++++++++..............
697***********++++++++++++++++++++++++++++++++++++++++++++++++++........ .
698**********++++++++++++++++++++++++++++++++++++++++++++++.............
699********+++++++++++++++++++++++++++++++++++++++++++..................
700*******+++++++++++++++++++++++++++++++++++++++.......................
701******+++++++++++++++++++++++++++++++++++...........................
702*****++++++++++++++++++++++++++++++++............................
703*****++++++++++++++++++++++++++++...............................
704****++++++++++++++++++++++++++...... .........................
705***++++++++++++++++++++++++......... ...... ...........
706***++++++++++++++++++++++............
707**+++++++++++++++++++++..............
708**+++++++++++++++++++................
709*++++++++++++++++++.................
710*++++++++++++++++............ ...
711*++++++++++++++..............
712*+++....++++................
713*.......... ...........
714*
715*.......... ...........
716*+++....++++................
717*++++++++++++++..............
718*++++++++++++++++............ ...
719*++++++++++++++++++.................
720**+++++++++++++++++++................
721**+++++++++++++++++++++..............
722***++++++++++++++++++++++............
723***++++++++++++++++++++++++......... ...... ...........
724****++++++++++++++++++++++++++...... .........................
725*****++++++++++++++++++++++++++++...............................
726*****++++++++++++++++++++++++++++++++............................
727******+++++++++++++++++++++++++++++++++++...........................
728*******+++++++++++++++++++++++++++++++++++++++.......................
729********+++++++++++++++++++++++++++++++++++++++++++..................
730Evaluated to 0.000000
731ready&gt; <b>mandel(-0.9, -1.4, 0.02, 0.03);</b>
732*******************************************************************************
733*******************************************************************************
734*******************************************************************************
735**********+++++++++++++++++++++************************************************
736*+++++++++++++++++++++++++++++++++++++++***************************************
737+++++++++++++++++++++++++++++++++++++++++++++**********************************
738++++++++++++++++++++++++++++++++++++++++++++++++++*****************************
739++++++++++++++++++++++++++++++++++++++++++++++++++++++*************************
740+++++++++++++++++++++++++++++++++++++++++++++++++++++++++**********************
741+++++++++++++++++++++++++++++++++.........++++++++++++++++++*******************
742+++++++++++++++++++++++++++++++.... ......+++++++++++++++++++****************
743+++++++++++++++++++++++++++++....... ........+++++++++++++++++++**************
744++++++++++++++++++++++++++++........ ........++++++++++++++++++++************
745+++++++++++++++++++++++++++......... .. ...+++++++++++++++++++++**********
746++++++++++++++++++++++++++........... ....++++++++++++++++++++++********
747++++++++++++++++++++++++............. .......++++++++++++++++++++++******
748+++++++++++++++++++++++............. ........+++++++++++++++++++++++****
749++++++++++++++++++++++........... ..........++++++++++++++++++++++***
750++++++++++++++++++++........... .........++++++++++++++++++++++*
751++++++++++++++++++............ ...........++++++++++++++++++++
752++++++++++++++++............... .............++++++++++++++++++
753++++++++++++++................. ...............++++++++++++++++
754++++++++++++.................. .................++++++++++++++
755+++++++++.................. .................+++++++++++++
756++++++........ . ......... ..++++++++++++
757++............ ...... ....++++++++++
758.............. ...++++++++++
759.............. ....+++++++++
760.............. .....++++++++
761............. ......++++++++
762........... .......++++++++
763......... ........+++++++
764......... ........+++++++
765......... ....+++++++
766........ ...+++++++
767....... ...+++++++
768 ....+++++++
769 .....+++++++
770 ....+++++++
771 ....+++++++
772 ....+++++++
773Evaluated to 0.000000
774ready&gt; <b>^D</b>
775</pre>
776</div>
777
778<p>At this point, you may be starting to realize that Kaleidoscope is a real
779and powerful language. It may not be self-similar :), but it can be used to
780plot things that are!</p>
781
782<p>With this, we conclude the "adding user-defined operators" chapter of the
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000783tutorial. We have successfully augmented our language, adding the ability to extend the
784language in the library, and we have shown how this can be used to build a simple but
Chris Lattner3616a8a2007-11-07 06:06:38 +0000785interesting end-user application in Kaleidoscope. At this point, Kaleidoscope
Chris Lattner58f2c872007-11-02 05:42:52 +0000786can build a variety of applications that are functional and can call functions
Chris Lattnerb5d81b32007-11-02 05:54:25 +0000787with side-effects, but it can't actually define and mutate a variable itself.
Chris Lattner58f2c872007-11-02 05:42:52 +0000788</p>
789
Chris Lattner3616a8a2007-11-07 06:06:38 +0000790<p>Strikingly, variable mutation is an important feature of some
Chris Lattner58f2c872007-11-02 05:42:52 +0000791languages, and it is not at all obvious how to <a href="LangImpl7.html">add
792support for mutable variables</a> without having to add an "SSA construction"
793phase to your front-end. In the next chapter, we will describe how you can
Chris Lattnerb7e6b1a2007-11-15 04:51:31 +0000794add variable mutation without building SSA in your front-end.</p>
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +0000795
796</div>
797
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +0000798<!-- *********************************************************************** -->
799<div class="doc_section"><a name="code">Full Code Listing</a></div>
800<!-- *********************************************************************** -->
801
802<div class="doc_text">
803
804<p>
805Here is the complete code listing for our running example, enhanced with the
806if/then/else and for expressions.. To build this example, use:
807</p>
808
809<div class="doc_code">
810<pre>
811 # Compile
812 g++ -g toy.cpp `llvm-config --cppflags --ldflags --libs core jit native` -O3 -o toy
813 # Run
814 ./toy
815</pre>
816</div>
817
818<p>Here is the code:</p>
819
820<div class="doc_code">
821<pre>
Chris Lattner58f2c872007-11-02 05:42:52 +0000822#include "llvm/DerivedTypes.h"
823#include "llvm/ExecutionEngine/ExecutionEngine.h"
Nick Lewycky422094c2009-09-13 21:38:54 +0000824#include "llvm/ExecutionEngine/Interpreter.h"
825#include "llvm/ExecutionEngine/JIT.h"
Owen Andersond1fbd142009-07-08 20:50:47 +0000826#include "llvm/LLVMContext.h"
Chris Lattner58f2c872007-11-02 05:42:52 +0000827#include "llvm/Module.h"
828#include "llvm/ModuleProvider.h"
829#include "llvm/PassManager.h"
830#include "llvm/Analysis/Verifier.h"
831#include "llvm/Target/TargetData.h"
Nick Lewycky422094c2009-09-13 21:38:54 +0000832#include "llvm/Target/TargetSelect.h"
Chris Lattner58f2c872007-11-02 05:42:52 +0000833#include "llvm/Transforms/Scalar.h"
Duncan Sands89f6d882008-04-13 06:22:09 +0000834#include "llvm/Support/IRBuilder.h"
Chris Lattner58f2c872007-11-02 05:42:52 +0000835#include &lt;cstdio&gt;
836#include &lt;string&gt;
837#include &lt;map&gt;
838#include &lt;vector&gt;
839using namespace llvm;
840
841//===----------------------------------------------------------------------===//
842// Lexer
843//===----------------------------------------------------------------------===//
844
845// The lexer returns tokens [0-255] if it is an unknown character, otherwise one
846// of these for known things.
847enum Token {
848 tok_eof = -1,
849
850 // commands
851 tok_def = -2, tok_extern = -3,
852
853 // primary
854 tok_identifier = -4, tok_number = -5,
855
856 // control
857 tok_if = -6, tok_then = -7, tok_else = -8,
858 tok_for = -9, tok_in = -10,
859
860 // operators
861 tok_binary = -11, tok_unary = -12
862};
863
864static std::string IdentifierStr; // Filled in if tok_identifier
865static double NumVal; // Filled in if tok_number
866
867/// gettok - Return the next token from standard input.
868static int gettok() {
869 static int LastChar = ' ';
870
871 // Skip any whitespace.
872 while (isspace(LastChar))
873 LastChar = getchar();
874
875 if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
876 IdentifierStr = LastChar;
877 while (isalnum((LastChar = getchar())))
878 IdentifierStr += LastChar;
879
880 if (IdentifierStr == "def") return tok_def;
881 if (IdentifierStr == "extern") return tok_extern;
882 if (IdentifierStr == "if") return tok_if;
883 if (IdentifierStr == "then") return tok_then;
884 if (IdentifierStr == "else") return tok_else;
885 if (IdentifierStr == "for") return tok_for;
886 if (IdentifierStr == "in") return tok_in;
887 if (IdentifierStr == "binary") return tok_binary;
888 if (IdentifierStr == "unary") return tok_unary;
889 return tok_identifier;
890 }
891
892 if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
893 std::string NumStr;
894 do {
895 NumStr += LastChar;
896 LastChar = getchar();
897 } while (isdigit(LastChar) || LastChar == '.');
898
899 NumVal = strtod(NumStr.c_str(), 0);
900 return tok_number;
901 }
902
903 if (LastChar == '#') {
904 // Comment until end of line.
905 do LastChar = getchar();
Chris Lattnerc80c23f2007-12-02 22:46:01 +0000906 while (LastChar != EOF &amp;&amp; LastChar != '\n' &amp;&amp; LastChar != '\r');
Chris Lattner58f2c872007-11-02 05:42:52 +0000907
908 if (LastChar != EOF)
909 return gettok();
910 }
911
912 // Check for end of file. Don't eat the EOF.
913 if (LastChar == EOF)
914 return tok_eof;
915
916 // Otherwise, just return the character as its ascii value.
917 int ThisChar = LastChar;
918 LastChar = getchar();
919 return ThisChar;
920}
921
922//===----------------------------------------------------------------------===//
923// Abstract Syntax Tree (aka Parse Tree)
924//===----------------------------------------------------------------------===//
925
926/// ExprAST - Base class for all expression nodes.
927class ExprAST {
928public:
929 virtual ~ExprAST() {}
930 virtual Value *Codegen() = 0;
931};
932
933/// NumberExprAST - Expression class for numeric literals like "1.0".
934class NumberExprAST : public ExprAST {
935 double Val;
936public:
937 NumberExprAST(double val) : Val(val) {}
938 virtual Value *Codegen();
939};
940
941/// VariableExprAST - Expression class for referencing a variable, like "a".
942class VariableExprAST : public ExprAST {
943 std::string Name;
944public:
945 VariableExprAST(const std::string &amp;name) : Name(name) {}
946 virtual Value *Codegen();
947};
948
949/// UnaryExprAST - Expression class for a unary operator.
950class UnaryExprAST : public ExprAST {
951 char Opcode;
952 ExprAST *Operand;
953public:
954 UnaryExprAST(char opcode, ExprAST *operand)
955 : Opcode(opcode), Operand(operand) {}
956 virtual Value *Codegen();
957};
958
959/// BinaryExprAST - Expression class for a binary operator.
960class BinaryExprAST : public ExprAST {
961 char Op;
962 ExprAST *LHS, *RHS;
963public:
964 BinaryExprAST(char op, ExprAST *lhs, ExprAST *rhs)
965 : Op(op), LHS(lhs), RHS(rhs) {}
966 virtual Value *Codegen();
967};
968
969/// CallExprAST - Expression class for function calls.
970class CallExprAST : public ExprAST {
971 std::string Callee;
972 std::vector&lt;ExprAST*&gt; Args;
973public:
974 CallExprAST(const std::string &amp;callee, std::vector&lt;ExprAST*&gt; &amp;args)
975 : Callee(callee), Args(args) {}
976 virtual Value *Codegen();
977};
978
979/// IfExprAST - Expression class for if/then/else.
980class IfExprAST : public ExprAST {
981 ExprAST *Cond, *Then, *Else;
982public:
983 IfExprAST(ExprAST *cond, ExprAST *then, ExprAST *_else)
984 : Cond(cond), Then(then), Else(_else) {}
985 virtual Value *Codegen();
986};
987
988/// ForExprAST - Expression class for for/in.
989class ForExprAST : public ExprAST {
990 std::string VarName;
991 ExprAST *Start, *End, *Step, *Body;
992public:
993 ForExprAST(const std::string &amp;varname, ExprAST *start, ExprAST *end,
994 ExprAST *step, ExprAST *body)
995 : VarName(varname), Start(start), End(end), Step(step), Body(body) {}
996 virtual Value *Codegen();
997};
998
999/// PrototypeAST - This class represents the "prototype" for a function,
Erick Tryzelaarfd1ec5e2009-09-22 21:14:49 +00001000/// which captures its name, and its argument names (thus implicitly the number
1001/// of arguments the function takes), as well as if it is an operator.
Chris Lattner58f2c872007-11-02 05:42:52 +00001002class PrototypeAST {
1003 std::string Name;
1004 std::vector&lt;std::string&gt; Args;
1005 bool isOperator;
1006 unsigned Precedence; // Precedence if a binary op.
1007public:
1008 PrototypeAST(const std::string &amp;name, const std::vector&lt;std::string&gt; &amp;args,
1009 bool isoperator = false, unsigned prec = 0)
1010 : Name(name), Args(args), isOperator(isoperator), Precedence(prec) {}
1011
1012 bool isUnaryOp() const { return isOperator &amp;&amp; Args.size() == 1; }
1013 bool isBinaryOp() const { return isOperator &amp;&amp; Args.size() == 2; }
1014
1015 char getOperatorName() const {
1016 assert(isUnaryOp() || isBinaryOp());
1017 return Name[Name.size()-1];
1018 }
1019
1020 unsigned getBinaryPrecedence() const { return Precedence; }
1021
1022 Function *Codegen();
1023};
1024
1025/// FunctionAST - This class represents a function definition itself.
1026class FunctionAST {
1027 PrototypeAST *Proto;
1028 ExprAST *Body;
1029public:
1030 FunctionAST(PrototypeAST *proto, ExprAST *body)
1031 : Proto(proto), Body(body) {}
1032
1033 Function *Codegen();
1034};
1035
1036//===----------------------------------------------------------------------===//
1037// Parser
1038//===----------------------------------------------------------------------===//
1039
1040/// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
Erick Tryzelaarfd1ec5e2009-09-22 21:14:49 +00001041/// token the parser is looking at. getNextToken reads another token from the
Chris Lattner58f2c872007-11-02 05:42:52 +00001042/// lexer and updates CurTok with its results.
1043static int CurTok;
1044static int getNextToken() {
1045 return CurTok = gettok();
1046}
1047
1048/// BinopPrecedence - This holds the precedence for each binary operator that is
1049/// defined.
1050static std::map&lt;char, int&gt; BinopPrecedence;
1051
1052/// GetTokPrecedence - Get the precedence of the pending binary operator token.
1053static int GetTokPrecedence() {
1054 if (!isascii(CurTok))
1055 return -1;
1056
1057 // Make sure it's a declared binop.
1058 int TokPrec = BinopPrecedence[CurTok];
1059 if (TokPrec &lt;= 0) return -1;
1060 return TokPrec;
1061}
1062
1063/// Error* - These are little helper functions for error handling.
1064ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
1065PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
1066FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }
1067
1068static ExprAST *ParseExpression();
1069
1070/// identifierexpr
Chris Lattner20a0c802007-11-05 17:54:34 +00001071/// ::= identifier
1072/// ::= identifier '(' expression* ')'
Chris Lattner58f2c872007-11-02 05:42:52 +00001073static ExprAST *ParseIdentifierExpr() {
1074 std::string IdName = IdentifierStr;
1075
Chris Lattner20a0c802007-11-05 17:54:34 +00001076 getNextToken(); // eat identifier.
Chris Lattner58f2c872007-11-02 05:42:52 +00001077
1078 if (CurTok != '(') // Simple variable ref.
1079 return new VariableExprAST(IdName);
1080
1081 // Call.
1082 getNextToken(); // eat (
1083 std::vector&lt;ExprAST*&gt; Args;
1084 if (CurTok != ')') {
1085 while (1) {
1086 ExprAST *Arg = ParseExpression();
1087 if (!Arg) return 0;
1088 Args.push_back(Arg);
Erick Tryzelaarfd1ec5e2009-09-22 21:14:49 +00001089
Chris Lattner58f2c872007-11-02 05:42:52 +00001090 if (CurTok == ')') break;
Erick Tryzelaarfd1ec5e2009-09-22 21:14:49 +00001091
Chris Lattner58f2c872007-11-02 05:42:52 +00001092 if (CurTok != ',')
Chris Lattner6c4be9c2008-04-14 16:44:41 +00001093 return Error("Expected ')' or ',' in argument list");
Chris Lattner58f2c872007-11-02 05:42:52 +00001094 getNextToken();
1095 }
1096 }
1097
1098 // Eat the ')'.
1099 getNextToken();
1100
1101 return new CallExprAST(IdName, Args);
1102}
1103
1104/// numberexpr ::= number
1105static ExprAST *ParseNumberExpr() {
1106 ExprAST *Result = new NumberExprAST(NumVal);
1107 getNextToken(); // consume the number
1108 return Result;
1109}
1110
1111/// parenexpr ::= '(' expression ')'
1112static ExprAST *ParseParenExpr() {
1113 getNextToken(); // eat (.
1114 ExprAST *V = ParseExpression();
1115 if (!V) return 0;
1116
1117 if (CurTok != ')')
1118 return Error("expected ')'");
1119 getNextToken(); // eat ).
1120 return V;
1121}
1122
1123/// ifexpr ::= 'if' expression 'then' expression 'else' expression
1124static ExprAST *ParseIfExpr() {
1125 getNextToken(); // eat the if.
1126
1127 // condition.
1128 ExprAST *Cond = ParseExpression();
1129 if (!Cond) return 0;
1130
1131 if (CurTok != tok_then)
1132 return Error("expected then");
1133 getNextToken(); // eat the then
1134
1135 ExprAST *Then = ParseExpression();
1136 if (Then == 0) return 0;
1137
1138 if (CurTok != tok_else)
1139 return Error("expected else");
1140
1141 getNextToken();
1142
1143 ExprAST *Else = ParseExpression();
1144 if (!Else) return 0;
1145
1146 return new IfExprAST(Cond, Then, Else);
1147}
1148
Chris Lattner20a0c802007-11-05 17:54:34 +00001149/// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
Chris Lattner58f2c872007-11-02 05:42:52 +00001150static ExprAST *ParseForExpr() {
1151 getNextToken(); // eat the for.
1152
1153 if (CurTok != tok_identifier)
1154 return Error("expected identifier after for");
1155
1156 std::string IdName = IdentifierStr;
Chris Lattner20a0c802007-11-05 17:54:34 +00001157 getNextToken(); // eat identifier.
Chris Lattner58f2c872007-11-02 05:42:52 +00001158
1159 if (CurTok != '=')
1160 return Error("expected '=' after for");
1161 getNextToken(); // eat '='.
1162
1163
1164 ExprAST *Start = ParseExpression();
1165 if (Start == 0) return 0;
1166 if (CurTok != ',')
1167 return Error("expected ',' after for start value");
1168 getNextToken();
1169
1170 ExprAST *End = ParseExpression();
1171 if (End == 0) return 0;
1172
1173 // The step value is optional.
1174 ExprAST *Step = 0;
1175 if (CurTok == ',') {
1176 getNextToken();
1177 Step = ParseExpression();
1178 if (Step == 0) return 0;
1179 }
1180
1181 if (CurTok != tok_in)
1182 return Error("expected 'in' after for");
1183 getNextToken(); // eat 'in'.
1184
1185 ExprAST *Body = ParseExpression();
1186 if (Body == 0) return 0;
1187
1188 return new ForExprAST(IdName, Start, End, Step, Body);
1189}
1190
Chris Lattner58f2c872007-11-02 05:42:52 +00001191/// primary
1192/// ::= identifierexpr
1193/// ::= numberexpr
1194/// ::= parenexpr
1195/// ::= ifexpr
1196/// ::= forexpr
1197static ExprAST *ParsePrimary() {
1198 switch (CurTok) {
1199 default: return Error("unknown token when expecting an expression");
1200 case tok_identifier: return ParseIdentifierExpr();
1201 case tok_number: return ParseNumberExpr();
1202 case '(': return ParseParenExpr();
1203 case tok_if: return ParseIfExpr();
1204 case tok_for: return ParseForExpr();
1205 }
1206}
1207
1208/// unary
1209/// ::= primary
1210/// ::= '!' unary
1211static ExprAST *ParseUnary() {
1212 // If the current token is not an operator, it must be a primary expr.
1213 if (!isascii(CurTok) || CurTok == '(' || CurTok == ',')
1214 return ParsePrimary();
1215
1216 // If this is a unary operator, read it.
1217 int Opc = CurTok;
1218 getNextToken();
1219 if (ExprAST *Operand = ParseUnary())
1220 return new UnaryExprAST(Opc, Operand);
1221 return 0;
1222}
1223
1224/// binoprhs
1225/// ::= ('+' unary)*
1226static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
1227 // If this is a binop, find its precedence.
1228 while (1) {
1229 int TokPrec = GetTokPrecedence();
1230
1231 // If this is a binop that binds at least as tightly as the current binop,
1232 // consume it, otherwise we are done.
1233 if (TokPrec &lt; ExprPrec)
1234 return LHS;
1235
1236 // Okay, we know this is a binop.
1237 int BinOp = CurTok;
1238 getNextToken(); // eat binop
1239
1240 // Parse the unary expression after the binary operator.
1241 ExprAST *RHS = ParseUnary();
1242 if (!RHS) return 0;
1243
1244 // If BinOp binds less tightly with RHS than the operator after RHS, let
1245 // the pending operator take RHS as its LHS.
1246 int NextPrec = GetTokPrecedence();
1247 if (TokPrec &lt; NextPrec) {
1248 RHS = ParseBinOpRHS(TokPrec+1, RHS);
1249 if (RHS == 0) return 0;
1250 }
1251
1252 // Merge LHS/RHS.
1253 LHS = new BinaryExprAST(BinOp, LHS, RHS);
1254 }
1255}
1256
1257/// expression
1258/// ::= unary binoprhs
1259///
1260static ExprAST *ParseExpression() {
1261 ExprAST *LHS = ParseUnary();
1262 if (!LHS) return 0;
1263
1264 return ParseBinOpRHS(0, LHS);
1265}
1266
1267/// prototype
1268/// ::= id '(' id* ')'
1269/// ::= binary LETTER number? (id, id)
1270/// ::= unary LETTER (id)
1271static PrototypeAST *ParsePrototype() {
1272 std::string FnName;
1273
Erick Tryzelaarfd1ec5e2009-09-22 21:14:49 +00001274 unsigned Kind = 0; // 0 = identifier, 1 = unary, 2 = binary.
Chris Lattner58f2c872007-11-02 05:42:52 +00001275 unsigned BinaryPrecedence = 30;
1276
1277 switch (CurTok) {
1278 default:
1279 return ErrorP("Expected function name in prototype");
1280 case tok_identifier:
1281 FnName = IdentifierStr;
1282 Kind = 0;
1283 getNextToken();
1284 break;
1285 case tok_unary:
1286 getNextToken();
1287 if (!isascii(CurTok))
1288 return ErrorP("Expected unary operator");
1289 FnName = "unary";
1290 FnName += (char)CurTok;
1291 Kind = 1;
1292 getNextToken();
1293 break;
1294 case tok_binary:
1295 getNextToken();
1296 if (!isascii(CurTok))
1297 return ErrorP("Expected binary operator");
1298 FnName = "binary";
1299 FnName += (char)CurTok;
1300 Kind = 2;
1301 getNextToken();
1302
1303 // Read the precedence if present.
1304 if (CurTok == tok_number) {
1305 if (NumVal &lt; 1 || NumVal &gt; 100)
1306 return ErrorP("Invalid precedecnce: must be 1..100");
1307 BinaryPrecedence = (unsigned)NumVal;
1308 getNextToken();
1309 }
1310 break;
1311 }
1312
1313 if (CurTok != '(')
1314 return ErrorP("Expected '(' in prototype");
1315
1316 std::vector&lt;std::string&gt; ArgNames;
1317 while (getNextToken() == tok_identifier)
1318 ArgNames.push_back(IdentifierStr);
1319 if (CurTok != ')')
1320 return ErrorP("Expected ')' in prototype");
1321
1322 // success.
1323 getNextToken(); // eat ')'.
1324
1325 // Verify right number of names for operator.
1326 if (Kind &amp;&amp; ArgNames.size() != Kind)
1327 return ErrorP("Invalid number of operands for operator");
1328
1329 return new PrototypeAST(FnName, ArgNames, Kind != 0, BinaryPrecedence);
1330}
1331
1332/// definition ::= 'def' prototype expression
1333static FunctionAST *ParseDefinition() {
1334 getNextToken(); // eat def.
1335 PrototypeAST *Proto = ParsePrototype();
1336 if (Proto == 0) return 0;
1337
1338 if (ExprAST *E = ParseExpression())
1339 return new FunctionAST(Proto, E);
1340 return 0;
1341}
1342
1343/// toplevelexpr ::= expression
1344static FunctionAST *ParseTopLevelExpr() {
1345 if (ExprAST *E = ParseExpression()) {
1346 // Make an anonymous proto.
1347 PrototypeAST *Proto = new PrototypeAST("", std::vector&lt;std::string&gt;());
1348 return new FunctionAST(Proto, E);
1349 }
1350 return 0;
1351}
1352
1353/// external ::= 'extern' prototype
1354static PrototypeAST *ParseExtern() {
1355 getNextToken(); // eat extern.
1356 return ParsePrototype();
1357}
1358
1359//===----------------------------------------------------------------------===//
1360// Code Generation
1361//===----------------------------------------------------------------------===//
1362
1363static Module *TheModule;
Owen Andersond1fbd142009-07-08 20:50:47 +00001364static IRBuilder&lt;&gt; Builder(getGlobalContext());
Chris Lattner58f2c872007-11-02 05:42:52 +00001365static std::map&lt;std::string, Value*&gt; NamedValues;
1366static FunctionPassManager *TheFPM;
1367
1368Value *ErrorV(const char *Str) { Error(Str); return 0; }
1369
1370Value *NumberExprAST::Codegen() {
Owen Anderson6f83c9c2009-07-27 20:59:43 +00001371 return ConstantFP::get(getGlobalContext(), APFloat(Val));
Chris Lattner58f2c872007-11-02 05:42:52 +00001372}
1373
1374Value *VariableExprAST::Codegen() {
1375 // Look this variable up in the function.
1376 Value *V = NamedValues[Name];
1377 return V ? V : ErrorV("Unknown variable name");
1378}
1379
1380Value *UnaryExprAST::Codegen() {
1381 Value *OperandV = Operand-&gt;Codegen();
1382 if (OperandV == 0) return 0;
1383
1384 Function *F = TheModule-&gt;getFunction(std::string("unary")+Opcode);
1385 if (F == 0)
1386 return ErrorV("Unknown unary operator");
1387
1388 return Builder.CreateCall(F, OperandV, "unop");
1389}
1390
Chris Lattner58f2c872007-11-02 05:42:52 +00001391Value *BinaryExprAST::Codegen() {
1392 Value *L = LHS-&gt;Codegen();
1393 Value *R = RHS-&gt;Codegen();
1394 if (L == 0 || R == 0) return 0;
1395
1396 switch (Op) {
1397 case '+': return Builder.CreateAdd(L, R, "addtmp");
1398 case '-': return Builder.CreateSub(L, R, "subtmp");
1399 case '*': return Builder.CreateMul(L, R, "multmp");
1400 case '&lt;':
Chris Lattner71155212007-11-06 01:39:12 +00001401 L = Builder.CreateFCmpULT(L, R, "cmptmp");
Chris Lattner58f2c872007-11-02 05:42:52 +00001402 // Convert bool 0/1 to double 0.0 or 1.0
Erick Tryzelaarfd1ec5e2009-09-22 21:14:49 +00001403 return Builder.CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()),
1404 "booltmp");
Chris Lattner58f2c872007-11-02 05:42:52 +00001405 default: break;
1406 }
1407
1408 // If it wasn't a builtin binary operator, it must be a user defined one. Emit
1409 // a call to it.
1410 Function *F = TheModule-&gt;getFunction(std::string("binary")+Op);
1411 assert(F &amp;&amp; "binary operator not found!");
1412
1413 Value *Ops[] = { L, R };
1414 return Builder.CreateCall(F, Ops, Ops+2, "binop");
1415}
1416
1417Value *CallExprAST::Codegen() {
1418 // Look up the name in the global module table.
1419 Function *CalleeF = TheModule-&gt;getFunction(Callee);
1420 if (CalleeF == 0)
1421 return ErrorV("Unknown function referenced");
1422
1423 // If argument mismatch error.
1424 if (CalleeF-&gt;arg_size() != Args.size())
1425 return ErrorV("Incorrect # arguments passed");
1426
1427 std::vector&lt;Value*&gt; ArgsV;
1428 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
1429 ArgsV.push_back(Args[i]-&gt;Codegen());
1430 if (ArgsV.back() == 0) return 0;
1431 }
1432
1433 return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
1434}
1435
1436Value *IfExprAST::Codegen() {
1437 Value *CondV = Cond-&gt;Codegen();
1438 if (CondV == 0) return 0;
1439
1440 // Convert condition to a bool by comparing equal to 0.0.
1441 CondV = Builder.CreateFCmpONE(CondV,
Owen Anderson6f83c9c2009-07-27 20:59:43 +00001442 ConstantFP::get(getGlobalContext(), APFloat(0.0)),
Chris Lattner58f2c872007-11-02 05:42:52 +00001443 "ifcond");
1444
1445 Function *TheFunction = Builder.GetInsertBlock()-&gt;getParent();
1446
1447 // Create blocks for the then and else cases. Insert the 'then' block at the
1448 // end of the function.
Owen Anderson1d0be152009-08-13 21:58:54 +00001449 BasicBlock *ThenBB = BasicBlock::Create(getGlobalContext(), "then", TheFunction);
1450 BasicBlock *ElseBB = BasicBlock::Create(getGlobalContext(), "else");
1451 BasicBlock *MergeBB = BasicBlock::Create(getGlobalContext(), "ifcont");
Chris Lattner58f2c872007-11-02 05:42:52 +00001452
1453 Builder.CreateCondBr(CondV, ThenBB, ElseBB);
1454
1455 // Emit then value.
1456 Builder.SetInsertPoint(ThenBB);
1457
1458 Value *ThenV = Then-&gt;Codegen();
1459 if (ThenV == 0) return 0;
1460
1461 Builder.CreateBr(MergeBB);
1462 // Codegen of 'Then' can change the current block, update ThenBB for the PHI.
1463 ThenBB = Builder.GetInsertBlock();
1464
1465 // Emit else block.
1466 TheFunction-&gt;getBasicBlockList().push_back(ElseBB);
1467 Builder.SetInsertPoint(ElseBB);
1468
1469 Value *ElseV = Else-&gt;Codegen();
1470 if (ElseV == 0) return 0;
1471
1472 Builder.CreateBr(MergeBB);
1473 // Codegen of 'Else' can change the current block, update ElseBB for the PHI.
1474 ElseBB = Builder.GetInsertBlock();
1475
1476 // Emit merge block.
1477 TheFunction-&gt;getBasicBlockList().push_back(MergeBB);
1478 Builder.SetInsertPoint(MergeBB);
Nick Lewycky422094c2009-09-13 21:38:54 +00001479 PHINode *PN = Builder.CreatePHI(Type::getDoubleTy(getGlobalContext()),
1480 "iftmp");
Chris Lattner58f2c872007-11-02 05:42:52 +00001481
1482 PN-&gt;addIncoming(ThenV, ThenBB);
1483 PN-&gt;addIncoming(ElseV, ElseBB);
1484 return PN;
1485}
1486
1487Value *ForExprAST::Codegen() {
1488 // Output this as:
1489 // ...
1490 // start = startexpr
1491 // goto loop
1492 // loop:
1493 // variable = phi [start, loopheader], [nextvariable, loopend]
1494 // ...
1495 // bodyexpr
1496 // ...
1497 // loopend:
1498 // step = stepexpr
1499 // nextvariable = variable + step
1500 // endcond = endexpr
1501 // br endcond, loop, endloop
1502 // outloop:
1503
1504 // Emit the start code first, without 'variable' in scope.
1505 Value *StartVal = Start-&gt;Codegen();
1506 if (StartVal == 0) return 0;
1507
1508 // Make the new basic block for the loop header, inserting after current
1509 // block.
1510 Function *TheFunction = Builder.GetInsertBlock()-&gt;getParent();
1511 BasicBlock *PreheaderBB = Builder.GetInsertBlock();
Owen Anderson1d0be152009-08-13 21:58:54 +00001512 BasicBlock *LoopBB = BasicBlock::Create(getGlobalContext(), "loop", TheFunction);
Chris Lattner58f2c872007-11-02 05:42:52 +00001513
1514 // Insert an explicit fall through from the current block to the LoopBB.
1515 Builder.CreateBr(LoopBB);
1516
1517 // Start insertion in LoopBB.
1518 Builder.SetInsertPoint(LoopBB);
1519
1520 // Start the PHI node with an entry for Start.
Owen Anderson1d0be152009-08-13 21:58:54 +00001521 PHINode *Variable = Builder.CreatePHI(Type::getDoubleTy(getGlobalContext()), VarName.c_str());
Chris Lattner58f2c872007-11-02 05:42:52 +00001522 Variable-&gt;addIncoming(StartVal, PreheaderBB);
1523
1524 // Within the loop, the variable is defined equal to the PHI node. If it
1525 // shadows an existing variable, we have to restore it, so save it now.
1526 Value *OldVal = NamedValues[VarName];
1527 NamedValues[VarName] = Variable;
1528
1529 // Emit the body of the loop. This, like any other expr, can change the
1530 // current BB. Note that we ignore the value computed by the body, but don't
1531 // allow an error.
1532 if (Body-&gt;Codegen() == 0)
1533 return 0;
1534
1535 // Emit the step value.
1536 Value *StepVal;
1537 if (Step) {
1538 StepVal = Step-&gt;Codegen();
1539 if (StepVal == 0) return 0;
1540 } else {
1541 // If not specified, use 1.0.
Owen Anderson6f83c9c2009-07-27 20:59:43 +00001542 StepVal = ConstantFP::get(getGlobalContext(), APFloat(1.0));
Chris Lattner58f2c872007-11-02 05:42:52 +00001543 }
1544
1545 Value *NextVar = Builder.CreateAdd(Variable, StepVal, "nextvar");
1546
1547 // Compute the end condition.
1548 Value *EndCond = End-&gt;Codegen();
1549 if (EndCond == 0) return EndCond;
1550
1551 // Convert condition to a bool by comparing equal to 0.0.
1552 EndCond = Builder.CreateFCmpONE(EndCond,
Owen Anderson6f83c9c2009-07-27 20:59:43 +00001553 ConstantFP::get(getGlobalContext(), APFloat(0.0)),
Chris Lattner58f2c872007-11-02 05:42:52 +00001554 "loopcond");
1555
1556 // Create the "after loop" block and insert it.
1557 BasicBlock *LoopEndBB = Builder.GetInsertBlock();
Owen Anderson1d0be152009-08-13 21:58:54 +00001558 BasicBlock *AfterBB = BasicBlock::Create(getGlobalContext(), "afterloop", TheFunction);
Chris Lattner58f2c872007-11-02 05:42:52 +00001559
1560 // Insert the conditional branch into the end of LoopEndBB.
1561 Builder.CreateCondBr(EndCond, LoopBB, AfterBB);
1562
1563 // Any new code will be inserted in AfterBB.
1564 Builder.SetInsertPoint(AfterBB);
1565
1566 // Add a new entry to the PHI node for the backedge.
1567 Variable-&gt;addIncoming(NextVar, LoopEndBB);
1568
1569 // Restore the unshadowed variable.
1570 if (OldVal)
1571 NamedValues[VarName] = OldVal;
1572 else
1573 NamedValues.erase(VarName);
1574
1575
1576 // for expr always returns 0.0.
Owen Anderson1d0be152009-08-13 21:58:54 +00001577 return Constant::getNullValue(Type::getDoubleTy(getGlobalContext()));
Chris Lattner58f2c872007-11-02 05:42:52 +00001578}
1579
1580Function *PrototypeAST::Codegen() {
1581 // Make the function type: double(double,double) etc.
Nick Lewycky422094c2009-09-13 21:38:54 +00001582 std::vector&lt;const Type*&gt; Doubles(Args.size(),
1583 Type::getDoubleTy(getGlobalContext()));
1584 FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
1585 Doubles, false);
Chris Lattner58f2c872007-11-02 05:42:52 +00001586
Gabor Greifdf7d2b42008-04-19 22:25:09 +00001587 Function *F = Function::Create(FT, Function::ExternalLinkage, Name, TheModule);
Chris Lattner58f2c872007-11-02 05:42:52 +00001588
1589 // If F conflicted, there was already something named 'Name'. If it has a
1590 // body, don't allow redefinition or reextern.
1591 if (F-&gt;getName() != Name) {
1592 // Delete the one we just made and get the existing one.
1593 F-&gt;eraseFromParent();
1594 F = TheModule-&gt;getFunction(Name);
1595
1596 // If F already has a body, reject this.
1597 if (!F-&gt;empty()) {
1598 ErrorF("redefinition of function");
1599 return 0;
1600 }
1601
1602 // If F took a different number of args, reject.
1603 if (F-&gt;arg_size() != Args.size()) {
1604 ErrorF("redefinition of function with different # args");
1605 return 0;
1606 }
1607 }
1608
1609 // Set names for all arguments.
1610 unsigned Idx = 0;
1611 for (Function::arg_iterator AI = F-&gt;arg_begin(); Idx != Args.size();
1612 ++AI, ++Idx) {
1613 AI-&gt;setName(Args[Idx]);
1614
1615 // Add arguments to variable symbol table.
1616 NamedValues[Args[Idx]] = AI;
1617 }
1618
1619 return F;
1620}
1621
1622Function *FunctionAST::Codegen() {
1623 NamedValues.clear();
1624
1625 Function *TheFunction = Proto-&gt;Codegen();
1626 if (TheFunction == 0)
1627 return 0;
1628
1629 // If this is an operator, install it.
1630 if (Proto-&gt;isBinaryOp())
1631 BinopPrecedence[Proto-&gt;getOperatorName()] = Proto-&gt;getBinaryPrecedence();
1632
1633 // Create a new basic block to start insertion into.
Owen Anderson1d0be152009-08-13 21:58:54 +00001634 BasicBlock *BB = BasicBlock::Create(getGlobalContext(), "entry", TheFunction);
Chris Lattner58f2c872007-11-02 05:42:52 +00001635 Builder.SetInsertPoint(BB);
1636
1637 if (Value *RetVal = Body-&gt;Codegen()) {
1638 // Finish off the function.
1639 Builder.CreateRet(RetVal);
1640
1641 // Validate the generated code, checking for consistency.
1642 verifyFunction(*TheFunction);
1643
1644 // Optimize the function.
1645 TheFPM-&gt;run(*TheFunction);
1646
1647 return TheFunction;
1648 }
1649
1650 // Error reading body, remove function.
1651 TheFunction-&gt;eraseFromParent();
1652
1653 if (Proto-&gt;isBinaryOp())
1654 BinopPrecedence.erase(Proto-&gt;getOperatorName());
1655 return 0;
1656}
1657
1658//===----------------------------------------------------------------------===//
1659// Top-Level parsing and JIT Driver
1660//===----------------------------------------------------------------------===//
1661
1662static ExecutionEngine *TheExecutionEngine;
1663
1664static void HandleDefinition() {
1665 if (FunctionAST *F = ParseDefinition()) {
1666 if (Function *LF = F-&gt;Codegen()) {
1667 fprintf(stderr, "Read function definition:");
1668 LF-&gt;dump();
1669 }
1670 } else {
1671 // Skip token for error recovery.
1672 getNextToken();
1673 }
1674}
1675
1676static void HandleExtern() {
1677 if (PrototypeAST *P = ParseExtern()) {
1678 if (Function *F = P-&gt;Codegen()) {
1679 fprintf(stderr, "Read extern: ");
1680 F-&gt;dump();
1681 }
1682 } else {
1683 // Skip token for error recovery.
1684 getNextToken();
1685 }
1686}
1687
1688static void HandleTopLevelExpression() {
Erick Tryzelaarfd1ec5e2009-09-22 21:14:49 +00001689 // Evaluate a top-level expression into an anonymous function.
Chris Lattner58f2c872007-11-02 05:42:52 +00001690 if (FunctionAST *F = ParseTopLevelExpr()) {
1691 if (Function *LF = F-&gt;Codegen()) {
1692 // JIT the function, returning a function pointer.
1693 void *FPtr = TheExecutionEngine-&gt;getPointerToFunction(LF);
1694
1695 // Cast it to the right type (takes no arguments, returns a double) so we
1696 // can call it as a native function.
Nick Lewycky422094c2009-09-13 21:38:54 +00001697 double (*FP)() = (double (*)())(intptr_t)FPtr;
Chris Lattner58f2c872007-11-02 05:42:52 +00001698 fprintf(stderr, "Evaluated to %f\n", FP());
1699 }
1700 } else {
1701 // Skip token for error recovery.
1702 getNextToken();
1703 }
1704}
1705
1706/// top ::= definition | external | expression | ';'
1707static void MainLoop() {
1708 while (1) {
1709 fprintf(stderr, "ready&gt; ");
1710 switch (CurTok) {
1711 case tok_eof: return;
Erick Tryzelaarfd1ec5e2009-09-22 21:14:49 +00001712 case ';': getNextToken(); break; // ignore top-level semicolons.
Chris Lattner58f2c872007-11-02 05:42:52 +00001713 case tok_def: HandleDefinition(); break;
1714 case tok_extern: HandleExtern(); break;
1715 default: HandleTopLevelExpression(); break;
1716 }
1717 }
1718}
1719
Chris Lattner58f2c872007-11-02 05:42:52 +00001720//===----------------------------------------------------------------------===//
1721// "Library" functions that can be "extern'd" from user code.
1722//===----------------------------------------------------------------------===//
1723
1724/// putchard - putchar that takes a double and returns 0.
1725extern "C"
1726double putchard(double X) {
1727 putchar((char)X);
1728 return 0;
1729}
1730
1731/// printd - printf that takes a double prints it as "%f\n", returning 0.
1732extern "C"
1733double printd(double X) {
1734 printf("%f\n", X);
1735 return 0;
1736}
1737
1738//===----------------------------------------------------------------------===//
1739// Main driver code.
1740//===----------------------------------------------------------------------===//
1741
1742int main() {
Erick Tryzelaarfd1ec5e2009-09-22 21:14:49 +00001743 InitializeNativeTarget();
1744 LLVMContext &amp;Context = getGlobalContext();
1745
Chris Lattner58f2c872007-11-02 05:42:52 +00001746 // Install standard binary operators.
1747 // 1 is lowest precedence.
1748 BinopPrecedence['&lt;'] = 10;
1749 BinopPrecedence['+'] = 20;
1750 BinopPrecedence['-'] = 20;
1751 BinopPrecedence['*'] = 40; // highest.
1752
1753 // Prime the first token.
1754 fprintf(stderr, "ready&gt; ");
1755 getNextToken();
1756
1757 // Make the module, which holds all the code.
Erick Tryzelaarfd1ec5e2009-09-22 21:14:49 +00001758 TheModule = new Module("my cool jit", Context);
Chris Lattner58f2c872007-11-02 05:42:52 +00001759
Reid Kleckner60130f02009-08-26 20:58:25 +00001760 ExistingModuleProvider *OurModuleProvider =
1761 new ExistingModuleProvider(TheModule);
Chris Lattner58f2c872007-11-02 05:42:52 +00001762
Reid Kleckner60130f02009-08-26 20:58:25 +00001763 // Create the JIT. This takes ownership of the module and module provider.
1764 TheExecutionEngine = EngineBuilder(OurModuleProvider).create();
1765
1766 FunctionPassManager OurFPM(OurModuleProvider);
1767
1768 // Set up the optimizer pipeline. Start with registering info about how the
1769 // target lays out data structures.
1770 OurFPM.add(new TargetData(*TheExecutionEngine-&gt;getTargetData()));
1771 // Do simple "peephole" optimizations and bit-twiddling optzns.
1772 OurFPM.add(createInstructionCombiningPass());
1773 // Reassociate expressions.
1774 OurFPM.add(createReassociatePass());
1775 // Eliminate Common SubExpressions.
1776 OurFPM.add(createGVNPass());
1777 // Simplify the control flow graph (deleting unreachable blocks, etc).
1778 OurFPM.add(createCFGSimplificationPass());
1779
Nick Lewycky422094c2009-09-13 21:38:54 +00001780 OurFPM.doInitialization();
1781
Reid Kleckner60130f02009-08-26 20:58:25 +00001782 // Set the global so the code gen can use this.
1783 TheFPM = &amp;OurFPM;
1784
1785 // Run the main "interpreter loop" now.
1786 MainLoop();
1787
1788 TheFPM = 0;
1789
1790 // Print out all of the generated code.
1791 TheModule-&gt;dump();
1792
Chris Lattner58f2c872007-11-02 05:42:52 +00001793 return 0;
1794}
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +00001795</pre>
1796</div>
1797
Chris Lattner729eb142008-02-10 19:11:04 +00001798<a href="LangImpl7.html">Next: Extending the language: mutable variables / SSA construction</a>
Chris Lattnerc9d5d2c2007-11-01 06:49:54 +00001799</div>
1800
1801<!-- *********************************************************************** -->
1802<hr>
1803<address>
1804 <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
1805 src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a>
1806 <a href="http://validator.w3.org/check/referer"><img
1807 src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
1808
1809 <a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
1810 <a href="http://llvm.org">The LLVM Compiler Infrastructure</a><br>
1811 Last modified: $Date: 2007-10-17 11:05:13 -0700 (Wed, 17 Oct 2007) $
1812</address>
1813</body>
1814</html>