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: Mutable Variables / SSA
8 <meta http-equiv=
"Content-Type" content=
"text/html; charset=utf-8">
9 <meta name=
"author" content=
"Chris Lattner">
10 <link rel=
"stylesheet" href=
"../llvm.css" type=
"text/css">
15 <h1>Kaleidoscope: Extending the Language: Mutable Variables
</h1>
18 <li><a href=
"index.html">Up to Tutorial Index
</a></li>
21 <li><a href=
"#intro">Chapter
7 Introduction
</a></li>
22 <li><a href=
"#why">Why is this a hard problem?
</a></li>
23 <li><a href=
"#memory">Memory in LLVM
</a></li>
24 <li><a href=
"#kalvars">Mutable Variables in Kaleidoscope
</a></li>
25 <li><a href=
"#adjustments">Adjusting Existing Variables for
27 <li><a href=
"#assignment">New Assignment Operator
</a></li>
28 <li><a href=
"#localvars">User-defined Local Variables
</a></li>
29 <li><a href=
"#code">Full Code Listing
</a></li>
32 <li><a href=
"LangImpl8.html">Chapter
8</a>: Conclusion and other useful LLVM
36 <div class=
"doc_author">
37 <p>Written by
<a href=
"mailto:sabre@nondot.org">Chris Lattner
</a></p>
40 <!-- *********************************************************************** -->
41 <h2><a name=
"intro">Chapter
7 Introduction
</a></h2>
42 <!-- *********************************************************************** -->
46 <p>Welcome to Chapter
7 of the
"<a href="index.html
">Implementing a language
47 with LLVM</a>" tutorial. In chapters
1 through
6, we've built a very
48 respectable, albeit simple,
<a
49 href=
"http://en.wikipedia.org/wiki/Functional_programming">functional
50 programming language
</a>. In our journey, we learned some parsing techniques,
51 how to build and represent an AST, how to build LLVM IR, and how to optimize
52 the resultant code as well as JIT compile it.
</p>
54 <p>While Kaleidoscope is interesting as a functional language, the fact that it
55 is functional makes it
"too easy" to generate LLVM IR for it. In particular, a
56 functional language makes it very easy to build LLVM IR directly in
<a
57 href=
"http://en.wikipedia.org/wiki/Static_single_assignment_form">SSA form
</a>.
58 Since LLVM requires that the input code be in SSA form, this is a very nice
59 property and it is often unclear to newcomers how to generate code for an
60 imperative language with mutable variables.
</p>
62 <p>The short (and happy) summary of this chapter is that there is no need for
63 your front-end to build SSA form: LLVM provides highly tuned and well tested
64 support for this, though the way it works is a bit unexpected for some.
</p>
68 <!-- *********************************************************************** -->
69 <h2><a name=
"why">Why is this a hard problem?
</a></h2>
70 <!-- *********************************************************************** -->
75 To understand why mutable variables cause complexities in SSA construction,
76 consider this extremely simple C example:
79 <div class=
"doc_code">
82 int test(_Bool Condition) {
93 <p>In this case, we have the variable
"X", whose value depends on the path
94 executed in the program. Because there are two different possible values for X
95 before the return instruction, a PHI node is inserted to merge the two values.
96 The LLVM IR that we want for this example looks like this:
</p>
98 <div class=
"doc_code">
100 @G = weak global i32
0 ; type of @G is i32*
101 @H = weak global i32
0 ; type of @H is i32*
103 define i32 @test(i1 %Condition) {
105 br i1 %Condition, label %cond_true, label %cond_false
116 %X
.2 = phi i32 [ %X
.1, %cond_false ], [ %X
.0, %cond_true ]
122 <p>In this example, the loads from the G and H global variables are explicit in
123 the LLVM IR, and they live in the then/else branches of the if statement
124 (cond_true/cond_false). In order to merge the incoming values, the X
.2 phi node
125 in the cond_next block selects the right value to use based on where control
126 flow is coming from: if control flow comes from the cond_false block, X
.2 gets
127 the value of X
.1. Alternatively, if control flow comes from cond_true, it gets
128 the value of X
.0. The intent of this chapter is not to explain the details of
129 SSA form. For more information, see one of the many
<a
130 href=
"http://en.wikipedia.org/wiki/Static_single_assignment_form">online
133 <p>The question for this article is
"who places the phi nodes when lowering
134 assignments to mutable variables?". The issue here is that LLVM
135 <em>requires
</em> that its IR be in SSA form: there is no
"non-ssa" mode for it.
136 However, SSA construction requires non-trivial algorithms and data structures,
137 so it is inconvenient and wasteful for every front-end to have to reproduce this
142 <!-- *********************************************************************** -->
143 <h2><a name=
"memory">Memory in LLVM
</a></h2>
144 <!-- *********************************************************************** -->
148 <p>The 'trick' here is that while LLVM does require all register values to be
149 in SSA form, it does not require (or permit) memory objects to be in SSA form.
150 In the example above, note that the loads from G and H are direct accesses to
151 G and H: they are not renamed or versioned. This differs from some other
152 compiler systems, which do try to version memory objects. In LLVM, instead of
153 encoding dataflow analysis of memory into the LLVM IR, it is handled with
<a
154 href=
"../WritingAnLLVMPass.html">Analysis Passes
</a> which are computed on
158 With this in mind, the high-level idea is that we want to make a stack variable
159 (which lives in memory, because it is on the stack) for each mutable object in
160 a function. To take advantage of this trick, we need to talk about how LLVM
161 represents stack variables.
164 <p>In LLVM, all memory accesses are explicit with load/store instructions, and
165 it is carefully designed not to have (or need) an
"address-of" operator. Notice
166 how the type of the @G/@H global variables is actually
"i32*" even though the
167 variable is defined as
"i32". What this means is that @G defines
<em>space
</em>
168 for an i32 in the global data area, but its
<em>name
</em> actually refers to the
169 address for that space. Stack variables work the same way, except that instead of
170 being declared with global variable definitions, they are declared with the
171 <a href=
"../LangRef.html#i_alloca">LLVM alloca instruction
</a>:
</p>
173 <div class=
"doc_code">
175 define i32 @example() {
177 %X = alloca i32 ; type of %X is i32*.
179 %tmp = load i32* %X ; load the stack value %X from the stack.
180 %tmp2 = add i32 %tmp,
1 ; increment it
181 store i32 %tmp2, i32* %X ; store it back
186 <p>This code shows an example of how you can declare and manipulate a stack
187 variable in the LLVM IR. Stack memory allocated with the alloca instruction is
188 fully general: you can pass the address of the stack slot to functions, you can
189 store it in other variables, etc. In our example above, we could rewrite the
190 example to use the alloca technique to avoid using a PHI node:
</p>
192 <div class=
"doc_code">
194 @G = weak global i32
0 ; type of @G is i32*
195 @H = weak global i32
0 ; type of @H is i32*
197 define i32 @test(i1 %Condition) {
199 %X = alloca i32 ; type of %X is i32*.
200 br i1 %Condition, label %cond_true, label %cond_false
204 store i32 %X
.0, i32* %X ; Update X
209 store i32 %X
.1, i32* %X ; Update X
213 %X
.2 = load i32* %X ; Read X
219 <p>With this, we have discovered a way to handle arbitrary mutable variables
220 without the need to create Phi nodes at all:
</p>
223 <li>Each mutable variable becomes a stack allocation.
</li>
224 <li>Each read of the variable becomes a load from the stack.
</li>
225 <li>Each update of the variable becomes a store to the stack.
</li>
226 <li>Taking the address of a variable just uses the stack address directly.
</li>
229 <p>While this solution has solved our immediate problem, it introduced another
230 one: we have now apparently introduced a lot of stack traffic for very simple
231 and common operations, a major performance problem. Fortunately for us, the
232 LLVM optimizer has a highly-tuned optimization pass named
"mem2reg" that handles
233 this case, promoting allocas like this into SSA registers, inserting Phi nodes
234 as appropriate. If you run this example through the pass, for example, you'll
237 <div class=
"doc_code">
239 $
<b>llvm-as
< example.ll | opt -mem2reg | llvm-dis
</b>
240 @G = weak global i32
0
241 @H = weak global i32
0
243 define i32 @test(i1 %Condition) {
245 br i1 %Condition, label %cond_true, label %cond_false
256 %X
.01 = phi i32 [ %X
.1, %cond_false ], [ %X
.0, %cond_true ]
262 <p>The mem2reg pass implements the standard
"iterated dominance frontier"
263 algorithm for constructing SSA form and has a number of optimizations that speed
264 up (very common) degenerate cases. The mem2reg optimization pass is the answer to dealing
265 with mutable variables, and we highly recommend that you depend on it. Note that
266 mem2reg only works on variables in certain circumstances:
</p>
269 <li>mem2reg is alloca-driven: it looks for allocas and if it can handle them, it
270 promotes them. It does not apply to global variables or heap allocations.
</li>
272 <li>mem2reg only looks for alloca instructions in the entry block of the
273 function. Being in the entry block guarantees that the alloca is only executed
274 once, which makes analysis simpler.
</li>
276 <li>mem2reg only promotes allocas whose uses are direct loads and stores. If
277 the address of the stack object is passed to a function, or if any funny pointer
278 arithmetic is involved, the alloca will not be promoted.
</li>
280 <li>mem2reg only works on allocas of
<a
281 href=
"../LangRef.html#t_classifications">first class
</a>
282 values (such as pointers, scalars and vectors), and only if the array size
283 of the allocation is
1 (or missing in the .ll file). mem2reg is not capable of
284 promoting structs or arrays to registers. Note that the
"scalarrepl" pass is
285 more powerful and can promote structs,
"unions", and arrays in many cases.
</li>
290 All of these properties are easy to satisfy for most imperative languages, and
291 we'll illustrate it below with Kaleidoscope. The final question you may be
292 asking is: should I bother with this nonsense for my front-end? Wouldn't it be
293 better if I just did SSA construction directly, avoiding use of the mem2reg
294 optimization pass? In short, we strongly recommend that you use this technique
295 for building SSA form, unless there is an extremely good reason not to. Using
296 this technique is:
</p>
299 <li>Proven and well tested: llvm-gcc and clang both use this technique for local
300 mutable variables. As such, the most common clients of LLVM are using this to
301 handle a bulk of their variables. You can be sure that bugs are found fast and
304 <li>Extremely Fast: mem2reg has a number of special cases that make it fast in
305 common cases as well as fully general. For example, it has fast-paths for
306 variables that are only used in a single block, variables that only have one
307 assignment point, good heuristics to avoid insertion of unneeded phi nodes, etc.
310 <li>Needed for debug info generation:
<a href=
"../SourceLevelDebugging.html">
311 Debug information in LLVM
</a> relies on having the address of the variable
312 exposed so that debug info can be attached to it. This technique dovetails
313 very naturally with this style of debug info.
</li>
316 <p>If nothing else, this makes it much easier to get your front-end up and
317 running, and is very simple to implement. Lets extend Kaleidoscope with mutable
323 <!-- *********************************************************************** -->
324 <h2><a name=
"kalvars">Mutable Variables in Kaleidoscope
</a></h2>
325 <!-- *********************************************************************** -->
329 <p>Now that we know the sort of problem we want to tackle, lets see what this
330 looks like in the context of our little Kaleidoscope language. We're going to
331 add two features:
</p>
334 <li>The ability to mutate variables with the '=' operator.
</li>
335 <li>The ability to define new variables.
</li>
338 <p>While the first item is really what this is about, we only have variables
339 for incoming arguments as well as for induction variables, and redefining those only
340 goes so far :). Also, the ability to define new variables is a
341 useful thing regardless of whether you will be mutating them. Here's a
342 motivating example that shows how we could use these:
</p>
344 <div class=
"doc_code">
346 # Define ':' for sequencing: as a low-precedence operator that ignores operands
347 # and just returns the RHS.
348 def binary :
1 (x y) y;
350 # Recursive fib, we could do this before.
359 <b>var a =
1, b =
1, c in
</b>
360 (for i =
3, i
< x in
372 In order to mutate variables, we have to change our existing variables to use
373 the
"alloca trick". Once we have that, we'll add our new operator, then extend
374 Kaleidoscope to support new variable definitions.
379 <!-- *********************************************************************** -->
380 <h2><a name=
"adjustments">Adjusting Existing Variables for Mutation
</a></h2>
381 <!-- *********************************************************************** -->
386 The symbol table in Kaleidoscope is managed at code generation time by the
387 '
<tt>NamedValues
</tt>' map. This map currently keeps track of the LLVM
"Value*"
388 that holds the double value for the named variable. In order to support
389 mutation, we need to change this slightly, so that it
<tt>NamedValues
</tt> holds
390 the
<em>memory location
</em> of the variable in question. Note that this
391 change is a refactoring: it changes the structure of the code, but does not
392 (by itself) change the behavior of the compiler. All of these changes are
393 isolated in the Kaleidoscope code generator.
</p>
396 At this point in Kaleidoscope's development, it only supports variables for two
397 things: incoming arguments to functions and the induction variable of 'for'
398 loops. For consistency, we'll allow mutation of these variables in addition to
399 other user-defined variables. This means that these will both need memory
403 <p>To start our transformation of Kaleidoscope, we'll change the NamedValues
404 map so that it maps to AllocaInst* instead of Value*. Once we do this, the C++
405 compiler will tell us what parts of the code we need to update:
</p>
407 <div class=
"doc_code">
409 static std::map
<std::string, AllocaInst*
> NamedValues;
413 <p>Also, since we will need to create these alloca's, we'll use a helper
414 function that ensures that the allocas are created in the entry block of the
417 <div class=
"doc_code">
419 /// CreateEntryBlockAlloca - Create an alloca instruction in the entry block of
420 /// the function. This is used for mutable variables etc.
421 static AllocaInst *CreateEntryBlockAlloca(Function *TheFunction,
422 const std::string
&VarName) {
423 IRBuilder
<> TmpB(
&TheFunction-
>getEntryBlock(),
424 TheFunction-
>getEntryBlock().begin());
425 return TmpB.CreateAlloca(Type::getDoubleTy(getGlobalContext()),
0,
431 <p>This funny looking code creates an IRBuilder object that is pointing at
432 the first instruction (.begin()) of the entry block. It then creates an alloca
433 with the expected name and returns it. Because all values in Kaleidoscope are
434 doubles, there is no need to pass in a type to use.
</p>
436 <p>With this in place, the first functionality change we want to make is to
437 variable references. In our new scheme, variables live on the stack, so code
438 generating a reference to them actually needs to produce a load from the stack
441 <div class=
"doc_code">
443 Value *VariableExprAST::Codegen() {
444 // Look this variable up in the function.
445 Value *V = NamedValues[Name];
446 if (V ==
0) return ErrorV(
"Unknown variable name");
448 <b>// Load the value.
449 return Builder.CreateLoad(V, Name.c_str());
</b>
454 <p>As you can see, this is pretty straightforward. Now we need to update the
455 things that define the variables to set up the alloca. We'll start with
456 <tt>ForExprAST::Codegen
</tt> (see the
<a href=
"#code">full code listing
</a> for
457 the unabridged code):
</p>
459 <div class=
"doc_code">
461 Function *TheFunction = Builder.GetInsertBlock()-
>getParent();
463 <b>// Create an alloca for the variable in the entry block.
464 AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, VarName);
</b>
466 // Emit the start code first, without 'variable' in scope.
467 Value *StartVal = Start-
>Codegen();
468 if (StartVal ==
0) return
0;
470 <b>// Store the value into the alloca.
471 Builder.CreateStore(StartVal, Alloca);
</b>
474 // Compute the end condition.
475 Value *EndCond = End-
>Codegen();
476 if (EndCond ==
0) return EndCond;
478 <b>// Reload, increment, and restore the alloca. This handles the case where
479 // the body of the loop mutates the variable.
480 Value *CurVar = Builder.CreateLoad(Alloca);
481 Value *NextVar = Builder.CreateFAdd(CurVar, StepVal,
"nextvar");
482 Builder.CreateStore(NextVar, Alloca);
</b>
487 <p>This code is virtually identical to the code
<a
488 href=
"LangImpl5.html#forcodegen">before we allowed mutable variables
</a>. The
489 big difference is that we no longer have to construct a PHI node, and we use
490 load/store to access the variable as needed.
</p>
492 <p>To support mutable argument variables, we need to also make allocas for them.
493 The code for this is also pretty simple:
</p>
495 <div class=
"doc_code">
497 /// CreateArgumentAllocas - Create an alloca for each argument and register the
498 /// argument in the symbol table so that references to it will succeed.
499 void PrototypeAST::CreateArgumentAllocas(Function *F) {
500 Function::arg_iterator AI = F-
>arg_begin();
501 for (unsigned Idx =
0, e = Args.size(); Idx != e; ++Idx, ++AI) {
502 // Create an alloca for this variable.
503 AllocaInst *Alloca = CreateEntryBlockAlloca(F, Args[Idx]);
505 // Store the initial value into the alloca.
506 Builder.CreateStore(AI, Alloca);
508 // Add arguments to variable symbol table.
509 NamedValues[Args[Idx]] = Alloca;
515 <p>For each argument, we make an alloca, store the input value to the function
516 into the alloca, and register the alloca as the memory location for the
517 argument. This method gets invoked by
<tt>FunctionAST::Codegen
</tt> right after
518 it sets up the entry block for the function.
</p>
520 <p>The final missing piece is adding the mem2reg pass, which allows us to get
521 good codegen once again:
</p>
523 <div class=
"doc_code">
525 // Set up the optimizer pipeline. Start with registering info about how the
526 // target lays out data structures.
527 OurFPM.add(new TargetData(*TheExecutionEngine-
>getTargetData()));
528 <b>// Promote allocas to registers.
529 OurFPM.add(createPromoteMemoryToRegisterPass());
</b>
530 // Do simple
"peephole" optimizations and bit-twiddling optzns.
531 OurFPM.add(createInstructionCombiningPass());
532 // Reassociate expressions.
533 OurFPM.add(createReassociatePass());
537 <p>It is interesting to see what the code looks like before and after the
538 mem2reg optimization runs. For example, this is the before/after code for our
539 recursive fib function. Before the optimization:
</p>
541 <div class=
"doc_code">
543 define double @fib(double %x) {
545 <b>%x1 = alloca double
546 store double %x, double* %x1
547 %x2 = load double* %x1
</b>
548 %cmptmp = fcmp ult double %x2,
3.000000e+00
549 %booltmp = uitofp i1 %cmptmp to double
550 %ifcond = fcmp one double %booltmp,
0.000000e+00
551 br i1 %ifcond, label %then, label %else
553 then: ; preds = %entry
556 else: ; preds = %entry
557 <b>%x3 = load double* %x1
</b>
558 %subtmp = fsub double %x3,
1.000000e+00
559 %calltmp = call double @fib(double %subtmp)
560 <b>%x4 = load double* %x1
</b>
561 %subtmp5 = fsub double %x4,
2.000000e+00
562 %calltmp6 = call double @fib(double %subtmp5)
563 %addtmp = fadd double %calltmp, %calltmp6
566 ifcont: ; preds = %else, %then
567 %iftmp = phi double [
1.000000e+00, %then ], [ %addtmp, %else ]
573 <p>Here there is only one variable (x, the input argument) but you can still
574 see the extremely simple-minded code generation strategy we are using. In the
575 entry block, an alloca is created, and the initial input value is stored into
576 it. Each reference to the variable does a reload from the stack. Also, note
577 that we didn't modify the if/then/else expression, so it still inserts a PHI
578 node. While we could make an alloca for it, it is actually easier to create a
579 PHI node for it, so we still just make the PHI.
</p>
581 <p>Here is the code after the mem2reg pass runs:
</p>
583 <div class=
"doc_code">
585 define double @fib(double %x) {
587 %cmptmp = fcmp ult double
<b>%x
</b>,
3.000000e+00
588 %booltmp = uitofp i1 %cmptmp to double
589 %ifcond = fcmp one double %booltmp,
0.000000e+00
590 br i1 %ifcond, label %then, label %else
596 %subtmp = fsub double
<b>%x
</b>,
1.000000e+00
597 %calltmp = call double @fib(double %subtmp)
598 %subtmp5 = fsub double
<b>%x
</b>,
2.000000e+00
599 %calltmp6 = call double @fib(double %subtmp5)
600 %addtmp = fadd double %calltmp, %calltmp6
603 ifcont: ; preds = %else, %then
604 %iftmp = phi double [
1.000000e+00, %then ], [ %addtmp, %else ]
610 <p>This is a trivial case for mem2reg, since there are no redefinitions of the
611 variable. The point of showing this is to calm your tension about inserting
612 such blatent inefficiencies :).
</p>
614 <p>After the rest of the optimizers run, we get:
</p>
616 <div class=
"doc_code">
618 define double @fib(double %x) {
620 %cmptmp = fcmp ult double %x,
3.000000e+00
621 %booltmp = uitofp i1 %cmptmp to double
622 %ifcond = fcmp ueq double %booltmp,
0.000000e+00
623 br i1 %ifcond, label %else, label %ifcont
626 %subtmp = fsub double %x,
1.000000e+00
627 %calltmp = call double @fib(double %subtmp)
628 %subtmp5 = fsub double %x,
2.000000e+00
629 %calltmp6 = call double @fib(double %subtmp5)
630 %addtmp = fadd double %calltmp, %calltmp6
634 ret double
1.000000e+00
639 <p>Here we see that the simplifycfg pass decided to clone the return instruction
640 into the end of the 'else' block. This allowed it to eliminate some branches
641 and the PHI node.
</p>
643 <p>Now that all symbol table references are updated to use stack variables,
644 we'll add the assignment operator.
</p>
648 <!-- *********************************************************************** -->
649 <h2><a name=
"assignment">New Assignment Operator
</a></h2>
650 <!-- *********************************************************************** -->
654 <p>With our current framework, adding a new assignment operator is really
655 simple. We will parse it just like any other binary operator, but handle it
656 internally (instead of allowing the user to define it). The first step is to
657 set a precedence:
</p>
659 <div class=
"doc_code">
662 // Install standard binary operators.
663 //
1 is lowest precedence.
664 <b>BinopPrecedence['='] =
2;
</b>
665 BinopPrecedence['
<'] =
10;
666 BinopPrecedence['+'] =
20;
667 BinopPrecedence['-'] =
20;
671 <p>Now that the parser knows the precedence of the binary operator, it takes
672 care of all the parsing and AST generation. We just need to implement codegen
673 for the assignment operator. This looks like:
</p>
675 <div class=
"doc_code">
677 Value *BinaryExprAST::Codegen() {
678 // Special case '=' because we don't want to emit the LHS as an expression.
680 // Assignment requires the LHS to be an identifier.
681 VariableExprAST *LHSE = dynamic_cast
<VariableExprAST*
>(LHS);
683 return ErrorV(
"destination of '=' must be a variable");
687 <p>Unlike the rest of the binary operators, our assignment operator doesn't
688 follow the
"emit LHS, emit RHS, do computation" model. As such, it is handled
689 as a special case before the other binary operators are handled. The other
690 strange thing is that it requires the LHS to be a variable. It is invalid to
691 have
"(x+1) = expr" - only things like
"x = expr" are allowed.
694 <div class=
"doc_code">
697 Value *Val = RHS-
>Codegen();
698 if (Val ==
0) return
0;
701 Value *Variable = NamedValues[LHSE-
>getName()];
702 if (Variable ==
0) return ErrorV(
"Unknown variable name");
704 Builder.CreateStore(Val, Variable);
711 <p>Once we have the variable, codegen'ing the assignment is straightforward:
712 we emit the RHS of the assignment, create a store, and return the computed
713 value. Returning a value allows for chained assignments like
"X = (Y = Z)".
</p>
715 <p>Now that we have an assignment operator, we can mutate loop variables and
716 arguments. For example, we can now run code like this:
</p>
718 <div class=
"doc_code">
720 # Function to print a double.
723 # Define ':' for sequencing: as a low-precedence operator that ignores operands
724 # and just returns the RHS.
725 def binary :
1 (x y) y;
736 <p>When run, this example prints
"123" and then
"4", showing that we did
737 actually mutate the value! Okay, we have now officially implemented our goal:
738 getting this to work requires SSA construction in the general case. However,
739 to be really useful, we want the ability to define our own local variables, lets
745 <!-- *********************************************************************** -->
746 <h2><a name=
"localvars">User-defined Local Variables
</a></h2>
747 <!-- *********************************************************************** -->
751 <p>Adding var/in is just like any other other extensions we made to
752 Kaleidoscope: we extend the lexer, the parser, the AST and the code generator.
753 The first step for adding our new 'var/in' construct is to extend the lexer.
754 As before, this is pretty trivial, the code looks like this:
</p>
756 <div class=
"doc_code">
765 static int gettok() {
767 if (IdentifierStr ==
"in") return tok_in;
768 if (IdentifierStr ==
"binary") return tok_binary;
769 if (IdentifierStr ==
"unary") return tok_unary;
770 <b>if (IdentifierStr ==
"var") return tok_var;
</b>
771 return tok_identifier;
776 <p>The next step is to define the AST node that we will construct. For var/in,
777 it looks like this:
</p>
779 <div class=
"doc_code">
781 /// VarExprAST - Expression class for var/in
782 class VarExprAST : public ExprAST {
783 std::vector
<std::pair
<std::string, ExprAST*
> > VarNames;
786 VarExprAST(const std::vector
<std::pair
<std::string, ExprAST*
> > &varnames,
788 : VarNames(varnames), Body(body) {}
790 virtual Value *Codegen();
795 <p>var/in allows a list of names to be defined all at once, and each name can
796 optionally have an initializer value. As such, we capture this information in
797 the VarNames vector. Also, var/in has a body, this body is allowed to access
798 the variables defined by the var/in.
</p>
800 <p>With this in place, we can define the parser pieces. The first thing we do is add
801 it as a primary expression:
</p>
803 <div class=
"doc_code">
806 /// ::= identifierexpr
811 <b>/// ::= varexpr
</b>
812 static ExprAST *ParsePrimary() {
814 default: return Error(
"unknown token when expecting an expression");
815 case tok_identifier: return ParseIdentifierExpr();
816 case tok_number: return ParseNumberExpr();
817 case '(': return ParseParenExpr();
818 case tok_if: return ParseIfExpr();
819 case tok_for: return ParseForExpr();
820 <b>case tok_var: return ParseVarExpr();
</b>
826 <p>Next we define ParseVarExpr:
</p>
828 <div class=
"doc_code">
830 /// varexpr ::= 'var' identifier ('=' expression)?
831 // (',' identifier ('=' expression)?)* 'in' expression
832 static ExprAST *ParseVarExpr() {
833 getNextToken(); // eat the var.
835 std::vector
<std::pair
<std::string, ExprAST*
> > VarNames;
837 // At least one variable name is required.
838 if (CurTok != tok_identifier)
839 return Error(
"expected identifier after var");
843 <p>The first part of this code parses the list of identifier/expr pairs into the
844 local
<tt>VarNames
</tt> vector.
846 <div class=
"doc_code">
849 std::string Name = IdentifierStr;
850 getNextToken(); // eat identifier.
852 // Read the optional initializer.
855 getNextToken(); // eat the '='.
857 Init = ParseExpression();
858 if (Init ==
0) return
0;
861 VarNames.push_back(std::make_pair(Name, Init));
863 // End of var list, exit loop.
864 if (CurTok != ',') break;
865 getNextToken(); // eat the ','.
867 if (CurTok != tok_identifier)
868 return Error(
"expected identifier list after var");
873 <p>Once all the variables are parsed, we then parse the body and create the
876 <div class=
"doc_code">
878 // At this point, we have to have 'in'.
879 if (CurTok != tok_in)
880 return Error(
"expected 'in' keyword after 'var'");
881 getNextToken(); // eat 'in'.
883 ExprAST *Body = ParseExpression();
884 if (Body ==
0) return
0;
886 return new VarExprAST(VarNames, Body);
891 <p>Now that we can parse and represent the code, we need to support emission of
892 LLVM IR for it. This code starts out with:
</p>
894 <div class=
"doc_code">
896 Value *VarExprAST::Codegen() {
897 std::vector
<AllocaInst *
> OldBindings;
899 Function *TheFunction = Builder.GetInsertBlock()-
>getParent();
901 // Register all variables and emit their initializer.
902 for (unsigned i =
0, e = VarNames.size(); i != e; ++i) {
903 const std::string
&VarName = VarNames[i].first;
904 ExprAST *Init = VarNames[i].second;
908 <p>Basically it loops over all the variables, installing them one at a time.
909 For each variable we put into the symbol table, we remember the previous value
910 that we replace in OldBindings.
</p>
912 <div class=
"doc_code">
914 // Emit the initializer before adding the variable to scope, this prevents
915 // the initializer from referencing the variable itself, and permits stuff
918 // var a = a in ... # refers to outer 'a'.
921 InitVal = Init-
>Codegen();
922 if (InitVal ==
0) return
0;
923 } else { // If not specified, use
0.0.
924 InitVal = ConstantFP::get(getGlobalContext(), APFloat(
0.0));
927 AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, VarName);
928 Builder.CreateStore(InitVal, Alloca);
930 // Remember the old variable binding so that we can restore the binding when
932 OldBindings.push_back(NamedValues[VarName]);
934 // Remember this binding.
935 NamedValues[VarName] = Alloca;
940 <p>There are more comments here than code. The basic idea is that we emit the
941 initializer, create the alloca, then update the symbol table to point to it.
942 Once all the variables are installed in the symbol table, we evaluate the body
943 of the var/in expression:
</p>
945 <div class=
"doc_code">
947 // Codegen the body, now that all vars are in scope.
948 Value *BodyVal = Body-
>Codegen();
949 if (BodyVal ==
0) return
0;
953 <p>Finally, before returning, we restore the previous variable bindings:
</p>
955 <div class=
"doc_code">
957 // Pop all our variables from scope.
958 for (unsigned i =
0, e = VarNames.size(); i != e; ++i)
959 NamedValues[VarNames[i].first] = OldBindings[i];
961 // Return the body computation.
967 <p>The end result of all of this is that we get properly scoped variable
968 definitions, and we even (trivially) allow mutation of them :).
</p>
970 <p>With this, we completed what we set out to do. Our nice iterative fib
971 example from the intro compiles and runs just fine. The mem2reg pass optimizes
972 all of our stack variables into SSA registers, inserting PHI nodes where needed,
973 and our front-end remains simple: no
"iterated dominance frontier" computation
974 anywhere in sight.
</p>
978 <!-- *********************************************************************** -->
979 <h2><a name=
"code">Full Code Listing
</a></h2>
980 <!-- *********************************************************************** -->
985 Here is the complete code listing for our running example, enhanced with mutable
986 variables and var/in support. To build this example, use:
989 <div class=
"doc_code">
992 g++ -g toy.cpp `llvm-config --cppflags --ldflags --libs core jit native` -O3 -o toy
998 <p>Here is the code:
</p>
1000 <div class=
"doc_code">
1002 #include
"llvm/DerivedTypes.h"
1003 #include
"llvm/ExecutionEngine/ExecutionEngine.h"
1004 #include
"llvm/ExecutionEngine/JIT.h"
1005 #include
"llvm/LLVMContext.h"
1006 #include
"llvm/Module.h"
1007 #include
"llvm/PassManager.h"
1008 #include
"llvm/Analysis/Verifier.h"
1009 #include
"llvm/Analysis/Passes.h"
1010 #include
"llvm/Target/TargetData.h"
1011 #include
"llvm/Target/TargetSelect.h"
1012 #include
"llvm/Transforms/Scalar.h"
1013 #include
"llvm/Support/IRBuilder.h"
1014 #include
<cstdio
>
1015 #include
<string
>
1016 #include
<map
>
1017 #include
<vector
>
1018 using namespace llvm;
1020 //===----------------------------------------------------------------------===//
1022 //===----------------------------------------------------------------------===//
1024 // The lexer returns tokens [
0-
255] if it is an unknown character, otherwise one
1025 // of these for known things.
1030 tok_def = -
2, tok_extern = -
3,
1033 tok_identifier = -
4, tok_number = -
5,
1036 tok_if = -
6, tok_then = -
7, tok_else = -
8,
1037 tok_for = -
9, tok_in = -
10,
1040 tok_binary = -
11, tok_unary = -
12,
1046 static std::string IdentifierStr; // Filled in if tok_identifier
1047 static double NumVal; // Filled in if tok_number
1049 /// gettok - Return the next token from standard input.
1050 static int gettok() {
1051 static int LastChar = ' ';
1053 // Skip any whitespace.
1054 while (isspace(LastChar))
1055 LastChar = getchar();
1057 if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-
9]*
1058 IdentifierStr = LastChar;
1059 while (isalnum((LastChar = getchar())))
1060 IdentifierStr += LastChar;
1062 if (IdentifierStr ==
"def") return tok_def;
1063 if (IdentifierStr ==
"extern") return tok_extern;
1064 if (IdentifierStr ==
"if") return tok_if;
1065 if (IdentifierStr ==
"then") return tok_then;
1066 if (IdentifierStr ==
"else") return tok_else;
1067 if (IdentifierStr ==
"for") return tok_for;
1068 if (IdentifierStr ==
"in") return tok_in;
1069 if (IdentifierStr ==
"binary") return tok_binary;
1070 if (IdentifierStr ==
"unary") return tok_unary;
1071 if (IdentifierStr ==
"var") return tok_var;
1072 return tok_identifier;
1075 if (isdigit(LastChar) || LastChar == '.') { // Number: [
0-
9.]+
1079 LastChar = getchar();
1080 } while (isdigit(LastChar) || LastChar == '.');
1082 NumVal = strtod(NumStr.c_str(),
0);
1086 if (LastChar == '#') {
1087 // Comment until end of line.
1088 do LastChar = getchar();
1089 while (LastChar != EOF
&& LastChar != '\n'
&& LastChar != '\r');
1091 if (LastChar != EOF)
1095 // Check for end of file. Don't eat the EOF.
1096 if (LastChar == EOF)
1099 // Otherwise, just return the character as its ascii value.
1100 int ThisChar = LastChar;
1101 LastChar = getchar();
1105 //===----------------------------------------------------------------------===//
1106 // Abstract Syntax Tree (aka Parse Tree)
1107 //===----------------------------------------------------------------------===//
1109 /// ExprAST - Base class for all expression nodes.
1112 virtual ~ExprAST() {}
1113 virtual Value *Codegen() =
0;
1116 /// NumberExprAST - Expression class for numeric literals like
"1.0".
1117 class NumberExprAST : public ExprAST {
1120 NumberExprAST(double val) : Val(val) {}
1121 virtual Value *Codegen();
1124 /// VariableExprAST - Expression class for referencing a variable, like
"a".
1125 class VariableExprAST : public ExprAST {
1128 VariableExprAST(const std::string
&name) : Name(name) {}
1129 const std::string
&getName() const { return Name; }
1130 virtual Value *Codegen();
1133 /// UnaryExprAST - Expression class for a unary operator.
1134 class UnaryExprAST : public ExprAST {
1138 UnaryExprAST(char opcode, ExprAST *operand)
1139 : Opcode(opcode), Operand(operand) {}
1140 virtual Value *Codegen();
1143 /// BinaryExprAST - Expression class for a binary operator.
1144 class BinaryExprAST : public ExprAST {
1148 BinaryExprAST(char op, ExprAST *lhs, ExprAST *rhs)
1149 : Op(op), LHS(lhs), RHS(rhs) {}
1150 virtual Value *Codegen();
1153 /// CallExprAST - Expression class for function calls.
1154 class CallExprAST : public ExprAST {
1156 std::vector
<ExprAST*
> Args;
1158 CallExprAST(const std::string
&callee, std::vector
<ExprAST*
> &args)
1159 : Callee(callee), Args(args) {}
1160 virtual Value *Codegen();
1163 /// IfExprAST - Expression class for if/then/else.
1164 class IfExprAST : public ExprAST {
1165 ExprAST *Cond, *Then, *Else;
1167 IfExprAST(ExprAST *cond, ExprAST *then, ExprAST *_else)
1168 : Cond(cond), Then(then), Else(_else) {}
1169 virtual Value *Codegen();
1172 /// ForExprAST - Expression class for for/in.
1173 class ForExprAST : public ExprAST {
1174 std::string VarName;
1175 ExprAST *Start, *End, *Step, *Body;
1177 ForExprAST(const std::string
&varname, ExprAST *start, ExprAST *end,
1178 ExprAST *step, ExprAST *body)
1179 : VarName(varname), Start(start), End(end), Step(step), Body(body) {}
1180 virtual Value *Codegen();
1183 /// VarExprAST - Expression class for var/in
1184 class VarExprAST : public ExprAST {
1185 std::vector
<std::pair
<std::string, ExprAST*
> > VarNames;
1188 VarExprAST(const std::vector
<std::pair
<std::string, ExprAST*
> > &varnames,
1190 : VarNames(varnames), Body(body) {}
1192 virtual Value *Codegen();
1195 /// PrototypeAST - This class represents the
"prototype" for a function,
1196 /// which captures its name, and its argument names (thus implicitly the number
1197 /// of arguments the function takes), as well as if it is an operator.
1198 class PrototypeAST {
1200 std::vector
<std::string
> Args;
1202 unsigned Precedence; // Precedence if a binary op.
1204 PrototypeAST(const std::string
&name, const std::vector
<std::string
> &args,
1205 bool isoperator = false, unsigned prec =
0)
1206 : Name(name), Args(args), isOperator(isoperator), Precedence(prec) {}
1208 bool isUnaryOp() const { return isOperator
&& Args.size() ==
1; }
1209 bool isBinaryOp() const { return isOperator
&& Args.size() ==
2; }
1211 char getOperatorName() const {
1212 assert(isUnaryOp() || isBinaryOp());
1213 return Name[Name.size()-
1];
1216 unsigned getBinaryPrecedence() const { return Precedence; }
1218 Function *Codegen();
1220 void CreateArgumentAllocas(Function *F);
1223 /// FunctionAST - This class represents a function definition itself.
1225 PrototypeAST *Proto;
1228 FunctionAST(PrototypeAST *proto, ExprAST *body)
1229 : Proto(proto), Body(body) {}
1231 Function *Codegen();
1234 //===----------------------------------------------------------------------===//
1236 //===----------------------------------------------------------------------===//
1238 /// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
1239 /// token the parser is looking at. getNextToken reads another token from the
1240 /// lexer and updates CurTok with its results.
1242 static int getNextToken() {
1243 return CurTok = gettok();
1246 /// BinopPrecedence - This holds the precedence for each binary operator that is
1248 static std::map
<char, int
> BinopPrecedence;
1250 /// GetTokPrecedence - Get the precedence of the pending binary operator token.
1251 static int GetTokPrecedence() {
1252 if (!isascii(CurTok))
1255 // Make sure it's a declared binop.
1256 int TokPrec = BinopPrecedence[CurTok];
1257 if (TokPrec
<=
0) return -
1;
1261 /// Error* - These are little helper functions for error handling.
1262 ExprAST *Error(const char *Str) { fprintf(stderr,
"Error: %s\n", Str);return
0;}
1263 PrototypeAST *ErrorP(const char *Str) { Error(Str); return
0; }
1264 FunctionAST *ErrorF(const char *Str) { Error(Str); return
0; }
1266 static ExprAST *ParseExpression();
1270 /// ::= identifier '(' expression* ')'
1271 static ExprAST *ParseIdentifierExpr() {
1272 std::string IdName = IdentifierStr;
1274 getNextToken(); // eat identifier.
1276 if (CurTok != '(') // Simple variable ref.
1277 return new VariableExprAST(IdName);
1280 getNextToken(); // eat (
1281 std::vector
<ExprAST*
> Args;
1282 if (CurTok != ')') {
1284 ExprAST *Arg = ParseExpression();
1286 Args.push_back(Arg);
1288 if (CurTok == ')') break;
1291 return Error(
"Expected ')' or ',' in argument list");
1299 return new CallExprAST(IdName, Args);
1302 /// numberexpr ::= number
1303 static ExprAST *ParseNumberExpr() {
1304 ExprAST *Result = new NumberExprAST(NumVal);
1305 getNextToken(); // consume the number
1309 /// parenexpr ::= '(' expression ')'
1310 static ExprAST *ParseParenExpr() {
1311 getNextToken(); // eat (.
1312 ExprAST *V = ParseExpression();
1316 return Error(
"expected ')'");
1317 getNextToken(); // eat ).
1321 /// ifexpr ::= 'if' expression 'then' expression 'else' expression
1322 static ExprAST *ParseIfExpr() {
1323 getNextToken(); // eat the if.
1326 ExprAST *Cond = ParseExpression();
1327 if (!Cond) return
0;
1329 if (CurTok != tok_then)
1330 return Error(
"expected then");
1331 getNextToken(); // eat the then
1333 ExprAST *Then = ParseExpression();
1334 if (Then ==
0) return
0;
1336 if (CurTok != tok_else)
1337 return Error(
"expected else");
1341 ExprAST *Else = ParseExpression();
1342 if (!Else) return
0;
1344 return new IfExprAST(Cond, Then, Else);
1347 /// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
1348 static ExprAST *ParseForExpr() {
1349 getNextToken(); // eat the for.
1351 if (CurTok != tok_identifier)
1352 return Error(
"expected identifier after for");
1354 std::string IdName = IdentifierStr;
1355 getNextToken(); // eat identifier.
1358 return Error(
"expected '=' after for");
1359 getNextToken(); // eat '='.
1362 ExprAST *Start = ParseExpression();
1363 if (Start ==
0) return
0;
1365 return Error(
"expected ',' after for start value");
1368 ExprAST *End = ParseExpression();
1369 if (End ==
0) return
0;
1371 // The step value is optional.
1373 if (CurTok == ',') {
1375 Step = ParseExpression();
1376 if (Step ==
0) return
0;
1379 if (CurTok != tok_in)
1380 return Error(
"expected 'in' after for");
1381 getNextToken(); // eat 'in'.
1383 ExprAST *Body = ParseExpression();
1384 if (Body ==
0) return
0;
1386 return new ForExprAST(IdName, Start, End, Step, Body);
1389 /// varexpr ::= 'var' identifier ('=' expression)?
1390 // (',' identifier ('=' expression)?)* 'in' expression
1391 static ExprAST *ParseVarExpr() {
1392 getNextToken(); // eat the var.
1394 std::vector
<std::pair
<std::string, ExprAST*
> > VarNames;
1396 // At least one variable name is required.
1397 if (CurTok != tok_identifier)
1398 return Error(
"expected identifier after var");
1401 std::string Name = IdentifierStr;
1402 getNextToken(); // eat identifier.
1404 // Read the optional initializer.
1406 if (CurTok == '=') {
1407 getNextToken(); // eat the '='.
1409 Init = ParseExpression();
1410 if (Init ==
0) return
0;
1413 VarNames.push_back(std::make_pair(Name, Init));
1415 // End of var list, exit loop.
1416 if (CurTok != ',') break;
1417 getNextToken(); // eat the ','.
1419 if (CurTok != tok_identifier)
1420 return Error(
"expected identifier list after var");
1423 // At this point, we have to have 'in'.
1424 if (CurTok != tok_in)
1425 return Error(
"expected 'in' keyword after 'var'");
1426 getNextToken(); // eat 'in'.
1428 ExprAST *Body = ParseExpression();
1429 if (Body ==
0) return
0;
1431 return new VarExprAST(VarNames, Body);
1435 /// ::= identifierexpr
1441 static ExprAST *ParsePrimary() {
1443 default: return Error(
"unknown token when expecting an expression");
1444 case tok_identifier: return ParseIdentifierExpr();
1445 case tok_number: return ParseNumberExpr();
1446 case '(': return ParseParenExpr();
1447 case tok_if: return ParseIfExpr();
1448 case tok_for: return ParseForExpr();
1449 case tok_var: return ParseVarExpr();
1456 static ExprAST *ParseUnary() {
1457 // If the current token is not an operator, it must be a primary expr.
1458 if (!isascii(CurTok) || CurTok == '(' || CurTok == ',')
1459 return ParsePrimary();
1461 // If this is a unary operator, read it.
1464 if (ExprAST *Operand = ParseUnary())
1465 return new UnaryExprAST(Opc, Operand);
1470 /// ::= ('+' unary)*
1471 static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
1472 // If this is a binop, find its precedence.
1474 int TokPrec = GetTokPrecedence();
1476 // If this is a binop that binds at least as tightly as the current binop,
1477 // consume it, otherwise we are done.
1478 if (TokPrec
< ExprPrec)
1481 // Okay, we know this is a binop.
1483 getNextToken(); // eat binop
1485 // Parse the unary expression after the binary operator.
1486 ExprAST *RHS = ParseUnary();
1489 // If BinOp binds less tightly with RHS than the operator after RHS, let
1490 // the pending operator take RHS as its LHS.
1491 int NextPrec = GetTokPrecedence();
1492 if (TokPrec
< NextPrec) {
1493 RHS = ParseBinOpRHS(TokPrec+
1, RHS);
1494 if (RHS ==
0) return
0;
1498 LHS = new BinaryExprAST(BinOp, LHS, RHS);
1503 /// ::= unary binoprhs
1505 static ExprAST *ParseExpression() {
1506 ExprAST *LHS = ParseUnary();
1509 return ParseBinOpRHS(
0, LHS);
1513 /// ::= id '(' id* ')'
1514 /// ::= binary LETTER number? (id, id)
1515 /// ::= unary LETTER (id)
1516 static PrototypeAST *ParsePrototype() {
1519 unsigned Kind =
0; //
0 = identifier,
1 = unary,
2 = binary.
1520 unsigned BinaryPrecedence =
30;
1524 return ErrorP(
"Expected function name in prototype");
1525 case tok_identifier:
1526 FnName = IdentifierStr;
1532 if (!isascii(CurTok))
1533 return ErrorP(
"Expected unary operator");
1535 FnName += (char)CurTok;
1541 if (!isascii(CurTok))
1542 return ErrorP(
"Expected binary operator");
1544 FnName += (char)CurTok;
1548 // Read the precedence if present.
1549 if (CurTok == tok_number) {
1550 if (NumVal
< 1 || NumVal
> 100)
1551 return ErrorP(
"Invalid precedecnce: must be 1..100");
1552 BinaryPrecedence = (unsigned)NumVal;
1559 return ErrorP(
"Expected '(' in prototype");
1561 std::vector
<std::string
> ArgNames;
1562 while (getNextToken() == tok_identifier)
1563 ArgNames.push_back(IdentifierStr);
1565 return ErrorP(
"Expected ')' in prototype");
1568 getNextToken(); // eat ')'.
1570 // Verify right number of names for operator.
1571 if (Kind
&& ArgNames.size() != Kind)
1572 return ErrorP(
"Invalid number of operands for operator");
1574 return new PrototypeAST(FnName, ArgNames, Kind !=
0, BinaryPrecedence);
1577 /// definition ::= 'def' prototype expression
1578 static FunctionAST *ParseDefinition() {
1579 getNextToken(); // eat def.
1580 PrototypeAST *Proto = ParsePrototype();
1581 if (Proto ==
0) return
0;
1583 if (ExprAST *E = ParseExpression())
1584 return new FunctionAST(Proto, E);
1588 /// toplevelexpr ::= expression
1589 static FunctionAST *ParseTopLevelExpr() {
1590 if (ExprAST *E = ParseExpression()) {
1591 // Make an anonymous proto.
1592 PrototypeAST *Proto = new PrototypeAST(
"", std::vector
<std::string
>());
1593 return new FunctionAST(Proto, E);
1598 /// external ::= 'extern' prototype
1599 static PrototypeAST *ParseExtern() {
1600 getNextToken(); // eat extern.
1601 return ParsePrototype();
1604 //===----------------------------------------------------------------------===//
1606 //===----------------------------------------------------------------------===//
1608 static Module *TheModule;
1609 static IRBuilder
<> Builder(getGlobalContext());
1610 static std::map
<std::string, AllocaInst*
> NamedValues;
1611 static FunctionPassManager *TheFPM;
1613 Value *ErrorV(const char *Str) { Error(Str); return
0; }
1615 /// CreateEntryBlockAlloca - Create an alloca instruction in the entry block of
1616 /// the function. This is used for mutable variables etc.
1617 static AllocaInst *CreateEntryBlockAlloca(Function *TheFunction,
1618 const std::string
&VarName) {
1619 IRBuilder
<> TmpB(
&TheFunction-
>getEntryBlock(),
1620 TheFunction-
>getEntryBlock().begin());
1621 return TmpB.CreateAlloca(Type::getDoubleTy(getGlobalContext()),
0,
1625 Value *NumberExprAST::Codegen() {
1626 return ConstantFP::get(getGlobalContext(), APFloat(Val));
1629 Value *VariableExprAST::Codegen() {
1630 // Look this variable up in the function.
1631 Value *V = NamedValues[Name];
1632 if (V ==
0) return ErrorV(
"Unknown variable name");
1635 return Builder.CreateLoad(V, Name.c_str());
1638 Value *UnaryExprAST::Codegen() {
1639 Value *OperandV = Operand-
>Codegen();
1640 if (OperandV ==
0) return
0;
1642 Function *F = TheModule-
>getFunction(std::string(
"unary")+Opcode);
1644 return ErrorV(
"Unknown unary operator");
1646 return Builder.CreateCall(F, OperandV,
"unop");
1649 Value *BinaryExprAST::Codegen() {
1650 // Special case '=' because we don't want to emit the LHS as an expression.
1652 // Assignment requires the LHS to be an identifier.
1653 VariableExprAST *LHSE = dynamic_cast
<VariableExprAST*
>(LHS);
1655 return ErrorV(
"destination of '=' must be a variable");
1657 Value *Val = RHS-
>Codegen();
1658 if (Val ==
0) return
0;
1660 // Look up the name.
1661 Value *Variable = NamedValues[LHSE-
>getName()];
1662 if (Variable ==
0) return ErrorV(
"Unknown variable name");
1664 Builder.CreateStore(Val, Variable);
1668 Value *L = LHS-
>Codegen();
1669 Value *R = RHS-
>Codegen();
1670 if (L ==
0 || R ==
0) return
0;
1673 case '+': return Builder.CreateFAdd(L, R,
"addtmp");
1674 case '-': return Builder.CreateFSub(L, R,
"subtmp");
1675 case '*': return Builder.CreateFMul(L, R,
"multmp");
1677 L = Builder.CreateFCmpULT(L, R,
"cmptmp");
1678 // Convert bool
0/
1 to double
0.0 or
1.0
1679 return Builder.CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()),
1684 // If it wasn't a builtin binary operator, it must be a user defined one. Emit
1686 Function *F = TheModule-
>getFunction(std::string(
"binary")+Op);
1687 assert(F
&& "binary operator not found!");
1689 Value *Ops[] = { L, R };
1690 return Builder.CreateCall(F, Ops, Ops+
2,
"binop");
1693 Value *CallExprAST::Codegen() {
1694 // Look up the name in the global module table.
1695 Function *CalleeF = TheModule-
>getFunction(Callee);
1697 return ErrorV(
"Unknown function referenced");
1699 // If argument mismatch error.
1700 if (CalleeF-
>arg_size() != Args.size())
1701 return ErrorV(
"Incorrect # arguments passed");
1703 std::vector
<Value*
> ArgsV;
1704 for (unsigned i =
0, e = Args.size(); i != e; ++i) {
1705 ArgsV.push_back(Args[i]-
>Codegen());
1706 if (ArgsV.back() ==
0) return
0;
1709 return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(),
"calltmp");
1712 Value *IfExprAST::Codegen() {
1713 Value *CondV = Cond-
>Codegen();
1714 if (CondV ==
0) return
0;
1716 // Convert condition to a bool by comparing equal to
0.0.
1717 CondV = Builder.CreateFCmpONE(CondV,
1718 ConstantFP::get(getGlobalContext(), APFloat(
0.0)),
1721 Function *TheFunction = Builder.GetInsertBlock()-
>getParent();
1723 // Create blocks for the then and else cases. Insert the 'then' block at the
1724 // end of the function.
1725 BasicBlock *ThenBB = BasicBlock::Create(getGlobalContext(),
"then", TheFunction);
1726 BasicBlock *ElseBB = BasicBlock::Create(getGlobalContext(),
"else");
1727 BasicBlock *MergeBB = BasicBlock::Create(getGlobalContext(),
"ifcont");
1729 Builder.CreateCondBr(CondV, ThenBB, ElseBB);
1732 Builder.SetInsertPoint(ThenBB);
1734 Value *ThenV = Then-
>Codegen();
1735 if (ThenV ==
0) return
0;
1737 Builder.CreateBr(MergeBB);
1738 // Codegen of 'Then' can change the current block, update ThenBB for the PHI.
1739 ThenBB = Builder.GetInsertBlock();
1742 TheFunction-
>getBasicBlockList().push_back(ElseBB);
1743 Builder.SetInsertPoint(ElseBB);
1745 Value *ElseV = Else-
>Codegen();
1746 if (ElseV ==
0) return
0;
1748 Builder.CreateBr(MergeBB);
1749 // Codegen of 'Else' can change the current block, update ElseBB for the PHI.
1750 ElseBB = Builder.GetInsertBlock();
1752 // Emit merge block.
1753 TheFunction-
>getBasicBlockList().push_back(MergeBB);
1754 Builder.SetInsertPoint(MergeBB);
1755 PHINode *PN = Builder.CreatePHI(Type::getDoubleTy(getGlobalContext()),
2,
1758 PN-
>addIncoming(ThenV, ThenBB);
1759 PN-
>addIncoming(ElseV, ElseBB);
1763 Value *ForExprAST::Codegen() {
1765 // var = alloca double
1767 // start = startexpr
1768 // store start -
> var
1776 // endcond = endexpr
1778 // curvar = load var
1779 // nextvar = curvar + step
1780 // store nextvar -
> var
1781 // br endcond, loop, endloop
1784 Function *TheFunction = Builder.GetInsertBlock()-
>getParent();
1786 // Create an alloca for the variable in the entry block.
1787 AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, VarName);
1789 // Emit the start code first, without 'variable' in scope.
1790 Value *StartVal = Start-
>Codegen();
1791 if (StartVal ==
0) return
0;
1793 // Store the value into the alloca.
1794 Builder.CreateStore(StartVal, Alloca);
1796 // Make the new basic block for the loop header, inserting after current
1798 BasicBlock *LoopBB = BasicBlock::Create(getGlobalContext(),
"loop", TheFunction);
1800 // Insert an explicit fall through from the current block to the LoopBB.
1801 Builder.CreateBr(LoopBB);
1803 // Start insertion in LoopBB.
1804 Builder.SetInsertPoint(LoopBB);
1806 // Within the loop, the variable is defined equal to the PHI node. If it
1807 // shadows an existing variable, we have to restore it, so save it now.
1808 AllocaInst *OldVal = NamedValues[VarName];
1809 NamedValues[VarName] = Alloca;
1811 // Emit the body of the loop. This, like any other expr, can change the
1812 // current BB. Note that we ignore the value computed by the body, but don't
1814 if (Body-
>Codegen() ==
0)
1817 // Emit the step value.
1820 StepVal = Step-
>Codegen();
1821 if (StepVal ==
0) return
0;
1823 // If not specified, use
1.0.
1824 StepVal = ConstantFP::get(getGlobalContext(), APFloat(
1.0));
1827 // Compute the end condition.
1828 Value *EndCond = End-
>Codegen();
1829 if (EndCond ==
0) return EndCond;
1831 // Reload, increment, and restore the alloca. This handles the case where
1832 // the body of the loop mutates the variable.
1833 Value *CurVar = Builder.CreateLoad(Alloca, VarName.c_str());
1834 Value *NextVar = Builder.CreateFAdd(CurVar, StepVal,
"nextvar");
1835 Builder.CreateStore(NextVar, Alloca);
1837 // Convert condition to a bool by comparing equal to
0.0.
1838 EndCond = Builder.CreateFCmpONE(EndCond,
1839 ConstantFP::get(getGlobalContext(), APFloat(
0.0)),
1842 // Create the
"after loop" block and insert it.
1843 BasicBlock *AfterBB = BasicBlock::Create(getGlobalContext(),
"afterloop", TheFunction);
1845 // Insert the conditional branch into the end of LoopEndBB.
1846 Builder.CreateCondBr(EndCond, LoopBB, AfterBB);
1848 // Any new code will be inserted in AfterBB.
1849 Builder.SetInsertPoint(AfterBB);
1851 // Restore the unshadowed variable.
1853 NamedValues[VarName] = OldVal;
1855 NamedValues.erase(VarName);
1858 // for expr always returns
0.0.
1859 return Constant::getNullValue(Type::getDoubleTy(getGlobalContext()));
1862 Value *VarExprAST::Codegen() {
1863 std::vector
<AllocaInst *
> OldBindings;
1865 Function *TheFunction = Builder.GetInsertBlock()-
>getParent();
1867 // Register all variables and emit their initializer.
1868 for (unsigned i =
0, e = VarNames.size(); i != e; ++i) {
1869 const std::string
&VarName = VarNames[i].first;
1870 ExprAST *Init = VarNames[i].second;
1872 // Emit the initializer before adding the variable to scope, this prevents
1873 // the initializer from referencing the variable itself, and permits stuff
1876 // var a = a in ... # refers to outer 'a'.
1879 InitVal = Init-
>Codegen();
1880 if (InitVal ==
0) return
0;
1881 } else { // If not specified, use
0.0.
1882 InitVal = ConstantFP::get(getGlobalContext(), APFloat(
0.0));
1885 AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, VarName);
1886 Builder.CreateStore(InitVal, Alloca);
1888 // Remember the old variable binding so that we can restore the binding when
1890 OldBindings.push_back(NamedValues[VarName]);
1892 // Remember this binding.
1893 NamedValues[VarName] = Alloca;
1896 // Codegen the body, now that all vars are in scope.
1897 Value *BodyVal = Body-
>Codegen();
1898 if (BodyVal ==
0) return
0;
1900 // Pop all our variables from scope.
1901 for (unsigned i =
0, e = VarNames.size(); i != e; ++i)
1902 NamedValues[VarNames[i].first] = OldBindings[i];
1904 // Return the body computation.
1908 Function *PrototypeAST::Codegen() {
1909 // Make the function type: double(double,double) etc.
1910 std::vector
<const Type*
> Doubles(Args.size(),
1911 Type::getDoubleTy(getGlobalContext()));
1912 FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
1915 Function *F = Function::Create(FT, Function::ExternalLinkage, Name, TheModule);
1917 // If F conflicted, there was already something named 'Name'. If it has a
1918 // body, don't allow redefinition or reextern.
1919 if (F-
>getName() != Name) {
1920 // Delete the one we just made and get the existing one.
1921 F-
>eraseFromParent();
1922 F = TheModule-
>getFunction(Name);
1924 // If F already has a body, reject this.
1925 if (!F-
>empty()) {
1926 ErrorF(
"redefinition of function");
1930 // If F took a different number of args, reject.
1931 if (F-
>arg_size() != Args.size()) {
1932 ErrorF(
"redefinition of function with different # args");
1937 // Set names for all arguments.
1939 for (Function::arg_iterator AI = F-
>arg_begin(); Idx != Args.size();
1941 AI-
>setName(Args[Idx]);
1946 /// CreateArgumentAllocas - Create an alloca for each argument and register the
1947 /// argument in the symbol table so that references to it will succeed.
1948 void PrototypeAST::CreateArgumentAllocas(Function *F) {
1949 Function::arg_iterator AI = F-
>arg_begin();
1950 for (unsigned Idx =
0, e = Args.size(); Idx != e; ++Idx, ++AI) {
1951 // Create an alloca for this variable.
1952 AllocaInst *Alloca = CreateEntryBlockAlloca(F, Args[Idx]);
1954 // Store the initial value into the alloca.
1955 Builder.CreateStore(AI, Alloca);
1957 // Add arguments to variable symbol table.
1958 NamedValues[Args[Idx]] = Alloca;
1962 Function *FunctionAST::Codegen() {
1963 NamedValues.clear();
1965 Function *TheFunction = Proto-
>Codegen();
1966 if (TheFunction ==
0)
1969 // If this is an operator, install it.
1970 if (Proto-
>isBinaryOp())
1971 BinopPrecedence[Proto-
>getOperatorName()] = Proto-
>getBinaryPrecedence();
1973 // Create a new basic block to start insertion into.
1974 BasicBlock *BB = BasicBlock::Create(getGlobalContext(),
"entry", TheFunction);
1975 Builder.SetInsertPoint(BB);
1977 // Add all arguments to the symbol table and create their allocas.
1978 Proto-
>CreateArgumentAllocas(TheFunction);
1980 if (Value *RetVal = Body-
>Codegen()) {
1981 // Finish off the function.
1982 Builder.CreateRet(RetVal);
1984 // Validate the generated code, checking for consistency.
1985 verifyFunction(*TheFunction);
1987 // Optimize the function.
1988 TheFPM-
>run(*TheFunction);
1993 // Error reading body, remove function.
1994 TheFunction-
>eraseFromParent();
1996 if (Proto-
>isBinaryOp())
1997 BinopPrecedence.erase(Proto-
>getOperatorName());
2001 //===----------------------------------------------------------------------===//
2002 // Top-Level parsing and JIT Driver
2003 //===----------------------------------------------------------------------===//
2005 static ExecutionEngine *TheExecutionEngine;
2007 static void HandleDefinition() {
2008 if (FunctionAST *F = ParseDefinition()) {
2009 if (Function *LF = F-
>Codegen()) {
2010 fprintf(stderr,
"Read function definition:");
2014 // Skip token for error recovery.
2019 static void HandleExtern() {
2020 if (PrototypeAST *P = ParseExtern()) {
2021 if (Function *F = P-
>Codegen()) {
2022 fprintf(stderr,
"Read extern: ");
2026 // Skip token for error recovery.
2031 static void HandleTopLevelExpression() {
2032 // Evaluate a top-level expression into an anonymous function.
2033 if (FunctionAST *F = ParseTopLevelExpr()) {
2034 if (Function *LF = F-
>Codegen()) {
2035 // JIT the function, returning a function pointer.
2036 void *FPtr = TheExecutionEngine-
>getPointerToFunction(LF);
2038 // Cast it to the right type (takes no arguments, returns a double) so we
2039 // can call it as a native function.
2040 double (*FP)() = (double (*)())(intptr_t)FPtr;
2041 fprintf(stderr,
"Evaluated to %f\n", FP());
2044 // Skip token for error recovery.
2049 /// top ::= definition | external | expression | ';'
2050 static void MainLoop() {
2052 fprintf(stderr,
"ready> ");
2054 case tok_eof: return;
2055 case ';': getNextToken(); break; // ignore top-level semicolons.
2056 case tok_def: HandleDefinition(); break;
2057 case tok_extern: HandleExtern(); break;
2058 default: HandleTopLevelExpression(); break;
2063 //===----------------------------------------------------------------------===//
2064 //
"Library" functions that can be
"extern'd" from user code.
2065 //===----------------------------------------------------------------------===//
2067 /// putchard - putchar that takes a double and returns
0.
2069 double putchard(double X) {
2074 /// printd - printf that takes a double prints it as
"%f\n", returning
0.
2076 double printd(double X) {
2081 //===----------------------------------------------------------------------===//
2082 // Main driver code.
2083 //===----------------------------------------------------------------------===//
2086 InitializeNativeTarget();
2087 LLVMContext
&Context = getGlobalContext();
2089 // Install standard binary operators.
2090 //
1 is lowest precedence.
2091 BinopPrecedence['='] =
2;
2092 BinopPrecedence['
<'] =
10;
2093 BinopPrecedence['+'] =
20;
2094 BinopPrecedence['-'] =
20;
2095 BinopPrecedence['*'] =
40; // highest.
2097 // Prime the first token.
2098 fprintf(stderr,
"ready> ");
2101 // Make the module, which holds all the code.
2102 TheModule = new Module(
"my cool jit", Context);
2104 // Create the JIT. This takes ownership of the module.
2106 TheExecutionEngine = EngineBuilder(TheModule).setErrorStr(
&ErrStr).create();
2107 if (!TheExecutionEngine) {
2108 fprintf(stderr,
"Could not create ExecutionEngine: %s\n", ErrStr.c_str());
2112 FunctionPassManager OurFPM(TheModule);
2114 // Set up the optimizer pipeline. Start with registering info about how the
2115 // target lays out data structures.
2116 OurFPM.add(new TargetData(*TheExecutionEngine-
>getTargetData()));
2117 // Provide basic AliasAnalysis support for GVN.
2118 OurFPM.add(createBasicAliasAnalysisPass());
2119 // Promote allocas to registers.
2120 OurFPM.add(createPromoteMemoryToRegisterPass());
2121 // Do simple
"peephole" optimizations and bit-twiddling optzns.
2122 OurFPM.add(createInstructionCombiningPass());
2123 // Reassociate expressions.
2124 OurFPM.add(createReassociatePass());
2125 // Eliminate Common SubExpressions.
2126 OurFPM.add(createGVNPass());
2127 // Simplify the control flow graph (deleting unreachable blocks, etc).
2128 OurFPM.add(createCFGSimplificationPass());
2130 OurFPM.doInitialization();
2132 // Set the global so the code gen can use this.
2133 TheFPM =
&OurFPM;
2135 // Run the main
"interpreter loop" now.
2140 // Print out all of the generated code.
2141 TheModule-
>dump();
2148 <a href=
"LangImpl8.html">Next: Conclusion and other useful LLVM tidbits
</a>
2151 <!-- *********************************************************************** -->
2154 <a href=
"http://jigsaw.w3.org/css-validator/check/referer"><img
2155 src=
"http://jigsaw.w3.org/css-validator/images/vcss" alt=
"Valid CSS!"></a>
2156 <a href=
"http://validator.w3.org/check/referer"><img
2157 src=
"http://www.w3.org/Icons/valid-html401" alt=
"Valid HTML 4.01!"></a>
2159 <a href=
"mailto:sabre@nondot.org">Chris Lattner
</a><br>
2160 <a href=
"http://llvm.org/">The LLVM Compiler Infrastructure
</a><br>
2161 Last modified: $Date$