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 <h1>Kaleidoscope: Extending the Language: User-defined Operators</h1>
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 <h2><a name="intro">Chapter 6 Introduction</a></h2>
38 <!-- *********************************************************************** -->
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 <h2><a name="idea">User-defined Operators: the Idea</a></h2>
64 <!-- *********************************************************************** -->
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 <h2><a name="binary">User-defined Binary Operators</a></h2>
129 <!-- *********************************************************************** -->
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>unsigned 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.CreateFAdd(L, R, "addtmp");
281 case '-': return Builder.CreateFSub(L, R, "subtmp");
282 case '*': return Builder.CreateFMul(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::getDoubleTy(getGlobalContext()),
288 <b>default: break;</b>
291 <b>// If it wasn't a builtin binary operator, it must be a user defined one. Emit
293 Function *F = TheModule->getFunction(std::string("binary")+Op);
294 assert(F && "binary operator not found!");
296 Value *Ops[] = { L, R };
297 return Builder.CreateCall(F, Ops, Ops+2, "binop");</b>
303 <p>As you can see above, the new code is actually really simple. It just does
304 a lookup for the appropriate operator in the symbol table and generates a
305 function call to it. Since user-defined operators are just built as normal
306 functions (because the "prototype" boils down to a function with the right
307 name) everything falls into place.</p>
309 <p>The final piece of code we are missing, is a bit of top-level magic:</p>
311 <div class="doc_code">
313 Function *FunctionAST::Codegen() {
316 Function *TheFunction = Proto->Codegen();
317 if (TheFunction == 0)
320 <b>// If this is an operator, install it.
321 if (Proto->isBinaryOp())
322 BinopPrecedence[Proto->getOperatorName()] = Proto->getBinaryPrecedence();</b>
324 // Create a new basic block to start insertion into.
325 BasicBlock *BB = BasicBlock::Create(getGlobalContext(), "entry", TheFunction);
326 Builder.SetInsertPoint(BB);
328 if (Value *RetVal = Body->Codegen()) {
333 <p>Basically, before codegening a function, if it is a user-defined operator, we
334 register it in the precedence table. This allows the binary operator parsing
335 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>
337 <p>Now we have useful user-defined binary operators. This builds a lot
338 on the previous framework we built for other operators. Adding unary operators
339 is a bit more challenging, because we don't have any framework for it yet - lets
340 see what it takes.</p>
344 <!-- *********************************************************************** -->
345 <h2><a name="unary">User-defined Unary Operators</a></h2>
346 <!-- *********************************************************************** -->
350 <p>Since we don't currently support unary operators in the Kaleidoscope
351 language, we'll need to add everything to support them. Above, we added simple
352 support for the 'unary' keyword to the lexer. In addition to that, we need an
355 <div class="doc_code">
357 /// UnaryExprAST - Expression class for a unary operator.
358 class UnaryExprAST : public ExprAST {
362 UnaryExprAST(char opcode, ExprAST *operand)
363 : Opcode(opcode), Operand(operand) {}
364 virtual Value *Codegen();
369 <p>This AST node is very simple and obvious by now. It directly mirrors the
370 binary operator AST node, except that it only has one child. With this, we
371 need to add the parsing logic. Parsing a unary operator is pretty simple: we'll
372 add a new function to do it:</p>
374 <div class="doc_code">
379 static 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();
384 // If this is a unary operator, read it.
387 if (ExprAST *Operand = ParseUnary())
388 return new UnaryExprAST(Opc, Operand);
394 <p>The grammar we add is pretty straightforward here. If we see a unary
395 operator when parsing a primary operator, we eat the operator as a prefix and
396 parse the remaining piece as another unary operator. This allows us to handle
397 multiple unary operators (e.g. "!!x"). Note that unary operators can't have
398 ambiguous parses like binary operators can, so there is no need for precedence
401 <p>The problem with this function, is that we need to call ParseUnary from somewhere.
402 To do this, we change previous callers of ParsePrimary to call ParseUnary
405 <div class="doc_code">
409 static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
411 <b>// Parse the unary expression after the binary operator.
412 ExprAST *RHS = ParseUnary();
413 if (!RHS) return 0;</b>
417 /// ::= unary binoprhs
419 static ExprAST *ParseExpression() {
420 <b>ExprAST *LHS = ParseUnary();</b>
423 return ParseBinOpRHS(0, LHS);
428 <p>With these two simple changes, we are now able to parse unary operators and build the
429 AST for them. Next up, we need to add parser support for prototypes, to parse
430 the unary operator prototype. We extend the binary operator code above
433 <div class="doc_code">
436 /// ::= id '(' id* ')'
437 /// ::= binary LETTER number? (id, id)
438 <b>/// ::= unary LETTER (id)</b>
439 static PrototypeAST *ParsePrototype() {
442 unsigned Kind = 0; // 0 = identifier, 1 = unary, 2 = binary.
443 unsigned BinaryPrecedence = 30;
447 return ErrorP("Expected function name in prototype");
449 FnName = IdentifierStr;
455 if (!isascii(CurTok))
456 return ErrorP("Expected unary operator");
458 FnName += (char)CurTok;
467 <p>As with binary operators, we name unary operators with a name that includes
468 the operator character. This assists us at code generation time. Speaking of,
469 the final piece we need to add is codegen support for unary operators. It looks
472 <div class="doc_code">
474 Value *UnaryExprAST::Codegen() {
475 Value *OperandV = Operand->Codegen();
476 if (OperandV == 0) return 0;
478 Function *F = TheModule->getFunction(std::string("unary")+Opcode);
480 return ErrorV("Unknown unary operator");
482 return Builder.CreateCall(F, OperandV, "unop");
487 <p>This code is similar to, but simpler than, the code for binary operators. It
488 is simpler primarily because it doesn't need to handle any predefined operators.
493 <!-- *********************************************************************** -->
494 <h2><a name="example">Kicking the Tires</a></h2>
495 <!-- *********************************************************************** -->
499 <p>It is somewhat hard to believe, but with a few simple extensions we've
500 covered in the last chapters, we have grown a real-ish language. With this, we
501 can do a lot of interesting things, including I/O, math, and a bunch of other
502 things. For example, we can now add a nice sequencing operator (printd is
503 defined to print out the specified value and a newline):</p>
505 <div class="doc_code">
507 ready> <b>extern printd(x);</b>
508 Read extern: declare double @printd(double)
509 ready> <b>def binary : 1 (x y) 0; # Low-precedence operator that ignores operands.</b>
511 ready> <b>printd(123) : printd(456) : printd(789);</b>
515 Evaluated to 0.000000
519 <p>We can also define a bunch of other "primitive" operations, such as:</p>
521 <div class="doc_code">
534 # Define > with the same precedence as <.
535 def binary> 10 (LHS RHS)
538 # Binary logical or, which does not short circuit.
539 def binary| 5 (LHS RHS)
547 # Binary logical and, which does not short circuit.
548 def binary& 6 (LHS RHS)
554 # Define = with slightly lower precedence than relationals.
555 def binary = 9 (LHS RHS)
556 !(LHS < RHS | LHS > RHS);
562 <p>Given the previous if/then/else support, we can also define interesting
563 functions 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
567 <div class="doc_code">
571 extern putchard(char)
575 else if d > 4 then
577 else if d > 2 then
580 putchard(42); # '*'</b>
582 ready> <b>printdensity(1): printdensity(2): printdensity(3) :
583 printdensity(4): printdensity(5): printdensity(9): putchard(10);</b>
585 Evaluated to 0.000000
589 <p>Based on these simple primitive operations, we can start to define more
590 interesting things. For example, here's a little function that solves for the
591 number of iterations it takes a function in the complex plane to
594 <div class="doc_code">
596 # determine whether the specific location diverges.
597 # Solve for z = z^2 + c in the complex plane.
598 def mandleconverger(real imag iters creal cimag)
599 if iters > 255 | (real*real + imag*imag > 4) then
602 mandleconverger(real*real - imag*imag + creal,
604 iters+1, creal, cimag);
606 # return the number of iterations required for the iteration to escape
607 def mandleconverge(real imag)
608 mandleconverger(real, imag, 0, real, imag);
612 <p>This "z = z<sup>2</sup> + c" function is a beautiful little creature that is the basis
613 for computation of the <a
614 href="http://en.wikipedia.org/wiki/Mandelbrot_set">Mandelbrot Set</a>. Our
615 <tt>mandelconverge</tt> function returns the number of iterations that it takes
616 for a complex orbit to escape, saturating to 255. This is not a very useful
617 function by itself, but if you plot its value over a two-dimensional plane,
618 you can see the Mandelbrot set. Given that we are limited to using putchard
619 here, our amazing graphical output is limited, but we can whip together
620 something using the density plotter above:</p>
622 <div class="doc_code">
624 # compute and plot the mandlebrot set with the specified 2 dimensional range
626 def mandelhelp(xmin xmax xstep ymin ymax ystep)
627 for y = ymin, y < ymax, ystep in (
628 (for x = xmin, x < xmax, xstep in
629 printdensity(mandleconverge(x,y)))
633 # mandel - This is a convenient helper function for ploting the mandelbrot set
634 # from the specified position with the specified Magnification.
635 def mandel(realstart imagstart realmag imagmag)
636 mandelhelp(realstart, realstart+realmag*78, realmag,
637 imagstart, imagstart+imagmag*40, imagmag);
641 <p>Given this, we can try plotting out the mandlebrot set! Lets try it out:</p>
643 <div class="doc_code">
645 ready> <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 *******************************************************************************
687 Evaluated to 0.000000
688 ready> <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 *.......... ...........
715 *.......... ...........
716 *+++....++++................
717 *++++++++++++++..............
718 *++++++++++++++++............ ...
719 *++++++++++++++++++.................
720 **+++++++++++++++++++................
721 **+++++++++++++++++++++..............
722 ***++++++++++++++++++++++............
723 ***++++++++++++++++++++++++......... ...... ...........
724 ****++++++++++++++++++++++++++...... .........................
725 *****++++++++++++++++++++++++++++...............................
726 *****++++++++++++++++++++++++++++++++............................
727 ******+++++++++++++++++++++++++++++++++++...........................
728 *******+++++++++++++++++++++++++++++++++++++++.......................
729 ********+++++++++++++++++++++++++++++++++++++++++++..................
730 Evaluated to 0.000000
731 ready> <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 ......... ....+++++++
773 Evaluated to 0.000000
778 <p>At this point, you may be starting to realize that Kaleidoscope is a real
779 and powerful language. It may not be self-similar :), but it can be used to
780 plot things that are!</p>
782 <p>With this, we conclude the "adding user-defined operators" chapter of the
783 tutorial. We have successfully augmented our language, adding the ability to extend the
784 language in the library, and we have shown how this can be used to build a simple but
785 interesting end-user application in Kaleidoscope. At this point, Kaleidoscope
786 can build a variety of applications that are functional and can call functions
787 with side-effects, but it can't actually define and mutate a variable itself.
790 <p>Strikingly, variable mutation is an important feature of some
791 languages, and it is not at all obvious how to <a href="LangImpl7.html">add
792 support for mutable variables</a> without having to add an "SSA construction"
793 phase to your front-end. In the next chapter, we will describe how you can
794 add variable mutation without building SSA in your front-end.</p>
798 <!-- *********************************************************************** -->
799 <h2><a name="code">Full Code Listing</a></h2>
800 <!-- *********************************************************************** -->
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>On some platforms, you will need to specify -rdynamic or -Wl,--export-dynamic
819 when linking. This ensures that symbols defined in the main executable are
820 exported to the dynamic linker and so are available for symbol resolution at
821 run time. This is not needed if you compile your support code into a shared
822 library, although doing that will cause problems on Windows.</p>
824 <p>Here is the code:</p>
826 <div class="doc_code">
828 #include "llvm/DerivedTypes.h"
829 #include "llvm/ExecutionEngine/ExecutionEngine.h"
830 #include "llvm/ExecutionEngine/JIT.h"
831 #include "llvm/LLVMContext.h"
832 #include "llvm/Module.h"
833 #include "llvm/PassManager.h"
834 #include "llvm/Analysis/Verifier.h"
835 #include "llvm/Analysis/Passes.h"
836 #include "llvm/Target/TargetData.h"
837 #include "llvm/Target/TargetSelect.h"
838 #include "llvm/Transforms/Scalar.h"
839 #include "llvm/Support/IRBuilder.h"
840 #include <cstdio>
841 #include <string>
843 #include <vector>
844 using namespace llvm;
846 //===----------------------------------------------------------------------===//
848 //===----------------------------------------------------------------------===//
850 // The lexer returns tokens [0-255] if it is an unknown character, otherwise one
851 // of these for known things.
856 tok_def = -2, tok_extern = -3,
859 tok_identifier = -4, tok_number = -5,
862 tok_if = -6, tok_then = -7, tok_else = -8,
863 tok_for = -9, tok_in = -10,
866 tok_binary = -11, tok_unary = -12
869 static std::string IdentifierStr; // Filled in if tok_identifier
870 static double NumVal; // Filled in if tok_number
872 /// gettok - Return the next token from standard input.
873 static int gettok() {
874 static int LastChar = ' ';
876 // Skip any whitespace.
877 while (isspace(LastChar))
878 LastChar = getchar();
880 if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
881 IdentifierStr = LastChar;
882 while (isalnum((LastChar = getchar())))
883 IdentifierStr += LastChar;
885 if (IdentifierStr == "def") return tok_def;
886 if (IdentifierStr == "extern") return tok_extern;
887 if (IdentifierStr == "if") return tok_if;
888 if (IdentifierStr == "then") return tok_then;
889 if (IdentifierStr == "else") return tok_else;
890 if (IdentifierStr == "for") return tok_for;
891 if (IdentifierStr == "in") return tok_in;
892 if (IdentifierStr == "binary") return tok_binary;
893 if (IdentifierStr == "unary") return tok_unary;
894 return tok_identifier;
897 if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
901 LastChar = getchar();
902 } while (isdigit(LastChar) || LastChar == '.');
904 NumVal = strtod(NumStr.c_str(), 0);
908 if (LastChar == '#') {
909 // Comment until end of line.
910 do LastChar = getchar();
911 while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
917 // Check for end of file. Don't eat the EOF.
921 // Otherwise, just return the character as its ascii value.
922 int ThisChar = LastChar;
923 LastChar = getchar();
927 //===----------------------------------------------------------------------===//
928 // Abstract Syntax Tree (aka Parse Tree)
929 //===----------------------------------------------------------------------===//
931 /// ExprAST - Base class for all expression nodes.
934 virtual ~ExprAST() {}
935 virtual Value *Codegen() = 0;
938 /// NumberExprAST - Expression class for numeric literals like "1.0".
939 class NumberExprAST : public ExprAST {
942 NumberExprAST(double val) : Val(val) {}
943 virtual Value *Codegen();
946 /// VariableExprAST - Expression class for referencing a variable, like "a".
947 class VariableExprAST : public ExprAST {
950 VariableExprAST(const std::string &name) : Name(name) {}
951 virtual Value *Codegen();
954 /// UnaryExprAST - Expression class for a unary operator.
955 class UnaryExprAST : public ExprAST {
959 UnaryExprAST(char opcode, ExprAST *operand)
960 : Opcode(opcode), Operand(operand) {}
961 virtual Value *Codegen();
964 /// BinaryExprAST - Expression class for a binary operator.
965 class BinaryExprAST : public ExprAST {
969 BinaryExprAST(char op, ExprAST *lhs, ExprAST *rhs)
970 : Op(op), LHS(lhs), RHS(rhs) {}
971 virtual Value *Codegen();
974 /// CallExprAST - Expression class for function calls.
975 class CallExprAST : public ExprAST {
977 std::vector<ExprAST*> Args;
979 CallExprAST(const std::string &callee, std::vector<ExprAST*> &args)
980 : Callee(callee), Args(args) {}
981 virtual Value *Codegen();
984 /// IfExprAST - Expression class for if/then/else.
985 class IfExprAST : public ExprAST {
986 ExprAST *Cond, *Then, *Else;
988 IfExprAST(ExprAST *cond, ExprAST *then, ExprAST *_else)
989 : Cond(cond), Then(then), Else(_else) {}
990 virtual Value *Codegen();
993 /// ForExprAST - Expression class for for/in.
994 class ForExprAST : public ExprAST {
996 ExprAST *Start, *End, *Step, *Body;
998 ForExprAST(const std::string &varname, ExprAST *start, ExprAST *end,
999 ExprAST *step, ExprAST *body)
1000 : VarName(varname), Start(start), End(end), Step(step), Body(body) {}
1001 virtual Value *Codegen();
1004 /// PrototypeAST - This class represents the "prototype" for a function,
1005 /// which captures its name, and its argument names (thus implicitly the number
1006 /// of arguments the function takes), as well as if it is an operator.
1007 class PrototypeAST {
1009 std::vector<std::string> Args;
1011 unsigned Precedence; // Precedence if a binary op.
1013 PrototypeAST(const std::string &name, const std::vector<std::string> &args,
1014 bool isoperator = false, unsigned prec = 0)
1015 : Name(name), Args(args), isOperator(isoperator), Precedence(prec) {}
1017 bool isUnaryOp() const { return isOperator && Args.size() == 1; }
1018 bool isBinaryOp() const { return isOperator && Args.size() == 2; }
1020 char getOperatorName() const {
1021 assert(isUnaryOp() || isBinaryOp());
1022 return Name[Name.size()-1];
1025 unsigned getBinaryPrecedence() const { return Precedence; }
1027 Function *Codegen();
1030 /// FunctionAST - This class represents a function definition itself.
1032 PrototypeAST *Proto;
1035 FunctionAST(PrototypeAST *proto, ExprAST *body)
1036 : Proto(proto), Body(body) {}
1038 Function *Codegen();
1041 //===----------------------------------------------------------------------===//
1043 //===----------------------------------------------------------------------===//
1045 /// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
1046 /// token the parser is looking at. getNextToken reads another token from the
1047 /// lexer and updates CurTok with its results.
1049 static int getNextToken() {
1050 return CurTok = gettok();
1053 /// BinopPrecedence - This holds the precedence for each binary operator that is
1055 static std::map<char, int> BinopPrecedence;
1057 /// GetTokPrecedence - Get the precedence of the pending binary operator token.
1058 static int GetTokPrecedence() {
1059 if (!isascii(CurTok))
1062 // Make sure it's a declared binop.
1063 int TokPrec = BinopPrecedence[CurTok];
1064 if (TokPrec <= 0) return -1;
1068 /// Error* - These are little helper functions for error handling.
1069 ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
1070 PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
1071 FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }
1073 static ExprAST *ParseExpression();
1077 /// ::= identifier '(' expression* ')'
1078 static ExprAST *ParseIdentifierExpr() {
1079 std::string IdName = IdentifierStr;
1081 getNextToken(); // eat identifier.
1083 if (CurTok != '(') // Simple variable ref.
1084 return new VariableExprAST(IdName);
1087 getNextToken(); // eat (
1088 std::vector<ExprAST*> Args;
1089 if (CurTok != ')') {
1091 ExprAST *Arg = ParseExpression();
1093 Args.push_back(Arg);
1095 if (CurTok == ')') break;
1098 return Error("Expected ')' or ',' in argument list");
1106 return new CallExprAST(IdName, Args);
1109 /// numberexpr ::= number
1110 static ExprAST *ParseNumberExpr() {
1111 ExprAST *Result = new NumberExprAST(NumVal);
1112 getNextToken(); // consume the number
1116 /// parenexpr ::= '(' expression ')'
1117 static ExprAST *ParseParenExpr() {
1118 getNextToken(); // eat (.
1119 ExprAST *V = ParseExpression();
1123 return Error("expected ')'");
1124 getNextToken(); // eat ).
1128 /// ifexpr ::= 'if' expression 'then' expression 'else' expression
1129 static ExprAST *ParseIfExpr() {
1130 getNextToken(); // eat the if.
1133 ExprAST *Cond = ParseExpression();
1134 if (!Cond) return 0;
1136 if (CurTok != tok_then)
1137 return Error("expected then");
1138 getNextToken(); // eat the then
1140 ExprAST *Then = ParseExpression();
1141 if (Then == 0) return 0;
1143 if (CurTok != tok_else)
1144 return Error("expected else");
1148 ExprAST *Else = ParseExpression();
1149 if (!Else) return 0;
1151 return new IfExprAST(Cond, Then, Else);
1154 /// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
1155 static ExprAST *ParseForExpr() {
1156 getNextToken(); // eat the for.
1158 if (CurTok != tok_identifier)
1159 return Error("expected identifier after for");
1161 std::string IdName = IdentifierStr;
1162 getNextToken(); // eat identifier.
1165 return Error("expected '=' after for");
1166 getNextToken(); // eat '='.
1169 ExprAST *Start = ParseExpression();
1170 if (Start == 0) return 0;
1172 return Error("expected ',' after for start value");
1175 ExprAST *End = ParseExpression();
1176 if (End == 0) return 0;
1178 // The step value is optional.
1180 if (CurTok == ',') {
1182 Step = ParseExpression();
1183 if (Step == 0) return 0;
1186 if (CurTok != tok_in)
1187 return Error("expected 'in' after for");
1188 getNextToken(); // eat 'in'.
1190 ExprAST *Body = ParseExpression();
1191 if (Body == 0) return 0;
1193 return new ForExprAST(IdName, Start, End, Step, Body);
1197 /// ::= identifierexpr
1202 static ExprAST *ParsePrimary() {
1204 default: return Error("unknown token when expecting an expression");
1205 case tok_identifier: return ParseIdentifierExpr();
1206 case tok_number: return ParseNumberExpr();
1207 case '(': return ParseParenExpr();
1208 case tok_if: return ParseIfExpr();
1209 case tok_for: return ParseForExpr();
1216 static ExprAST *ParseUnary() {
1217 // If the current token is not an operator, it must be a primary expr.
1218 if (!isascii(CurTok) || CurTok == '(' || CurTok == ',')
1219 return ParsePrimary();
1221 // If this is a unary operator, read it.
1224 if (ExprAST *Operand = ParseUnary())
1225 return new UnaryExprAST(Opc, Operand);
1230 /// ::= ('+' unary)*
1231 static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
1232 // If this is a binop, find its precedence.
1234 int TokPrec = GetTokPrecedence();
1236 // If this is a binop that binds at least as tightly as the current binop,
1237 // consume it, otherwise we are done.
1238 if (TokPrec < ExprPrec)
1241 // Okay, we know this is a binop.
1243 getNextToken(); // eat binop
1245 // Parse the unary expression after the binary operator.
1246 ExprAST *RHS = ParseUnary();
1249 // If BinOp binds less tightly with RHS than the operator after RHS, let
1250 // the pending operator take RHS as its LHS.
1251 int NextPrec = GetTokPrecedence();
1252 if (TokPrec < NextPrec) {
1253 RHS = ParseBinOpRHS(TokPrec+1, RHS);
1254 if (RHS == 0) return 0;
1258 LHS = new BinaryExprAST(BinOp, LHS, RHS);
1263 /// ::= unary binoprhs
1265 static ExprAST *ParseExpression() {
1266 ExprAST *LHS = ParseUnary();
1269 return ParseBinOpRHS(0, LHS);
1273 /// ::= id '(' id* ')'
1274 /// ::= binary LETTER number? (id, id)
1275 /// ::= unary LETTER (id)
1276 static PrototypeAST *ParsePrototype() {
1279 unsigned Kind = 0; // 0 = identifier, 1 = unary, 2 = binary.
1280 unsigned BinaryPrecedence = 30;
1284 return ErrorP("Expected function name in prototype");
1285 case tok_identifier:
1286 FnName = IdentifierStr;
1292 if (!isascii(CurTok))
1293 return ErrorP("Expected unary operator");
1295 FnName += (char)CurTok;
1301 if (!isascii(CurTok))
1302 return ErrorP("Expected binary operator");
1304 FnName += (char)CurTok;
1308 // Read the precedence if present.
1309 if (CurTok == tok_number) {
1310 if (NumVal < 1 || NumVal > 100)
1311 return ErrorP("Invalid precedecnce: must be 1..100");
1312 BinaryPrecedence = (unsigned)NumVal;
1319 return ErrorP("Expected '(' in prototype");
1321 std::vector<std::string> ArgNames;
1322 while (getNextToken() == tok_identifier)
1323 ArgNames.push_back(IdentifierStr);
1325 return ErrorP("Expected ')' in prototype");
1328 getNextToken(); // eat ')'.
1330 // Verify right number of names for operator.
1331 if (Kind && ArgNames.size() != Kind)
1332 return ErrorP("Invalid number of operands for operator");
1334 return new PrototypeAST(FnName, ArgNames, Kind != 0, BinaryPrecedence);
1337 /// definition ::= 'def' prototype expression
1338 static FunctionAST *ParseDefinition() {
1339 getNextToken(); // eat def.
1340 PrototypeAST *Proto = ParsePrototype();
1341 if (Proto == 0) return 0;
1343 if (ExprAST *E = ParseExpression())
1344 return new FunctionAST(Proto, E);
1348 /// toplevelexpr ::= expression
1349 static FunctionAST *ParseTopLevelExpr() {
1350 if (ExprAST *E = ParseExpression()) {
1351 // Make an anonymous proto.
1352 PrototypeAST *Proto = new PrototypeAST("", std::vector<std::string>());
1353 return new FunctionAST(Proto, E);
1358 /// external ::= 'extern' prototype
1359 static PrototypeAST *ParseExtern() {
1360 getNextToken(); // eat extern.
1361 return ParsePrototype();
1364 //===----------------------------------------------------------------------===//
1366 //===----------------------------------------------------------------------===//
1368 static Module *TheModule;
1369 static IRBuilder<> Builder(getGlobalContext());
1370 static std::map<std::string, Value*> NamedValues;
1371 static FunctionPassManager *TheFPM;
1373 Value *ErrorV(const char *Str) { Error(Str); return 0; }
1375 Value *NumberExprAST::Codegen() {
1376 return ConstantFP::get(getGlobalContext(), APFloat(Val));
1379 Value *VariableExprAST::Codegen() {
1380 // Look this variable up in the function.
1381 Value *V = NamedValues[Name];
1382 return V ? V : ErrorV("Unknown variable name");
1385 Value *UnaryExprAST::Codegen() {
1386 Value *OperandV = Operand->Codegen();
1387 if (OperandV == 0) return 0;
1389 Function *F = TheModule->getFunction(std::string("unary")+Opcode);
1391 return ErrorV("Unknown unary operator");
1393 return Builder.CreateCall(F, OperandV, "unop");
1396 Value *BinaryExprAST::Codegen() {
1397 Value *L = LHS->Codegen();
1398 Value *R = RHS->Codegen();
1399 if (L == 0 || R == 0) return 0;
1402 case '+': return Builder.CreateFAdd(L, R, "addtmp");
1403 case '-': return Builder.CreateFSub(L, R, "subtmp");
1404 case '*': return Builder.CreateFMul(L, R, "multmp");
1406 L = Builder.CreateFCmpULT(L, R, "cmptmp");
1407 // Convert bool 0/1 to double 0.0 or 1.0
1408 return Builder.CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()),
1413 // If it wasn't a builtin binary operator, it must be a user defined one. Emit
1415 Function *F = TheModule->getFunction(std::string("binary")+Op);
1416 assert(F && "binary operator not found!");
1418 Value *Ops[] = { L, R };
1419 return Builder.CreateCall(F, Ops, Ops+2, "binop");
1422 Value *CallExprAST::Codegen() {
1423 // Look up the name in the global module table.
1424 Function *CalleeF = TheModule->getFunction(Callee);
1426 return ErrorV("Unknown function referenced");
1428 // If argument mismatch error.
1429 if (CalleeF->arg_size() != Args.size())
1430 return ErrorV("Incorrect # arguments passed");
1432 std::vector<Value*> ArgsV;
1433 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
1434 ArgsV.push_back(Args[i]->Codegen());
1435 if (ArgsV.back() == 0) return 0;
1438 return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
1441 Value *IfExprAST::Codegen() {
1442 Value *CondV = Cond->Codegen();
1443 if (CondV == 0) return 0;
1445 // Convert condition to a bool by comparing equal to 0.0.
1446 CondV = Builder.CreateFCmpONE(CondV,
1447 ConstantFP::get(getGlobalContext(), APFloat(0.0)),
1450 Function *TheFunction = Builder.GetInsertBlock()->getParent();
1452 // Create blocks for the then and else cases. Insert the 'then' block at the
1453 // end of the function.
1454 BasicBlock *ThenBB = BasicBlock::Create(getGlobalContext(), "then", TheFunction);
1455 BasicBlock *ElseBB = BasicBlock::Create(getGlobalContext(), "else");
1456 BasicBlock *MergeBB = BasicBlock::Create(getGlobalContext(), "ifcont");
1458 Builder.CreateCondBr(CondV, ThenBB, ElseBB);
1461 Builder.SetInsertPoint(ThenBB);
1463 Value *ThenV = Then->Codegen();
1464 if (ThenV == 0) return 0;
1466 Builder.CreateBr(MergeBB);
1467 // Codegen of 'Then' can change the current block, update ThenBB for the PHI.
1468 ThenBB = Builder.GetInsertBlock();
1471 TheFunction->getBasicBlockList().push_back(ElseBB);
1472 Builder.SetInsertPoint(ElseBB);
1474 Value *ElseV = Else->Codegen();
1475 if (ElseV == 0) return 0;
1477 Builder.CreateBr(MergeBB);
1478 // Codegen of 'Else' can change the current block, update ElseBB for the PHI.
1479 ElseBB = Builder.GetInsertBlock();
1481 // Emit merge block.
1482 TheFunction->getBasicBlockList().push_back(MergeBB);
1483 Builder.SetInsertPoint(MergeBB);
1484 PHINode *PN = Builder.CreatePHI(Type::getDoubleTy(getGlobalContext()), 2,
1487 PN->addIncoming(ThenV, ThenBB);
1488 PN->addIncoming(ElseV, ElseBB);
1492 Value *ForExprAST::Codegen() {
1495 // start = startexpr
1498 // variable = phi [start, loopheader], [nextvariable, loopend]
1504 // nextvariable = variable + step
1505 // endcond = endexpr
1506 // br endcond, loop, endloop
1509 // Emit the start code first, without 'variable' in scope.
1510 Value *StartVal = Start->Codegen();
1511 if (StartVal == 0) return 0;
1513 // Make the new basic block for the loop header, inserting after current
1515 Function *TheFunction = Builder.GetInsertBlock()->getParent();
1516 BasicBlock *PreheaderBB = Builder.GetInsertBlock();
1517 BasicBlock *LoopBB = BasicBlock::Create(getGlobalContext(), "loop", TheFunction);
1519 // Insert an explicit fall through from the current block to the LoopBB.
1520 Builder.CreateBr(LoopBB);
1522 // Start insertion in LoopBB.
1523 Builder.SetInsertPoint(LoopBB);
1525 // Start the PHI node with an entry for Start.
1526 PHINode *Variable = Builder.CreatePHI(Type::getDoubleTy(getGlobalContext()), 2, VarName.c_str());
1527 Variable->addIncoming(StartVal, PreheaderBB);
1529 // Within the loop, the variable is defined equal to the PHI node. If it
1530 // shadows an existing variable, we have to restore it, so save it now.
1531 Value *OldVal = NamedValues[VarName];
1532 NamedValues[VarName] = Variable;
1534 // Emit the body of the loop. This, like any other expr, can change the
1535 // current BB. Note that we ignore the value computed by the body, but don't
1537 if (Body->Codegen() == 0)
1540 // Emit the step value.
1543 StepVal = Step->Codegen();
1544 if (StepVal == 0) return 0;
1546 // If not specified, use 1.0.
1547 StepVal = ConstantFP::get(getGlobalContext(), APFloat(1.0));
1550 Value *NextVar = Builder.CreateFAdd(Variable, StepVal, "nextvar");
1552 // Compute the end condition.
1553 Value *EndCond = End->Codegen();
1554 if (EndCond == 0) return EndCond;
1556 // Convert condition to a bool by comparing equal to 0.0.
1557 EndCond = Builder.CreateFCmpONE(EndCond,
1558 ConstantFP::get(getGlobalContext(), APFloat(0.0)),
1561 // Create the "after loop" block and insert it.
1562 BasicBlock *LoopEndBB = Builder.GetInsertBlock();
1563 BasicBlock *AfterBB = BasicBlock::Create(getGlobalContext(), "afterloop", TheFunction);
1565 // Insert the conditional branch into the end of LoopEndBB.
1566 Builder.CreateCondBr(EndCond, LoopBB, AfterBB);
1568 // Any new code will be inserted in AfterBB.
1569 Builder.SetInsertPoint(AfterBB);
1571 // Add a new entry to the PHI node for the backedge.
1572 Variable->addIncoming(NextVar, LoopEndBB);
1574 // Restore the unshadowed variable.
1576 NamedValues[VarName] = OldVal;
1578 NamedValues.erase(VarName);
1581 // for expr always returns 0.0.
1582 return Constant::getNullValue(Type::getDoubleTy(getGlobalContext()));
1585 Function *PrototypeAST::Codegen() {
1586 // Make the function type: double(double,double) etc.
1587 std::vector<const Type*> Doubles(Args.size(),
1588 Type::getDoubleTy(getGlobalContext()));
1589 FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
1592 Function *F = Function::Create(FT, Function::ExternalLinkage, Name, TheModule);
1594 // If F conflicted, there was already something named 'Name'. If it has a
1595 // body, don't allow redefinition or reextern.
1596 if (F->getName() != Name) {
1597 // Delete the one we just made and get the existing one.
1598 F->eraseFromParent();
1599 F = TheModule->getFunction(Name);
1601 // If F already has a body, reject this.
1602 if (!F->empty()) {
1603 ErrorF("redefinition of function");
1607 // If F took a different number of args, reject.
1608 if (F->arg_size() != Args.size()) {
1609 ErrorF("redefinition of function with different # args");
1614 // Set names for all arguments.
1616 for (Function::arg_iterator AI = F->arg_begin(); Idx != Args.size();
1618 AI->setName(Args[Idx]);
1620 // Add arguments to variable symbol table.
1621 NamedValues[Args[Idx]] = AI;
1627 Function *FunctionAST::Codegen() {
1628 NamedValues.clear();
1630 Function *TheFunction = Proto->Codegen();
1631 if (TheFunction == 0)
1634 // If this is an operator, install it.
1635 if (Proto->isBinaryOp())
1636 BinopPrecedence[Proto->getOperatorName()] = Proto->getBinaryPrecedence();
1638 // Create a new basic block to start insertion into.
1639 BasicBlock *BB = BasicBlock::Create(getGlobalContext(), "entry", TheFunction);
1640 Builder.SetInsertPoint(BB);
1642 if (Value *RetVal = Body->Codegen()) {
1643 // Finish off the function.
1644 Builder.CreateRet(RetVal);
1646 // Validate the generated code, checking for consistency.
1647 verifyFunction(*TheFunction);
1649 // Optimize the function.
1650 TheFPM->run(*TheFunction);
1655 // Error reading body, remove function.
1656 TheFunction->eraseFromParent();
1658 if (Proto->isBinaryOp())
1659 BinopPrecedence.erase(Proto->getOperatorName());
1663 //===----------------------------------------------------------------------===//
1664 // Top-Level parsing and JIT Driver
1665 //===----------------------------------------------------------------------===//
1667 static ExecutionEngine *TheExecutionEngine;
1669 static void HandleDefinition() {
1670 if (FunctionAST *F = ParseDefinition()) {
1671 if (Function *LF = F->Codegen()) {
1672 fprintf(stderr, "Read function definition:");
1676 // Skip token for error recovery.
1681 static void HandleExtern() {
1682 if (PrototypeAST *P = ParseExtern()) {
1683 if (Function *F = P->Codegen()) {
1684 fprintf(stderr, "Read extern: ");
1688 // Skip token for error recovery.
1693 static void HandleTopLevelExpression() {
1694 // Evaluate a top-level expression into an anonymous function.
1695 if (FunctionAST *F = ParseTopLevelExpr()) {
1696 if (Function *LF = F->Codegen()) {
1697 // JIT the function, returning a function pointer.
1698 void *FPtr = TheExecutionEngine->getPointerToFunction(LF);
1700 // Cast it to the right type (takes no arguments, returns a double) so we
1701 // can call it as a native function.
1702 double (*FP)() = (double (*)())(intptr_t)FPtr;
1703 fprintf(stderr, "Evaluated to %f\n", FP());
1706 // Skip token for error recovery.
1711 /// top ::= definition | external | expression | ';'
1712 static void MainLoop() {
1714 fprintf(stderr, "ready> ");
1716 case tok_eof: return;
1717 case ';': getNextToken(); break; // ignore top-level semicolons.
1718 case tok_def: HandleDefinition(); break;
1719 case tok_extern: HandleExtern(); break;
1720 default: HandleTopLevelExpression(); break;
1725 //===----------------------------------------------------------------------===//
1726 // "Library" functions that can be "extern'd" from user code.
1727 //===----------------------------------------------------------------------===//
1729 /// putchard - putchar that takes a double and returns 0.
1731 double putchard(double X) {
1736 /// printd - printf that takes a double prints it as "%f\n", returning 0.
1738 double printd(double X) {
1743 //===----------------------------------------------------------------------===//
1744 // Main driver code.
1745 //===----------------------------------------------------------------------===//
1748 InitializeNativeTarget();
1749 LLVMContext &Context = getGlobalContext();
1751 // Install standard binary operators.
1752 // 1 is lowest precedence.
1753 BinopPrecedence['<'] = 10;
1754 BinopPrecedence['+'] = 20;
1755 BinopPrecedence['-'] = 20;
1756 BinopPrecedence['*'] = 40; // highest.
1758 // Prime the first token.
1759 fprintf(stderr, "ready> ");
1762 // Make the module, which holds all the code.
1763 TheModule = new Module("my cool jit", Context);
1765 // Create the JIT. This takes ownership of the module.
1767 TheExecutionEngine = EngineBuilder(TheModule).setErrorStr(&ErrStr).create();
1768 if (!TheExecutionEngine) {
1769 fprintf(stderr, "Could not create ExecutionEngine: %s\n", ErrStr.c_str());
1773 FunctionPassManager OurFPM(TheModule);
1775 // Set up the optimizer pipeline. Start with registering info about how the
1776 // target lays out data structures.
1777 OurFPM.add(new TargetData(*TheExecutionEngine->getTargetData()));
1778 // Provide basic AliasAnalysis support for GVN.
1779 OurFPM.add(createBasicAliasAnalysisPass());
1780 // Do simple "peephole" optimizations and bit-twiddling optzns.
1781 OurFPM.add(createInstructionCombiningPass());
1782 // Reassociate expressions.
1783 OurFPM.add(createReassociatePass());
1784 // Eliminate Common SubExpressions.
1785 OurFPM.add(createGVNPass());
1786 // Simplify the control flow graph (deleting unreachable blocks, etc).
1787 OurFPM.add(createCFGSimplificationPass());
1789 OurFPM.doInitialization();
1791 // Set the global so the code gen can use this.
1792 TheFPM = &OurFPM;
1794 // Run the main "interpreter loop" now.
1799 // Print out all of the generated code.
1800 TheModule->dump();
1807 <a href="LangImpl7.html">Next: Extending the language: mutable variables / SSA construction</a>
1810 <!-- *********************************************************************** -->
1813 <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
1814 src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a>
1815 <a href="http://validator.w3.org/check/referer"><img
1816 src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
1818 <a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
1819 <a href="http://llvm.org/">The LLVM Compiler Infrastructure</a><br>
1820 Last modified: $Date$