1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
6 <title>Kaleidoscope: Extending the Language: User-defined Operators</title>
7 <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">
14 <div class="doc_title">Kaleidoscope: Extending the Language: User-defined Operators</div>
17 <li><a href="index.html">Up to Tutorial Index</a></li>
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>
28 <li><a href="LangImpl7.html">Chapter 7</a>: Extending the Language: Mutable
29 Variables / SSA Construction</li>
32 <div class="doc_author">
33 <p>Written by <a href="mailto:sabre@nondot.org">Chris Lattner</a></p>
36 <!-- *********************************************************************** -->
37 <div class="doc_section"><a name="intro">Chapter 6 Introduction</a></div>
38 <!-- *********************************************************************** -->
40 <div class="doc_text">
42 <p>Welcome to Chapter 6 of the "<a href="index.html">Implementing a language
43 with LLVM</a>" tutorial. At this point in our tutorial, we now have a fully
44 functional language that is fairly minimal, but also useful. There
45 is still one big problem with it, however. Our language doesn't have many
46 useful operators (like division, logical negation, or even any comparisons
47 besides less-than).</p>
49 <p>This chapter of the tutorial takes a wild digression into adding user-defined
50 operators to the simple and beautiful Kaleidoscope language. This digression now gives
51 us a simple and ugly language in some ways, but also a powerful one at the same time.
52 One of the great things about creating your own language is that you get to
53 decide what is good or bad. In this tutorial we'll assume that it is okay to
54 use this as a way to show some interesting parsing techniques.</p>
56 <p>At the end of this tutorial, we'll run through an example Kaleidoscope
57 application that <a href="#example">renders the Mandelbrot set</a>. This gives
58 an example of what you can build with Kaleidoscope and its feature set.</p>
62 <!-- *********************************************************************** -->
63 <div class="doc_section"><a name="idea">User-defined Operators: the Idea</a></div>
64 <!-- *********************************************************************** -->
66 <div class="doc_text">
69 The "operator overloading" that we will add to Kaleidoscope is more general than
70 languages like C++. In C++, you are only allowed to redefine existing
71 operators: you can't programatically change the grammar, introduce new
72 operators, change precedence levels, etc. In this chapter, we will add this
73 capability to Kaleidoscope, which will let the user round out the set of
74 operators that are supported.</p>
76 <p>The point of going into user-defined operators in a tutorial like this is to
77 show the power and flexibility of using a hand-written parser. Thus far, the parser
78 we have been implementing uses recursive descent for most parts of the grammar and
79 operator precedence parsing for the expressions. See <a
80 href="LangImpl2.html">Chapter 2</a> for details. Without using operator
81 precedence parsing, it would be very difficult to allow the programmer to
82 introduce new operators into the grammar: the grammar is dynamically extensible
85 <p>The two specific features we'll add are programmable unary operators (right
86 now, Kaleidoscope has no unary operators at all) as well as binary operators.
87 An example of this is:</p>
89 <div class="doc_code">
98 # Define > with the same precedence as <.
99 def binary> 10 (LHS RHS)
102 # Binary "logical or", (note that it does not "short circuit")
103 def binary| 5 (LHS RHS)
111 # Define = with slightly lower precedence than relationals.
112 def binary= 9 (LHS RHS)
113 !(LHS < RHS | LHS > RHS);
117 <p>Many languages aspire to being able to implement their standard runtime
118 library in the language itself. In Kaleidoscope, we can implement significant
119 parts of the language in the library!</p>
121 <p>We will break down implementation of these features into two parts:
122 implementing support for user-defined binary operators and adding unary
127 <!-- *********************************************************************** -->
128 <div class="doc_section"><a name="binary">User-defined Binary Operators</a></div>
129 <!-- *********************************************************************** -->
131 <div class="doc_text">
133 <p>Adding support for user-defined binary operators is pretty simple with our
134 current framework. We'll first add support for the unary/binary keywords:</p>
136 <div class="doc_code">
141 tok_binary = -11, tok_unary = -12</b>
144 static int gettok() {
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;
154 <p>This just adds lexer support for the unary and binary keywords, like we
155 did in <a href="LangImpl5.html#iflexer">previous chapters</a>. One nice thing
156 about our current AST, is that we represent binary operators with full generalisation
157 by using their ASCII code as the opcode. For our extended operators, we'll use this
158 same representation, so we don't need any new AST or parser support.</p>
160 <p>On the other hand, we have to be able to represent the definitions of these
161 new operators, in the "def binary| 5" part of the function definition. In our
162 grammar so far, the "name" for the function definition is parsed as the
163 "prototype" production and into the <tt>PrototypeAST</tt> AST node. To
164 represent our new user-defined operators as prototypes, we have to extend
165 the <tt>PrototypeAST</tt> AST node like this:</p>
167 <div class="doc_code">
169 /// PrototypeAST - This class represents the "prototype" for a function,
170 /// which captures its argument names as well as if it is an operator.
173 std::vector<std::string> Args;
175 unsigned Precedence; // Precedence if a binary op.</b>
177 PrototypeAST(const std::string &name, const std::vector<std::string> &args,
178 <b>bool isoperator = false, unsigned prec = 0</b>)
179 : Name(name), Args(args), <b>isOperator(isoperator), Precedence(prec)</b> {}
181 <b>bool isUnaryOp() const { return isOperator && Args.size() == 1; }
182 bool isBinaryOp() const { return isOperator && Args.size() == 2; }
184 char getOperatorName() const {
185 assert(isUnaryOp() || isBinaryOp());
186 return Name[Name.size()-1];
189 unsigned getBinaryPrecedence() const { return Precedence; }</b>
196 <p>Basically, in addition to knowing a name for the prototype, we now keep track
197 of whether it was an operator, and if it was, what precedence level the operator
198 is at. The precedence is only used for binary operators (as you'll see below,
199 it just doesn't apply for unary operators). Now that we have a way to represent
200 the prototype for a user-defined operator, we need to parse it:</p>
202 <div class="doc_code">
205 /// ::= id '(' id* ')'
206 <b>/// ::= binary LETTER number? (id, id)</b>
207 static PrototypeAST *ParsePrototype() {
210 <b>int Kind = 0; // 0 = identifier, 1 = unary, 2 = binary.
211 unsigned BinaryPrecedence = 30;</b>
215 return ErrorP("Expected function name in prototype");
217 FnName = IdentifierStr;
223 if (!isascii(CurTok))
224 return ErrorP("Expected binary operator");
226 FnName += (char)CurTok;
230 // Read the precedence if present.
231 if (CurTok == tok_number) {
232 if (NumVal < 1 || NumVal > 100)
233 return ErrorP("Invalid precedecnce: must be 1..100");
234 BinaryPrecedence = (unsigned)NumVal;
241 return ErrorP("Expected '(' in prototype");
243 std::vector<std::string> ArgNames;
244 while (getNextToken() == tok_identifier)
245 ArgNames.push_back(IdentifierStr);
247 return ErrorP("Expected ')' in prototype");
250 getNextToken(); // eat ')'.
252 <b>// Verify right number of names for operator.
253 if (Kind && ArgNames.size() != Kind)
254 return ErrorP("Invalid number of operands for operator");
256 return new PrototypeAST(FnName, ArgNames, Kind != 0, BinaryPrecedence);</b>
261 <p>This is all fairly straightforward parsing code, and we have already seen
262 a lot of similar code in the past. One interesting part about the code above is
263 the couple lines that set up <tt>FnName</tt> for binary operators. This builds names
264 like "binary@" for a newly defined "@" operator. This then takes advantage of the
265 fact that symbol names in the LLVM symbol table are allowed to have any character in
266 them, including embedded nul characters.</p>
268 <p>The next interesting thing to add, is codegen support for these binary operators.
269 Given our current structure, this is a simple addition of a default case for our
270 existing binary operator node:</p>
272 <div class="doc_code">
274 Value *BinaryExprAST::Codegen() {
275 Value *L = LHS->Codegen();
276 Value *R = RHS->Codegen();
277 if (L == 0 || R == 0) return 0;
280 case '+': return Builder.CreateAdd(L, R, "addtmp");
281 case '-': return Builder.CreateSub(L, R, "subtmp");
282 case '*': return Builder.CreateMul(L, R, "multmp");
284 L = Builder.CreateFCmpULT(L, R, "cmptmp");
285 // Convert bool 0/1 to double 0.0 or 1.0
286 return Builder.CreateUIToFP(L, Type::DoubleTy, "booltmp");
287 <b>default: break;</b>
290 <b>// If it wasn't a builtin binary operator, it must be a user defined one. Emit
292 Function *F = TheModule->getFunction(std::string("binary")+Op);
293 assert(F && "binary operator not found!");
295 Value *Ops[] = { L, R };
296 return Builder.CreateCall(F, Ops, Ops+2, "binop");</b>
302 <p>As you can see above, the new code is actually really simple. It just does
303 a lookup for the appropriate operator in the symbol table and generates a
304 function call to it. Since user-defined operators are just built as normal
305 functions (because the "prototype" boils down to a function with the right
306 name) everything falls into place.</p>
308 <p>The final piece of code we are missing, is a bit of top level magic:</p>
310 <div class="doc_code">
312 Function *FunctionAST::Codegen() {
315 Function *TheFunction = Proto->Codegen();
316 if (TheFunction == 0)
319 <b>// If this is an operator, install it.
320 if (Proto->isBinaryOp())
321 BinopPrecedence[Proto->getOperatorName()] = Proto->getBinaryPrecedence();</b>
323 // Create a new basic block to start insertion into.
324 BasicBlock *BB = BasicBlock::Create("entry", TheFunction);
325 Builder.SetInsertPoint(BB);
327 if (Value *RetVal = Body->Codegen()) {
332 <p>Basically, before codegening a function, if it is a user-defined operator, we
333 register it in the precedence table. This allows the binary operator parsing
334 logic 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>
336 <p>Now we have useful user-defined binary operators. This builds a lot
337 on the previous framework we built for other operators. Adding unary operators
338 is a bit more challenging, because we don't have any framework for it yet - lets
339 see what it takes.</p>
343 <!-- *********************************************************************** -->
344 <div class="doc_section"><a name="unary">User-defined Unary Operators</a></div>
345 <!-- *********************************************************************** -->
347 <div class="doc_text">
349 <p>Since we don't currently support unary operators in the Kaleidoscope
350 language, we'll need to add everything to support them. Above, we added simple
351 support for the 'unary' keyword to the lexer. In addition to that, we need an
354 <div class="doc_code">
356 /// UnaryExprAST - Expression class for a unary operator.
357 class UnaryExprAST : public ExprAST {
361 UnaryExprAST(char opcode, ExprAST *operand)
362 : Opcode(opcode), Operand(operand) {}
363 virtual Value *Codegen();
368 <p>This AST node is very simple and obvious by now. It directly mirrors the
369 binary operator AST node, except that it only has one child. With this, we
370 need to add the parsing logic. Parsing a unary operator is pretty simple: we'll
371 add a new function to do it:</p>
373 <div class="doc_code">
378 static ExprAST *ParseUnary() {
379 // If the current token is not an operator, it must be a primary expr.
380 if (!isascii(CurTok) || CurTok == '(' || CurTok == ',')
381 return ParsePrimary();
383 // If this is a unary operator, read it.
386 if (ExprAST *Operand = ParseUnary())
387 return new UnaryExprAST(Opc, Operand);
393 <p>The grammar we add is pretty straightforward here. If we see a unary
394 operator when parsing a primary operator, we eat the operator as a prefix and
395 parse the remaining piece as another unary operator. This allows us to handle
396 multiple unary operators (e.g. "!!x"). Note that unary operators can't have
397 ambiguous parses like binary operators can, so there is no need for precedence
400 <p>The problem with this function, is that we need to call ParseUnary from somewhere.
401 To do this, we change previous callers of ParsePrimary to call ParseUnary
404 <div class="doc_code">
408 static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
410 <b>// Parse the unary expression after the binary operator.
411 ExprAST *RHS = ParseUnary();
412 if (!RHS) return 0;</b>
416 /// ::= unary binoprhs
418 static ExprAST *ParseExpression() {
419 <b>ExprAST *LHS = ParseUnary();</b>
422 return ParseBinOpRHS(0, LHS);
427 <p>With these two simple changes, we are now able to parse unary operators and build the
428 AST for them. Next up, we need to add parser support for prototypes, to parse
429 the unary operator prototype. We extend the binary operator code above
432 <div class="doc_code">
435 /// ::= id '(' id* ')'
436 /// ::= binary LETTER number? (id, id)
437 <b>/// ::= unary LETTER (id)</b>
438 static PrototypeAST *ParsePrototype() {
441 int Kind = 0; // 0 = identifier, 1 = unary, 2 = binary.
442 unsigned BinaryPrecedence = 30;
446 return ErrorP("Expected function name in prototype");
448 FnName = IdentifierStr;
454 if (!isascii(CurTok))
455 return ErrorP("Expected unary operator");
457 FnName += (char)CurTok;
466 <p>As with binary operators, we name unary operators with a name that includes
467 the operator character. This assists us at code generation time. Speaking of,
468 the final piece we need to add is codegen support for unary operators. It looks
471 <div class="doc_code">
473 Value *UnaryExprAST::Codegen() {
474 Value *OperandV = Operand->Codegen();
475 if (OperandV == 0) return 0;
477 Function *F = TheModule->getFunction(std::string("unary")+Opcode);
479 return ErrorV("Unknown unary operator");
481 return Builder.CreateCall(F, OperandV, "unop");
486 <p>This code is similar to, but simpler than, the code for binary operators. It
487 is simpler primarily because it doesn't need to handle any predefined operators.
492 <!-- *********************************************************************** -->
493 <div class="doc_section"><a name="example">Kicking the Tires</a></div>
494 <!-- *********************************************************************** -->
496 <div class="doc_text">
498 <p>It is somewhat hard to believe, but with a few simple extensions we've
499 covered in the last chapters, we have grown a real-ish language. With this, we
500 can do a lot of interesting things, including I/O, math, and a bunch of other
501 things. For example, we can now add a nice sequencing operator (printd is
502 defined to print out the specified value and a newline):</p>
504 <div class="doc_code">
506 ready> <b>extern printd(x);</b>
507 Read extern: declare double @printd(double)
508 ready> <b>def binary : 1 (x y) 0; # Low-precedence operator that ignores operands.</b>
510 ready> <b>printd(123) : printd(456) : printd(789);</b>
514 Evaluated to 0.000000
518 <p>We can also define a bunch of other "primitive" operations, such as:</p>
520 <div class="doc_code">
533 # Define > with the same precedence as >.
534 def binary> 10 (LHS RHS)
537 # Binary logical or, which does not short circuit.
538 def binary| 5 (LHS RHS)
546 # Binary logical and, which does not short circuit.
547 def binary& 6 (LHS RHS)
553 # Define = with slightly lower precedence than relationals.
554 def binary = 9 (LHS RHS)
555 !(LHS < RHS | LHS > RHS);
561 <p>Given the previous if/then/else support, we can also define interesting
562 functions for I/O. For example, the following prints out a character whose
563 "density" reflects the value passed in: the lower the value, the denser the
566 <div class="doc_code">
570 extern putchard(char)
574 else if d > 4 then
576 else if d > 2 then
579 putchard(42); # '*'</b>
581 ready> <b>printdensity(1): printdensity(2): printdensity(3) :
582 printdensity(4): printdensity(5): printdensity(9): putchard(10);</b>
584 Evaluated to 0.000000
588 <p>Based on these simple primitive operations, we can start to define more
589 interesting things. For example, here's a little function that solves for the
590 number of iterations it takes a function in the complex plane to
593 <div class="doc_code">
595 # determine whether the specific location diverges.
596 # Solve for z = z^2 + c in the complex plane.
597 def mandleconverger(real imag iters creal cimag)
598 if iters > 255 | (real*real + imag*imag > 4) then
601 mandleconverger(real*real - imag*imag + creal,
603 iters+1, creal, cimag);
605 # return the number of iterations required for the iteration to escape
606 def mandleconverge(real imag)
607 mandleconverger(real, imag, 0, real, imag);
611 <p>This "z = z<sup>2</sup> + c" function is a beautiful little creature that is the basis
612 for computation of the <a
613 href="http://en.wikipedia.org/wiki/Mandelbrot_set">Mandelbrot Set</a>. Our
614 <tt>mandelconverge</tt> function returns the number of iterations that it takes
615 for a complex orbit to escape, saturating to 255. This is not a very useful
616 function by itself, but if you plot its value over a two-dimensional plane,
617 you can see the Mandelbrot set. Given that we are limited to using putchard
618 here, our amazing graphical output is limited, but we can whip together
619 something using the density plotter above:</p>
621 <div class="doc_code">
623 # compute and plot the mandlebrot set with the specified 2 dimensional range
625 def mandelhelp(xmin xmax xstep ymin ymax ystep)
626 for y = ymin, y < ymax, ystep in (
627 (for x = xmin, x < xmax, xstep in
628 printdensity(mandleconverge(x,y)))
632 # mandel - This is a convenient helper function for ploting the mandelbrot set
633 # from the specified position with the specified Magnification.
634 def mandel(realstart imagstart realmag imagmag)
635 mandelhelp(realstart, realstart+realmag*78, realmag,
636 imagstart, imagstart+imagmag*40, imagmag);
640 <p>Given this, we can try plotting out the mandlebrot set! Lets try it out:</p>
642 <div class="doc_code">
644 ready> <b>mandel(-2.3, -1.3, 0.05, 0.07);</b>
645 *******************************+++++++++++*************************************
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 Evaluated to 0.000000
687 ready> <b>mandel(-2, -1, 0.02, 0.04);</b>
688 **************************+++++++++++++++++++++++++++++++++++++++++++++++++++++
689 ***********************++++++++++++++++++++++++++++++++++++++++++++++++++++++++
690 *********************+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
691 *******************+++++++++++++++++++++++++++++++++++++++++++++++++++++++++...
692 *****************+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.....
693 ***************++++++++++++++++++++++++++++++++++++++++++++++++++++++++........
694 **************++++++++++++++++++++++++++++++++++++++++++++++++++++++...........
695 ************+++++++++++++++++++++++++++++++++++++++++++++++++++++..............
696 ***********++++++++++++++++++++++++++++++++++++++++++++++++++........ .
697 **********++++++++++++++++++++++++++++++++++++++++++++++.............
698 ********+++++++++++++++++++++++++++++++++++++++++++..................
699 *******+++++++++++++++++++++++++++++++++++++++.......................
700 ******+++++++++++++++++++++++++++++++++++...........................
701 *****++++++++++++++++++++++++++++++++............................
702 *****++++++++++++++++++++++++++++...............................
703 ****++++++++++++++++++++++++++...... .........................
704 ***++++++++++++++++++++++++......... ...... ...........
705 ***++++++++++++++++++++++............
706 **+++++++++++++++++++++..............
707 **+++++++++++++++++++................
708 *++++++++++++++++++.................
709 *++++++++++++++++............ ...
710 *++++++++++++++..............
711 *+++....++++................
712 *.......... ...........
714 *.......... ...........
715 *+++....++++................
716 *++++++++++++++..............
717 *++++++++++++++++............ ...
718 *++++++++++++++++++.................
719 **+++++++++++++++++++................
720 **+++++++++++++++++++++..............
721 ***++++++++++++++++++++++............
722 ***++++++++++++++++++++++++......... ...... ...........
723 ****++++++++++++++++++++++++++...... .........................
724 *****++++++++++++++++++++++++++++...............................
725 *****++++++++++++++++++++++++++++++++............................
726 ******+++++++++++++++++++++++++++++++++++...........................
727 *******+++++++++++++++++++++++++++++++++++++++.......................
728 ********+++++++++++++++++++++++++++++++++++++++++++..................
729 Evaluated to 0.000000
730 ready> <b>mandel(-0.9, -1.4, 0.02, 0.03);</b>
731 *******************************************************************************
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 ......... ....+++++++
772 Evaluated to 0.000000
777 <p>At this point, you may be starting to realize that Kaleidoscope is a real
778 and powerful language. It may not be self-similar :), but it can be used to
779 plot things that are!</p>
781 <p>With this, we conclude the "adding user-defined operators" chapter of the
782 tutorial. We have successfully augmented our language, adding the ability to extend the
783 language in the library, and we have shown how this can be used to build a simple but
784 interesting end-user application in Kaleidoscope. At this point, Kaleidoscope
785 can build a variety of applications that are functional and can call functions
786 with side-effects, but it can't actually define and mutate a variable itself.
789 <p>Strikingly, variable mutation is an important feature of some
790 languages, and it is not at all obvious how to <a href="LangImpl7.html">add
791 support for mutable variables</a> without having to add an "SSA construction"
792 phase to your front-end. In the next chapter, we will describe how you can
793 add variable mutation without building SSA in your front-end.</p>
798 <!-- *********************************************************************** -->
799 <div class="doc_section"><a name="code">Full Code Listing</a></div>
800 <!-- *********************************************************************** -->
802 <div class="doc_text">
805 Here is the complete code listing for our running example, enhanced with the
806 if/then/else and for expressions.. To build this example, use:
809 <div class="doc_code">
812 g++ -g toy.cpp `llvm-config --cppflags --ldflags --libs core jit native` -O3 -o toy
818 <p>Here is the code:</p>
820 <div class="doc_code">
822 #include "llvm/DerivedTypes.h"
823 #include "llvm/ExecutionEngine/ExecutionEngine.h"
824 #include "llvm/LLVMContext.h"
825 #include "llvm/Module.h"
826 #include "llvm/ModuleProvider.h"
827 #include "llvm/PassManager.h"
828 #include "llvm/Analysis/Verifier.h"
829 #include "llvm/Target/TargetData.h"
830 #include "llvm/Transforms/Scalar.h"
831 #include "llvm/Support/IRBuilder.h"
832 #include <cstdio>
833 #include <string>
835 #include <vector>
836 using namespace llvm;
838 //===----------------------------------------------------------------------===//
840 //===----------------------------------------------------------------------===//
842 // The lexer returns tokens [0-255] if it is an unknown character, otherwise one
843 // of these for known things.
848 tok_def = -2, tok_extern = -3,
851 tok_identifier = -4, tok_number = -5,
854 tok_if = -6, tok_then = -7, tok_else = -8,
855 tok_for = -9, tok_in = -10,
858 tok_binary = -11, tok_unary = -12
861 static std::string IdentifierStr; // Filled in if tok_identifier
862 static double NumVal; // Filled in if tok_number
864 /// gettok - Return the next token from standard input.
865 static int gettok() {
866 static int LastChar = ' ';
868 // Skip any whitespace.
869 while (isspace(LastChar))
870 LastChar = getchar();
872 if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
873 IdentifierStr = LastChar;
874 while (isalnum((LastChar = getchar())))
875 IdentifierStr += LastChar;
877 if (IdentifierStr == "def") return tok_def;
878 if (IdentifierStr == "extern") return tok_extern;
879 if (IdentifierStr == "if") return tok_if;
880 if (IdentifierStr == "then") return tok_then;
881 if (IdentifierStr == "else") return tok_else;
882 if (IdentifierStr == "for") return tok_for;
883 if (IdentifierStr == "in") return tok_in;
884 if (IdentifierStr == "binary") return tok_binary;
885 if (IdentifierStr == "unary") return tok_unary;
886 return tok_identifier;
889 if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
893 LastChar = getchar();
894 } while (isdigit(LastChar) || LastChar == '.');
896 NumVal = strtod(NumStr.c_str(), 0);
900 if (LastChar == '#') {
901 // Comment until end of line.
902 do LastChar = getchar();
903 while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
909 // Check for end of file. Don't eat the EOF.
913 // Otherwise, just return the character as its ascii value.
914 int ThisChar = LastChar;
915 LastChar = getchar();
919 //===----------------------------------------------------------------------===//
920 // Abstract Syntax Tree (aka Parse Tree)
921 //===----------------------------------------------------------------------===//
923 /// ExprAST - Base class for all expression nodes.
926 virtual ~ExprAST() {}
927 virtual Value *Codegen() = 0;
930 /// NumberExprAST - Expression class for numeric literals like "1.0".
931 class NumberExprAST : public ExprAST {
934 NumberExprAST(double val) : Val(val) {}
935 virtual Value *Codegen();
938 /// VariableExprAST - Expression class for referencing a variable, like "a".
939 class VariableExprAST : public ExprAST {
942 VariableExprAST(const std::string &name) : Name(name) {}
943 virtual Value *Codegen();
946 /// UnaryExprAST - Expression class for a unary operator.
947 class UnaryExprAST : public ExprAST {
951 UnaryExprAST(char opcode, ExprAST *operand)
952 : Opcode(opcode), Operand(operand) {}
953 virtual Value *Codegen();
956 /// BinaryExprAST - Expression class for a binary operator.
957 class BinaryExprAST : public ExprAST {
961 BinaryExprAST(char op, ExprAST *lhs, ExprAST *rhs)
962 : Op(op), LHS(lhs), RHS(rhs) {}
963 virtual Value *Codegen();
966 /// CallExprAST - Expression class for function calls.
967 class CallExprAST : public ExprAST {
969 std::vector<ExprAST*> Args;
971 CallExprAST(const std::string &callee, std::vector<ExprAST*> &args)
972 : Callee(callee), Args(args) {}
973 virtual Value *Codegen();
976 /// IfExprAST - Expression class for if/then/else.
977 class IfExprAST : public ExprAST {
978 ExprAST *Cond, *Then, *Else;
980 IfExprAST(ExprAST *cond, ExprAST *then, ExprAST *_else)
981 : Cond(cond), Then(then), Else(_else) {}
982 virtual Value *Codegen();
985 /// ForExprAST - Expression class for for/in.
986 class ForExprAST : public ExprAST {
988 ExprAST *Start, *End, *Step, *Body;
990 ForExprAST(const std::string &varname, ExprAST *start, ExprAST *end,
991 ExprAST *step, ExprAST *body)
992 : VarName(varname), Start(start), End(end), Step(step), Body(body) {}
993 virtual Value *Codegen();
996 /// PrototypeAST - This class represents the "prototype" for a function,
997 /// which captures its argument names as well as if it is an operator.
1000 std::vector<std::string> Args;
1002 unsigned Precedence; // Precedence if a binary op.
1004 PrototypeAST(const std::string &name, const std::vector<std::string> &args,
1005 bool isoperator = false, unsigned prec = 0)
1006 : Name(name), Args(args), isOperator(isoperator), Precedence(prec) {}
1008 bool isUnaryOp() const { return isOperator && Args.size() == 1; }
1009 bool isBinaryOp() const { return isOperator && Args.size() == 2; }
1011 char getOperatorName() const {
1012 assert(isUnaryOp() || isBinaryOp());
1013 return Name[Name.size()-1];
1016 unsigned getBinaryPrecedence() const { return Precedence; }
1018 Function *Codegen();
1021 /// FunctionAST - This class represents a function definition itself.
1023 PrototypeAST *Proto;
1026 FunctionAST(PrototypeAST *proto, ExprAST *body)
1027 : Proto(proto), Body(body) {}
1029 Function *Codegen();
1032 //===----------------------------------------------------------------------===//
1034 //===----------------------------------------------------------------------===//
1036 /// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
1037 /// token the parser it looking at. getNextToken reads another token from the
1038 /// lexer and updates CurTok with its results.
1040 static int getNextToken() {
1041 return CurTok = gettok();
1044 /// BinopPrecedence - This holds the precedence for each binary operator that is
1046 static std::map<char, int> BinopPrecedence;
1048 /// GetTokPrecedence - Get the precedence of the pending binary operator token.
1049 static int GetTokPrecedence() {
1050 if (!isascii(CurTok))
1053 // Make sure it's a declared binop.
1054 int TokPrec = BinopPrecedence[CurTok];
1055 if (TokPrec <= 0) return -1;
1059 /// Error* - These are little helper functions for error handling.
1060 ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
1061 PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
1062 FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }
1064 static ExprAST *ParseExpression();
1068 /// ::= identifier '(' expression* ')'
1069 static ExprAST *ParseIdentifierExpr() {
1070 std::string IdName = IdentifierStr;
1072 getNextToken(); // eat identifier.
1074 if (CurTok != '(') // Simple variable ref.
1075 return new VariableExprAST(IdName);
1078 getNextToken(); // eat (
1079 std::vector<ExprAST*> Args;
1080 if (CurTok != ')') {
1082 ExprAST *Arg = ParseExpression();
1084 Args.push_back(Arg);
1086 if (CurTok == ')') break;
1089 return Error("Expected ')' or ',' in argument list");
1097 return new CallExprAST(IdName, Args);
1100 /// numberexpr ::= number
1101 static ExprAST *ParseNumberExpr() {
1102 ExprAST *Result = new NumberExprAST(NumVal);
1103 getNextToken(); // consume the number
1107 /// parenexpr ::= '(' expression ')'
1108 static ExprAST *ParseParenExpr() {
1109 getNextToken(); // eat (.
1110 ExprAST *V = ParseExpression();
1114 return Error("expected ')'");
1115 getNextToken(); // eat ).
1119 /// ifexpr ::= 'if' expression 'then' expression 'else' expression
1120 static ExprAST *ParseIfExpr() {
1121 getNextToken(); // eat the if.
1124 ExprAST *Cond = ParseExpression();
1125 if (!Cond) return 0;
1127 if (CurTok != tok_then)
1128 return Error("expected then");
1129 getNextToken(); // eat the then
1131 ExprAST *Then = ParseExpression();
1132 if (Then == 0) return 0;
1134 if (CurTok != tok_else)
1135 return Error("expected else");
1139 ExprAST *Else = ParseExpression();
1140 if (!Else) return 0;
1142 return new IfExprAST(Cond, Then, Else);
1145 /// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
1146 static ExprAST *ParseForExpr() {
1147 getNextToken(); // eat the for.
1149 if (CurTok != tok_identifier)
1150 return Error("expected identifier after for");
1152 std::string IdName = IdentifierStr;
1153 getNextToken(); // eat identifier.
1156 return Error("expected '=' after for");
1157 getNextToken(); // eat '='.
1160 ExprAST *Start = ParseExpression();
1161 if (Start == 0) return 0;
1163 return Error("expected ',' after for start value");
1166 ExprAST *End = ParseExpression();
1167 if (End == 0) return 0;
1169 // The step value is optional.
1171 if (CurTok == ',') {
1173 Step = ParseExpression();
1174 if (Step == 0) return 0;
1177 if (CurTok != tok_in)
1178 return Error("expected 'in' after for");
1179 getNextToken(); // eat 'in'.
1181 ExprAST *Body = ParseExpression();
1182 if (Body == 0) return 0;
1184 return new ForExprAST(IdName, Start, End, Step, Body);
1189 /// ::= identifierexpr
1194 static ExprAST *ParsePrimary() {
1196 default: return Error("unknown token when expecting an expression");
1197 case tok_identifier: return ParseIdentifierExpr();
1198 case tok_number: return ParseNumberExpr();
1199 case '(': return ParseParenExpr();
1200 case tok_if: return ParseIfExpr();
1201 case tok_for: return ParseForExpr();
1208 static ExprAST *ParseUnary() {
1209 // If the current token is not an operator, it must be a primary expr.
1210 if (!isascii(CurTok) || CurTok == '(' || CurTok == ',')
1211 return ParsePrimary();
1213 // If this is a unary operator, read it.
1216 if (ExprAST *Operand = ParseUnary())
1217 return new UnaryExprAST(Opc, Operand);
1222 /// ::= ('+' unary)*
1223 static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
1224 // If this is a binop, find its precedence.
1226 int TokPrec = GetTokPrecedence();
1228 // If this is a binop that binds at least as tightly as the current binop,
1229 // consume it, otherwise we are done.
1230 if (TokPrec < ExprPrec)
1233 // Okay, we know this is a binop.
1235 getNextToken(); // eat binop
1237 // Parse the unary expression after the binary operator.
1238 ExprAST *RHS = ParseUnary();
1241 // If BinOp binds less tightly with RHS than the operator after RHS, let
1242 // the pending operator take RHS as its LHS.
1243 int NextPrec = GetTokPrecedence();
1244 if (TokPrec < NextPrec) {
1245 RHS = ParseBinOpRHS(TokPrec+1, RHS);
1246 if (RHS == 0) return 0;
1250 LHS = new BinaryExprAST(BinOp, LHS, RHS);
1255 /// ::= unary binoprhs
1257 static ExprAST *ParseExpression() {
1258 ExprAST *LHS = ParseUnary();
1261 return ParseBinOpRHS(0, LHS);
1265 /// ::= id '(' id* ')'
1266 /// ::= binary LETTER number? (id, id)
1267 /// ::= unary LETTER (id)
1268 static PrototypeAST *ParsePrototype() {
1271 int Kind = 0; // 0 = identifier, 1 = unary, 2 = binary.
1272 unsigned BinaryPrecedence = 30;
1276 return ErrorP("Expected function name in prototype");
1277 case tok_identifier:
1278 FnName = IdentifierStr;
1284 if (!isascii(CurTok))
1285 return ErrorP("Expected unary operator");
1287 FnName += (char)CurTok;
1293 if (!isascii(CurTok))
1294 return ErrorP("Expected binary operator");
1296 FnName += (char)CurTok;
1300 // Read the precedence if present.
1301 if (CurTok == tok_number) {
1302 if (NumVal < 1 || NumVal > 100)
1303 return ErrorP("Invalid precedecnce: must be 1..100");
1304 BinaryPrecedence = (unsigned)NumVal;
1311 return ErrorP("Expected '(' in prototype");
1313 std::vector<std::string> ArgNames;
1314 while (getNextToken() == tok_identifier)
1315 ArgNames.push_back(IdentifierStr);
1317 return ErrorP("Expected ')' in prototype");
1320 getNextToken(); // eat ')'.
1322 // Verify right number of names for operator.
1323 if (Kind && ArgNames.size() != Kind)
1324 return ErrorP("Invalid number of operands for operator");
1326 return new PrototypeAST(FnName, ArgNames, Kind != 0, BinaryPrecedence);
1329 /// definition ::= 'def' prototype expression
1330 static FunctionAST *ParseDefinition() {
1331 getNextToken(); // eat def.
1332 PrototypeAST *Proto = ParsePrototype();
1333 if (Proto == 0) return 0;
1335 if (ExprAST *E = ParseExpression())
1336 return new FunctionAST(Proto, E);
1340 /// toplevelexpr ::= expression
1341 static FunctionAST *ParseTopLevelExpr() {
1342 if (ExprAST *E = ParseExpression()) {
1343 // Make an anonymous proto.
1344 PrototypeAST *Proto = new PrototypeAST("", std::vector<std::string>());
1345 return new FunctionAST(Proto, E);
1350 /// external ::= 'extern' prototype
1351 static PrototypeAST *ParseExtern() {
1352 getNextToken(); // eat extern.
1353 return ParsePrototype();
1356 //===----------------------------------------------------------------------===//
1358 //===----------------------------------------------------------------------===//
1360 static Module *TheModule;
1361 static IRBuilder<> Builder(getGlobalContext());
1362 static std::map<std::string, Value*> NamedValues;
1363 static FunctionPassManager *TheFPM;
1365 Value *ErrorV(const char *Str) { Error(Str); return 0; }
1367 Value *NumberExprAST::Codegen() {
1368 return ConstantFP::get(getGlobalContext(), APFloat(Val));
1371 Value *VariableExprAST::Codegen() {
1372 // Look this variable up in the function.
1373 Value *V = NamedValues[Name];
1374 return V ? V : ErrorV("Unknown variable name");
1377 Value *UnaryExprAST::Codegen() {
1378 Value *OperandV = Operand->Codegen();
1379 if (OperandV == 0) return 0;
1381 Function *F = TheModule->getFunction(std::string("unary")+Opcode);
1383 return ErrorV("Unknown unary operator");
1385 return Builder.CreateCall(F, OperandV, "unop");
1389 Value *BinaryExprAST::Codegen() {
1390 Value *L = LHS->Codegen();
1391 Value *R = RHS->Codegen();
1392 if (L == 0 || R == 0) return 0;
1395 case '+': return Builder.CreateAdd(L, R, "addtmp");
1396 case '-': return Builder.CreateSub(L, R, "subtmp");
1397 case '*': return Builder.CreateMul(L, R, "multmp");
1399 L = Builder.CreateFCmpULT(L, R, "cmptmp");
1400 // Convert bool 0/1 to double 0.0 or 1.0
1401 return Builder.CreateUIToFP(L, Type::DoubleTy, "booltmp");
1405 // If it wasn't a builtin binary operator, it must be a user defined one. Emit
1407 Function *F = TheModule->getFunction(std::string("binary")+Op);
1408 assert(F && "binary operator not found!");
1410 Value *Ops[] = { L, R };
1411 return Builder.CreateCall(F, Ops, Ops+2, "binop");
1414 Value *CallExprAST::Codegen() {
1415 // Look up the name in the global module table.
1416 Function *CalleeF = TheModule->getFunction(Callee);
1418 return ErrorV("Unknown function referenced");
1420 // If argument mismatch error.
1421 if (CalleeF->arg_size() != Args.size())
1422 return ErrorV("Incorrect # arguments passed");
1424 std::vector<Value*> ArgsV;
1425 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
1426 ArgsV.push_back(Args[i]->Codegen());
1427 if (ArgsV.back() == 0) return 0;
1430 return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
1433 Value *IfExprAST::Codegen() {
1434 Value *CondV = Cond->Codegen();
1435 if (CondV == 0) return 0;
1437 // Convert condition to a bool by comparing equal to 0.0.
1438 CondV = Builder.CreateFCmpONE(CondV,
1439 ConstantFP::get(getGlobalContext(), APFloat(0.0)),
1442 Function *TheFunction = Builder.GetInsertBlock()->getParent();
1444 // Create blocks for the then and else cases. Insert the 'then' block at the
1445 // end of the function.
1446 BasicBlock *ThenBB = BasicBlock::Create("then", TheFunction);
1447 BasicBlock *ElseBB = BasicBlock::Create("else");
1448 BasicBlock *MergeBB = BasicBlock::Create("ifcont");
1450 Builder.CreateCondBr(CondV, ThenBB, ElseBB);
1453 Builder.SetInsertPoint(ThenBB);
1455 Value *ThenV = Then->Codegen();
1456 if (ThenV == 0) return 0;
1458 Builder.CreateBr(MergeBB);
1459 // Codegen of 'Then' can change the current block, update ThenBB for the PHI.
1460 ThenBB = Builder.GetInsertBlock();
1463 TheFunction->getBasicBlockList().push_back(ElseBB);
1464 Builder.SetInsertPoint(ElseBB);
1466 Value *ElseV = Else->Codegen();
1467 if (ElseV == 0) return 0;
1469 Builder.CreateBr(MergeBB);
1470 // Codegen of 'Else' can change the current block, update ElseBB for the PHI.
1471 ElseBB = Builder.GetInsertBlock();
1473 // Emit merge block.
1474 TheFunction->getBasicBlockList().push_back(MergeBB);
1475 Builder.SetInsertPoint(MergeBB);
1476 PHINode *PN = Builder.CreatePHI(Type::DoubleTy, "iftmp");
1478 PN->addIncoming(ThenV, ThenBB);
1479 PN->addIncoming(ElseV, ElseBB);
1483 Value *ForExprAST::Codegen() {
1486 // start = startexpr
1489 // variable = phi [start, loopheader], [nextvariable, loopend]
1495 // nextvariable = variable + step
1496 // endcond = endexpr
1497 // br endcond, loop, endloop
1500 // Emit the start code first, without 'variable' in scope.
1501 Value *StartVal = Start->Codegen();
1502 if (StartVal == 0) return 0;
1504 // Make the new basic block for the loop header, inserting after current
1506 Function *TheFunction = Builder.GetInsertBlock()->getParent();
1507 BasicBlock *PreheaderBB = Builder.GetInsertBlock();
1508 BasicBlock *LoopBB = BasicBlock::Create("loop", TheFunction);
1510 // Insert an explicit fall through from the current block to the LoopBB.
1511 Builder.CreateBr(LoopBB);
1513 // Start insertion in LoopBB.
1514 Builder.SetInsertPoint(LoopBB);
1516 // Start the PHI node with an entry for Start.
1517 PHINode *Variable = Builder.CreatePHI(Type::DoubleTy, VarName.c_str());
1518 Variable->addIncoming(StartVal, PreheaderBB);
1520 // Within the loop, the variable is defined equal to the PHI node. If it
1521 // shadows an existing variable, we have to restore it, so save it now.
1522 Value *OldVal = NamedValues[VarName];
1523 NamedValues[VarName] = Variable;
1525 // Emit the body of the loop. This, like any other expr, can change the
1526 // current BB. Note that we ignore the value computed by the body, but don't
1528 if (Body->Codegen() == 0)
1531 // Emit the step value.
1534 StepVal = Step->Codegen();
1535 if (StepVal == 0) return 0;
1537 // If not specified, use 1.0.
1538 StepVal = ConstantFP::get(getGlobalContext(), APFloat(1.0));
1541 Value *NextVar = Builder.CreateAdd(Variable, StepVal, "nextvar");
1543 // Compute the end condition.
1544 Value *EndCond = End->Codegen();
1545 if (EndCond == 0) return EndCond;
1547 // Convert condition to a bool by comparing equal to 0.0.
1548 EndCond = Builder.CreateFCmpONE(EndCond,
1549 ConstantFP::get(getGlobalContext(), APFloat(0.0)),
1552 // Create the "after loop" block and insert it.
1553 BasicBlock *LoopEndBB = Builder.GetInsertBlock();
1554 BasicBlock *AfterBB = BasicBlock::Create("afterloop", TheFunction);
1556 // Insert the conditional branch into the end of LoopEndBB.
1557 Builder.CreateCondBr(EndCond, LoopBB, AfterBB);
1559 // Any new code will be inserted in AfterBB.
1560 Builder.SetInsertPoint(AfterBB);
1562 // Add a new entry to the PHI node for the backedge.
1563 Variable->addIncoming(NextVar, LoopEndBB);
1565 // Restore the unshadowed variable.
1567 NamedValues[VarName] = OldVal;
1569 NamedValues.erase(VarName);
1572 // for expr always returns 0.0.
1573 return Constant::getNullValue(Type::DoubleTy);
1576 Function *PrototypeAST::Codegen() {
1577 // Make the function type: double(double,double) etc.
1578 std::vector<const Type*> Doubles(Args.size(), Type::DoubleTy);
1579 FunctionType *FT = FunctionType::get(Type::DoubleTy, Doubles, false);
1581 Function *F = Function::Create(FT, Function::ExternalLinkage, Name, TheModule);
1583 // If F conflicted, there was already something named 'Name'. If it has a
1584 // body, don't allow redefinition or reextern.
1585 if (F->getName() != Name) {
1586 // Delete the one we just made and get the existing one.
1587 F->eraseFromParent();
1588 F = TheModule->getFunction(Name);
1590 // If F already has a body, reject this.
1591 if (!F->empty()) {
1592 ErrorF("redefinition of function");
1596 // If F took a different number of args, reject.
1597 if (F->arg_size() != Args.size()) {
1598 ErrorF("redefinition of function with different # args");
1603 // Set names for all arguments.
1605 for (Function::arg_iterator AI = F->arg_begin(); Idx != Args.size();
1607 AI->setName(Args[Idx]);
1609 // Add arguments to variable symbol table.
1610 NamedValues[Args[Idx]] = AI;
1616 Function *FunctionAST::Codegen() {
1617 NamedValues.clear();
1619 Function *TheFunction = Proto->Codegen();
1620 if (TheFunction == 0)
1623 // If this is an operator, install it.
1624 if (Proto->isBinaryOp())
1625 BinopPrecedence[Proto->getOperatorName()] = Proto->getBinaryPrecedence();
1627 // Create a new basic block to start insertion into.
1628 BasicBlock *BB = BasicBlock::Create("entry", TheFunction);
1629 Builder.SetInsertPoint(BB);
1631 if (Value *RetVal = Body->Codegen()) {
1632 // Finish off the function.
1633 Builder.CreateRet(RetVal);
1635 // Validate the generated code, checking for consistency.
1636 verifyFunction(*TheFunction);
1638 // Optimize the function.
1639 TheFPM->run(*TheFunction);
1644 // Error reading body, remove function.
1645 TheFunction->eraseFromParent();
1647 if (Proto->isBinaryOp())
1648 BinopPrecedence.erase(Proto->getOperatorName());
1652 //===----------------------------------------------------------------------===//
1653 // Top-Level parsing and JIT Driver
1654 //===----------------------------------------------------------------------===//
1656 static ExecutionEngine *TheExecutionEngine;
1658 static void HandleDefinition() {
1659 if (FunctionAST *F = ParseDefinition()) {
1660 if (Function *LF = F->Codegen()) {
1661 fprintf(stderr, "Read function definition:");
1665 // Skip token for error recovery.
1670 static void HandleExtern() {
1671 if (PrototypeAST *P = ParseExtern()) {
1672 if (Function *F = P->Codegen()) {
1673 fprintf(stderr, "Read extern: ");
1677 // Skip token for error recovery.
1682 static void HandleTopLevelExpression() {
1683 // Evaluate a top level expression into an anonymous function.
1684 if (FunctionAST *F = ParseTopLevelExpr()) {
1685 if (Function *LF = F->Codegen()) {
1686 // JIT the function, returning a function pointer.
1687 void *FPtr = TheExecutionEngine->getPointerToFunction(LF);
1689 // Cast it to the right type (takes no arguments, returns a double) so we
1690 // can call it as a native function.
1691 double (*FP)() = (double (*)())FPtr;
1692 fprintf(stderr, "Evaluated to %f\n", FP());
1695 // Skip token for error recovery.
1700 /// top ::= definition | external | expression | ';'
1701 static void MainLoop() {
1703 fprintf(stderr, "ready> ");
1705 case tok_eof: return;
1706 case ';': getNextToken(); break; // ignore top level semicolons.
1707 case tok_def: HandleDefinition(); break;
1708 case tok_extern: HandleExtern(); break;
1709 default: HandleTopLevelExpression(); break;
1716 //===----------------------------------------------------------------------===//
1717 // "Library" functions that can be "extern'd" from user code.
1718 //===----------------------------------------------------------------------===//
1720 /// putchard - putchar that takes a double and returns 0.
1722 double putchard(double X) {
1727 /// printd - printf that takes a double prints it as "%f\n", returning 0.
1729 double printd(double X) {
1734 //===----------------------------------------------------------------------===//
1735 // Main driver code.
1736 //===----------------------------------------------------------------------===//
1739 // Install standard binary operators.
1740 // 1 is lowest precedence.
1741 BinopPrecedence['<'] = 10;
1742 BinopPrecedence['+'] = 20;
1743 BinopPrecedence['-'] = 20;
1744 BinopPrecedence['*'] = 40; // highest.
1746 // Prime the first token.
1747 fprintf(stderr, "ready> ");
1750 // Make the module, which holds all the code.
1751 TheModule = new Module("my cool jit", getGlobalContext());
1754 TheExecutionEngine = EngineBuilder(TheModule).create();
1757 ExistingModuleProvider OurModuleProvider(TheModule);
1758 FunctionPassManager OurFPM(&OurModuleProvider);
1760 // Set up the optimizer pipeline. Start with registering info about how the
1761 // target lays out data structures.
1762 OurFPM.add(new TargetData(*TheExecutionEngine->getTargetData()));
1763 // Do simple "peephole" optimizations and bit-twiddling optzns.
1764 OurFPM.add(createInstructionCombiningPass());
1765 // Reassociate expressions.
1766 OurFPM.add(createReassociatePass());
1767 // Eliminate Common SubExpressions.
1768 OurFPM.add(createGVNPass());
1769 // Simplify the control flow graph (deleting unreachable blocks, etc).
1770 OurFPM.add(createCFGSimplificationPass());
1771 // Set the global so the code gen can use this.
1772 TheFPM = &OurFPM;
1774 // Run the main "interpreter loop" now.
1779 // Print out all of the generated code.
1780 TheModule->dump();
1781 } // Free module provider (and thus the module) and pass manager.
1788 <a href="LangImpl7.html">Next: Extending the language: mutable variables / SSA construction</a>
1791 <!-- *********************************************************************** -->
1794 <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
1795 src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a>
1796 <a href="http://validator.w3.org/check/referer"><img
1797 src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
1799 <a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
1800 <a href="http://llvm.org">The LLVM Compiler Infrastructure</a><br>
1801 Last modified: $Date: 2007-10-17 11:05:13 -0700 (Wed, 17 Oct 2007) $