<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                      "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
  <title>Kaleidoscope: Extending the Language: Control Flow</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="author" content="Chris Lattner">
  <meta name="author" content="Erick Tryzelaar">
  <link rel="stylesheet" href="../llvm.css" type="text/css">
</head>

<body>

<div class="doc_title">Kaleidoscope: Extending the Language: Control Flow</div>

<ul>
<li><a href="index.html">Up to Tutorial Index</a></li>
<li>Chapter 5
  <ol>
    <li><a href="#intro">Chapter 5 Introduction</a></li>
    <li><a href="#ifthen">If/Then/Else</a>
    <ol>
      <li><a href="#iflexer">Lexer Extensions</a></li>
      <li><a href="#ifast">AST Extensions</a></li>
      <li><a href="#ifparser">Parser Extensions</a></li>
      <li><a href="#ifir">LLVM IR</a></li>
      <li><a href="#ifcodegen">Code Generation</a></li>
    </ol>
    </li>
    <li><a href="#for">'for' Loop Expression</a>
    <ol>
      <li><a href="#forlexer">Lexer Extensions</a></li>
      <li><a href="#forast">AST Extensions</a></li>
      <li><a href="#forparser">Parser Extensions</a></li>
      <li><a href="#forir">LLVM IR</a></li>
      <li><a href="#forcodegen">Code Generation</a></li>
    </ol>
    </li>
    <li><a href="#code">Full Code Listing</a></li>
  </ol>
</li>
<li><a href="OCamlLangImpl6.html">Chapter 6</a>: Extending the Language:
User-defined Operators</li>
</ul>

<div class="doc_author">
	<p>
		Written by <a href="mailto:sabre@nondot.org">Chris Lattner</a>
		and <a href="mailto:idadesub@users.sourceforge.net">Erick Tryzelaar</a>
	</p>
</div>

<!-- *********************************************************************** -->
<div class="doc_section"><a name="intro">Chapter 5 Introduction</a></div>
<!-- *********************************************************************** -->

<div class="doc_text">

<p>Welcome to Chapter 5 of the "<a href="index.html">Implementing a language
with LLVM</a>" tutorial.  Parts 1-4 described the implementation of the simple
Kaleidoscope language and included support for generating LLVM IR, followed by
optimizations and a JIT compiler.  Unfortunately, as presented, Kaleidoscope is
mostly useless: it has no control flow other than call and return.  This means
that you can't have conditional branches in the code, significantly limiting its
power.  In this episode of "build that compiler", we'll extend Kaleidoscope to
have an if/then/else expression plus a simple 'for' loop.</p>

</div>

<!-- *********************************************************************** -->
<div class="doc_section"><a name="ifthen">If/Then/Else</a></div>
<!-- *********************************************************************** -->

<div class="doc_text">

<p>
Extending Kaleidoscope to support if/then/else is quite straightforward.  It
basically requires adding lexer support for this "new" concept to the lexer,
parser, AST, and LLVM code emitter.  This example is nice, because it shows how
easy it is to "grow" a language over time, incrementally extending it as new
ideas are discovered.</p>

<p>Before we get going on "how" we add this extension, lets talk about "what" we
want.  The basic idea is that we want to be able to write this sort of thing:
</p>

<div class="doc_code">
<pre>
def fib(x)
  if x &lt; 3 then
    1
  else
    fib(x-1)+fib(x-2);
</pre>
</div>

<p>In Kaleidoscope, every construct is an expression: there are no statements.
As such, the if/then/else expression needs to return a value like any other.
Since we're using a mostly functional form, we'll have it evaluate its
conditional, then return the 'then' or 'else' value based on how the condition
was resolved.  This is very similar to the C "?:" expression.</p>

<p>The semantics of the if/then/else expression is that it evaluates the
condition to a boolean equality value: 0.0 is considered to be false and
everything else is considered to be true.
If the condition is true, the first subexpression is evaluated and returned, if
the condition is false, the second subexpression is evaluated and returned.
Since Kaleidoscope allows side-effects, this behavior is important to nail down.
</p>

<p>Now that we know what we "want", lets break this down into its constituent
pieces.</p>

</div>

<!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="iflexer">Lexer Extensions for
If/Then/Else</a></div>
<!-- ======================================================================= -->


<div class="doc_text">

<p>The lexer extensions are straightforward.  First we add new variants
for the relevant tokens:</p>

<div class="doc_code">
<pre>
  (* control *)
  | If | Then | Else | For | In
</pre>
</div>

<p>Once we have that, we recognize the new keywords in the lexer. This is pretty simple
stuff:</p>

<div class="doc_code">
<pre>
      ...
      match Buffer.contents buffer with
      | "def" -&gt; [&lt; 'Token.Def; stream &gt;]
      | "extern" -&gt; [&lt; 'Token.Extern; stream &gt;]
      | "if" -&gt; [&lt; 'Token.If; stream &gt;]
      | "then" -&gt; [&lt; 'Token.Then; stream &gt;]
      | "else" -&gt; [&lt; 'Token.Else; stream &gt;]
      | "for" -&gt; [&lt; 'Token.For; stream &gt;]
      | "in" -&gt; [&lt; 'Token.In; stream &gt;]
      | id -&gt; [&lt; 'Token.Ident id; stream &gt;]
</pre>
</div>

</div>

<!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="ifast">AST Extensions for
 If/Then/Else</a></div>
<!-- ======================================================================= -->

<div class="doc_text">

<p>To represent the new expression we add a new AST variant for it:</p>

<div class="doc_code">
<pre>
type expr =
  ...
  (* variant for if/then/else. *)
  | If of expr * expr * expr
</pre>
</div>

<p>The AST variant just has pointers to the various subexpressions.</p>

</div>

<!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="ifparser">Parser Extensions for
If/Then/Else</a></div>
<!-- ======================================================================= -->

<div class="doc_text">

<p>Now that we have the relevant tokens coming from the lexer and we have the
AST node to build, our parsing logic is relatively straightforward.  First we
define a new parsing function:</p>

<div class="doc_code">
<pre>
let rec parse_primary = parser
  ...
  (* ifexpr ::= 'if' expr 'then' expr 'else' expr *)
  | [&lt; 'Token.If; c=parse_expr;
       'Token.Then ?? "expected 'then'"; t=parse_expr;
       'Token.Else ?? "expected 'else'"; e=parse_expr &gt;] -&gt;
      Ast.If (c, t, e)
</pre>
</div>

<p>Next we hook it up as a primary expression:</p>

<div class="doc_code">
<pre>
let rec parse_primary = parser
  ...
  (* ifexpr ::= 'if' expr 'then' expr 'else' expr *)
  | [&lt; 'Token.If; c=parse_expr;
       'Token.Then ?? "expected 'then'"; t=parse_expr;
       'Token.Else ?? "expected 'else'"; e=parse_expr &gt;] -&gt;
      Ast.If (c, t, e)
</pre>
</div>

</div>

<!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="ifir">LLVM IR for If/Then/Else</a></div>
<!-- ======================================================================= -->

<div class="doc_text">

<p>Now that we have it parsing and building the AST, the final piece is adding
LLVM code generation support.  This is the most interesting part of the
if/then/else example, because this is where it starts to introduce new concepts.
All of the code above has been thoroughly described in previous chapters.
</p>

<p>To motivate the code we want to produce, lets take a look at a simple
example.  Consider:</p>

<div class="doc_code">
<pre>
extern foo();
extern bar();
def baz(x) if x then foo() else bar();
</pre>
</div>

<p>If you disable optimizations, the code you'll (soon) get from Kaleidoscope
looks like this:</p>

<div class="doc_code">
<pre>
declare double @foo()

declare double @bar()

define double @baz(double %x) {
entry:
  %ifcond = fcmp one double %x, 0.000000e+00
  br i1 %ifcond, label %then, label %else

then:    ; preds = %entry
  %calltmp = call double @foo()
  br label %ifcont

else:    ; preds = %entry
  %calltmp1 = call double @bar()
  br label %ifcont

ifcont:    ; preds = %else, %then
  %iftmp = phi double [ %calltmp, %then ], [ %calltmp1, %else ]
  ret double %iftmp
}
</pre>
</div>

<p>To visualize the control flow graph, you can use a nifty feature of the LLVM
'<a href="http://llvm.org/cmds/opt.html">opt</a>' tool.  If you put this LLVM IR
into "t.ll" and run "<tt>llvm-as &lt; t.ll | opt -analyze -view-cfg</tt>", <a
href="../ProgrammersManual.html#ViewGraph">a window will pop up</a> and you'll
see this graph:</p>

<div style="text-align: center"><img src="LangImpl5-cfg.png" alt="Example CFG" width="423"
height="315"></div>

<p>Another way to get this is to call "<tt>Llvm_analysis.view_function_cfg
f</tt>" or "<tt>Llvm_analysis.view_function_cfg_only f</tt>" (where <tt>f</tt>
is a "<tt>Function</tt>") either by inserting actual calls into the code and
recompiling or by calling these in the debugger.  LLVM has many nice features
for visualizing various graphs.</p>

<p>Getting back to the generated code, it is fairly simple: the entry block
evaluates the conditional expression ("x" in our case here) and compares the
result to 0.0 with the "<tt><a href="../LangRef.html#i_fcmp">fcmp</a> one</tt>"
instruction ('one' is "Ordered and Not Equal").  Based on the result of this
expression, the code jumps to either the "then" or "else" blocks, which contain
the expressions for the true/false cases.</p>

<p>Once the then/else blocks are finished executing, they both branch back to the
'ifcont' block to execute the code that happens after the if/then/else.  In this
case the only thing left to do is to return to the caller of the function.  The
question then becomes: how does the code know which expression to return?</p>

<p>The answer to this question involves an important SSA operation: the
<a href="http://en.wikipedia.org/wiki/Static_single_assignment_form">Phi
operation</a>.  If you're not familiar with SSA, <a
href="http://en.wikipedia.org/wiki/Static_single_assignment_form">the wikipedia
article</a> is a good introduction and there are various other introductions to
it available on your favorite search engine.  The short version is that
"execution" of the Phi operation requires "remembering" which block control came
from.  The Phi operation takes on the value corresponding to the input control
block.  In this case, if control comes in from the "then" block, it gets the
value of "calltmp".  If control comes from the "else" block, it gets the value
of "calltmp1".</p>

<p>At this point, you are probably starting to think "Oh no! This means my
simple and elegant front-end will have to start generating SSA form in order to
use LLVM!".  Fortunately, this is not the case, and we strongly advise
<em>not</em> implementing an SSA construction algorithm in your front-end
unless there is an amazingly good reason to do so.  In practice, there are two
sorts of values that float around in code written for your average imperative
programming language that might need Phi nodes:</p>

<ol>
<li>Code that involves user variables: <tt>x = 1; x = x + 1; </tt></li>
<li>Values that are implicit in the structure of your AST, such as the Phi node
in this case.</li>
</ol>

<p>In <a href="OCamlLangImpl7.html">Chapter 7</a> of this tutorial ("mutable
variables"), we'll talk about #1
in depth.  For now, just believe me that you don't need SSA construction to
handle this case.  For #2, you have the choice of using the techniques that we will
describe for #1, or you can insert Phi nodes directly, if convenient.  In this
case, it is really really easy to generate the Phi node, so we choose to do it
directly.</p>

<p>Okay, enough of the motivation and overview, lets generate code!</p>

</div>

<!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="ifcodegen">Code Generation for
If/Then/Else</a></div>
<!-- ======================================================================= -->

<div class="doc_text">

<p>In order to generate code for this, we implement the <tt>Codegen</tt> method
for <tt>IfExprAST</tt>:</p>

<div class="doc_code">
<pre>
let rec codegen_expr = function
  ...
  | Ast.If (cond, then_, else_) -&gt;
      let cond = codegen_expr cond in

      (* Convert condition to a bool by comparing equal to 0.0 *)
      let zero = const_float double_type 0.0 in
      let cond_val = build_fcmp Fcmp.One cond zero "ifcond" builder in
</pre>
</div>

<p>This code is straightforward and similar to what we saw before.  We emit the
expression for the condition, then compare that value to zero to get a truth
value as a 1-bit (bool) value.</p>

<div class="doc_code">
<pre>
      (* Grab the first block so that we might later add the conditional branch
       * to it at the end of the function. *)
      let start_bb = insertion_block builder in
      let the_function = block_parent start_bb in

      let then_bb = append_block context "then" the_function in
      position_at_end then_bb builder;
</pre>
</div>

<p>
As opposed to the <a href="LangImpl5.html">C++ tutorial</a>, we have to build
our basic blocks bottom up since we can't have dangling BasicBlocks.  We start
off by saving a pointer to the first block (which might not be the entry
block), which we'll need to build a conditional branch later.  We do this by
asking the <tt>builder</tt> for the current BasicBlock.  The fourth line
gets the current Function object that is being built.  It gets this by the
<tt>start_bb</tt> for its "parent" (the function it is currently embedded
into).</p>

<p>Once it has that, it creates one block.  It is automatically appended into
the function's list of blocks.</p>

<div class="doc_code">
<pre>
      (* Emit 'then' value. *)
      position_at_end then_bb builder;
      let then_val = codegen_expr then_ in

      (* Codegen of 'then' can change the current block, update then_bb for the
       * phi. We create a new name because one is used for the phi node, and the
       * other is used for the conditional branch. *)
      let new_then_bb = insertion_block builder in
</pre>
</div>

<p>We move the builder to start inserting into the "then" block.  Strictly
speaking, this call moves the insertion point to be at the end of the specified
block.  However, since the "then" block is empty, it also starts out by
inserting at the beginning of the block.  :)</p>

<p>Once the insertion point is set, we recursively codegen the "then" expression
from the AST.</p>

<p>The final line here is quite subtle, but is very important.  The basic issue
is that when we create the Phi node in the merge block, we need to set up the
block/value pairs that indicate how the Phi will work.  Importantly, the Phi
node expects to have an entry for each predecessor of the block in the CFG.  Why
then, are we getting the current block when we just set it to ThenBB 5 lines
above?  The problem is that the "Then" expression may actually itself change the
block that the Builder is emitting into if, for example, it contains a nested
"if/then/else" expression.  Because calling Codegen recursively could
arbitrarily change the notion of the current block, we are required to get an
up-to-date value for code that will set up the Phi node.</p>

<div class="doc_code">
<pre>
      (* Emit 'else' value. *)
      let else_bb = append_block context "else" the_function in
      position_at_end else_bb builder;
      let else_val = codegen_expr else_ in

      (* Codegen of 'else' can change the current block, update else_bb for the
       * phi. *)
      let new_else_bb = insertion_block builder in
</pre>
</div>

<p>Code generation for the 'else' block is basically identical to codegen for
the 'then' block.</p>

<div class="doc_code">
<pre>
      (* Emit merge block. *)
      let merge_bb = append_block context "ifcont" the_function in
      position_at_end merge_bb builder;
      let incoming = [(then_val, new_then_bb); (else_val, new_else_bb)] in
      let phi = build_phi incoming "iftmp" builder in
</pre>
</div>

<p>The first two lines here are now familiar: the first adds the "merge" block
to the Function object.  The second block changes the insertion point so that
newly created code will go into the "merge" block.  Once that is done, we need
to create the PHI node and set up the block/value pairs for the PHI.</p>

<div class="doc_code">
<pre>
      (* Return to the start block to add the conditional branch. *)
      position_at_end start_bb builder;
      ignore (build_cond_br cond_val then_bb else_bb builder);
</pre>
</div>

<p>Once the blocks are created, we can emit the conditional branch that chooses
between them.  Note that creating new blocks does not implicitly affect the
IRBuilder, so it is still inserting into the block that the condition
went into.  This is why we needed to save the "start" block.</p>

<div class="doc_code">
<pre>
      (* Set a unconditional branch at the end of the 'then' block and the
       * 'else' block to the 'merge' block. *)
      position_at_end new_then_bb builder; ignore (build_br merge_bb builder);
      position_at_end new_else_bb builder; ignore (build_br merge_bb builder);

      (* Finally, set the builder to the end of the merge block. *)
      position_at_end merge_bb builder;

      phi
</pre>
</div>

<p>To finish off the blocks, we create an unconditional branch
to the merge block.  One interesting (and very important) aspect of the LLVM IR
is that it <a href="../LangRef.html#functionstructure">requires all basic blocks
to be "terminated"</a> with a <a href="../LangRef.html#terminators">control flow
instruction</a> such as return or branch.  This means that all control flow,
<em>including fall throughs</em> must be made explicit in the LLVM IR.  If you
violate this rule, the verifier will emit an error.

<p>Finally, the CodeGen function returns the phi node as the value computed by
the if/then/else expression.  In our example above, this returned value will
feed into the code for the top-level function, which will create the return
instruction.</p>

<p>Overall, we now have the ability to execute conditional code in
Kaleidoscope.  With this extension, Kaleidoscope is a fairly complete language
that can calculate a wide variety of numeric functions.  Next up we'll add
another useful expression that is familiar from non-functional languages...</p>

</div>

<!-- *********************************************************************** -->
<div class="doc_section"><a name="for">'for' Loop Expression</a></div>
<!-- *********************************************************************** -->

<div class="doc_text">

<p>Now that we know how to add basic control flow constructs to the language,
we have the tools to add more powerful things.  Lets add something more
aggressive, a 'for' expression:</p>

<div class="doc_code">
<pre>
 extern putchard(char);
 def printstar(n)
   for i = 1, i &lt; n, 1.0 in
     putchard(42);  # ascii 42 = '*'

 # print 100 '*' characters
 printstar(100);
</pre>
</div>

<p>This expression defines a new variable ("i" in this case) which iterates from
a starting value, while the condition ("i &lt; n" in this case) is true,
incrementing by an optional step value ("1.0" in this case).  If the step value
is omitted, it defaults to 1.0.  While the loop is true, it executes its
body expression.  Because we don't have anything better to return, we'll just
define the loop as always returning 0.0.  In the future when we have mutable
variables, it will get more useful.</p>

<p>As before, lets talk about the changes that we need to Kaleidoscope to
support this.</p>

</div>

<!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="forlexer">Lexer Extensions for
the 'for' Loop</a></div>
<!-- ======================================================================= -->

<div class="doc_text">

<p>The lexer extensions are the same sort of thing as for if/then/else:</p>

<div class="doc_code">
<pre>
  ... in Token.token ...
  (* control *)
  | If | Then | Else
  <b>| For | In</b>

  ... in Lexer.lex_ident...
      match Buffer.contents buffer with
      | "def" -&gt; [&lt; 'Token.Def; stream &gt;]
      | "extern" -&gt; [&lt; 'Token.Extern; stream &gt;]
      | "if" -&gt; [&lt; 'Token.If; stream &gt;]
      | "then" -&gt; [&lt; 'Token.Then; stream &gt;]
      | "else" -&gt; [&lt; 'Token.Else; stream &gt;]
      <b>| "for" -&gt; [&lt; 'Token.For; stream &gt;]
      | "in" -&gt; [&lt; 'Token.In; stream &gt;]</b>
      | id -&gt; [&lt; 'Token.Ident id; stream &gt;]
</pre>
</div>

</div>

<!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="forast">AST Extensions for
the 'for' Loop</a></div>
<!-- ======================================================================= -->

<div class="doc_text">

<p>The AST variant is just as simple.  It basically boils down to capturing
the variable name and the constituent expressions in the node.</p>

<div class="doc_code">
<pre>
type expr =
  ...
  (* variant for for/in. *)
  | For of string * expr * expr * expr option * expr
</pre>
</div>

</div>

<!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="forparser">Parser Extensions for
the 'for' Loop</a></div>
<!-- ======================================================================= -->

<div class="doc_text">

<p>The parser code is also fairly standard.  The only interesting thing here is
handling of the optional step value.  The parser code handles it by checking to
see if the second comma is present.  If not, it sets the step value to null in
the AST node:</p>

<div class="doc_code">
<pre>
let rec parse_primary = parser
  ...
  (* forexpr
        ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression *)
  | [&lt; 'Token.For;
       'Token.Ident id ?? "expected identifier after for";
       'Token.Kwd '=' ?? "expected '=' after for";
       stream &gt;] -&gt;
      begin parser
        | [&lt;
             start=parse_expr;
             'Token.Kwd ',' ?? "expected ',' after for";
             end_=parse_expr;
             stream &gt;] -&gt;
            let step =
              begin parser
              | [&lt; 'Token.Kwd ','; step=parse_expr &gt;] -&gt; Some step
              | [&lt; &gt;] -&gt; None
              end stream
            in
            begin parser
            | [&lt; 'Token.In; body=parse_expr &gt;] -&gt;
                Ast.For (id, start, end_, step, body)
            | [&lt; &gt;] -&gt;
                raise (Stream.Error "expected 'in' after for")
            end stream
        | [&lt; &gt;] -&gt;
            raise (Stream.Error "expected '=' after for")
      end stream
</pre>
</div>

</div>

<!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="forir">LLVM IR for
the 'for' Loop</a></div>
<!-- ======================================================================= -->

<div class="doc_text">

<p>Now we get to the good part: the LLVM IR we want to generate for this thing.
With the simple example above, we get this LLVM IR (note that this dump is
generated with optimizations disabled for clarity):
</p>

<div class="doc_code">
<pre>
declare double @putchard(double)

define double @printstar(double %n) {
entry:
        ; initial value = 1.0 (inlined into phi)
  br label %loop

loop:    ; preds = %loop, %entry
  %i = phi double [ 1.000000e+00, %entry ], [ %nextvar, %loop ]
        ; body
  %calltmp = call double @putchard(double 4.200000e+01)
        ; increment
  %nextvar = fadd double %i, 1.000000e+00

        ; termination test
  %cmptmp = fcmp ult double %i, %n
  %booltmp = uitofp i1 %cmptmp to double
  %loopcond = fcmp one double %booltmp, 0.000000e+00
  br i1 %loopcond, label %loop, label %afterloop

afterloop:    ; preds = %loop
        ; loop always returns 0.0
  ret double 0.000000e+00
}
</pre>
</div>

<p>This loop contains all the same constructs we saw before: a phi node, several
expressions, and some basic blocks.  Lets see how this fits together.</p>

</div>

<!-- ======================================================================= -->
<div class="doc_subsubsection"><a name="forcodegen">Code Generation for
the 'for' Loop</a></div>
<!-- ======================================================================= -->

<div class="doc_text">

<p>The first part of Codegen is very simple: we just output the start expression
for the loop value:</p>

<div class="doc_code">
<pre>
let rec codegen_expr = function
  ...
  | Ast.For (var_name, start, end_, step, body) -&gt;
      (* Emit the start code first, without 'variable' in scope. *)
      let start_val = codegen_expr start in
</pre>
</div>

<p>With this out of the way, the next step is to set up the LLVM basic block
for the start of the loop body.  In the case above, the whole loop body is one
block, but remember that the body code itself could consist of multiple blocks
(e.g. if it contains an if/then/else or a for/in expression).</p>

<div class="doc_code">
<pre>
      (* Make the new basic block for the loop header, inserting after current
       * block. *)
      let preheader_bb = insertion_block builder in
      let the_function = block_parent preheader_bb in
      let loop_bb = append_block context "loop" the_function in

      (* Insert an explicit fall through from the current block to the
       * loop_bb. *)
      ignore (build_br loop_bb builder);
</pre>
</div>

<p>This code is similar to what we saw for if/then/else.  Because we will need
it to create the Phi node, we remember the block that falls through into the
loop.  Once we have that, we create the actual block that starts the loop and
create an unconditional branch for the fall-through between the two blocks.</p>

<div class="doc_code">
<pre>
      (* Start insertion in loop_bb. *)
      position_at_end loop_bb builder;

      (* Start the PHI node with an entry for start. *)
      let variable = build_phi [(start_val, preheader_bb)] var_name builder in
</pre>
</div>

<p>Now that the "preheader" for the loop is set up, we switch to emitting code
for the loop body.  To begin with, we move the insertion point and create the
PHI node for the loop induction variable.  Since we already know the incoming
value for the starting value, we add it to the Phi node.  Note that the Phi will
eventually get a second value for the backedge, but we can't set it up yet
(because it doesn't exist!).</p>

<div class="doc_code">
<pre>
      (* Within the loop, the variable is defined equal to the PHI node. If it
       * shadows an existing variable, we have to restore it, so save it
       * now. *)
      let old_val =
        try Some (Hashtbl.find named_values var_name) with Not_found -&gt; None
      in
      Hashtbl.add named_values var_name variable;

      (* Emit the body of the loop.  This, like any other expr, can change the
       * current BB.  Note that we ignore the value computed by the body, but
       * don't allow an error *)
      ignore (codegen_expr body);
</pre>
</div>

<p>Now the code starts to get more interesting.  Our 'for' loop introduces a new
variable to the symbol table.  This means that our symbol table can now contain
either function arguments or loop variables.  To handle this, before we codegen
the body of the loop, we add the loop variable as the current value for its
name.  Note that it is possible that there is a variable of the same name in the
outer scope.  It would be easy to make this an error (emit an error and return
null if there is already an entry for VarName) but we choose to allow shadowing
of variables.  In order to handle this correctly, we remember the Value that
we are potentially shadowing in <tt>old_val</tt> (which will be None if there is
no shadowed variable).</p>

<p>Once the loop variable is set into the symbol table, the code recursively
codegen's the body.  This allows the body to use the loop variable: any
references to it will naturally find it in the symbol table.</p>

<div class="doc_code">
<pre>
      (* Emit the step value. *)
      let step_val =
        match step with
        | Some step -&gt; codegen_expr step
        (* If not specified, use 1.0. *)
        | None -&gt; const_float double_type 1.0
      in

      let next_var = build_add variable step_val "nextvar" builder in
</pre>
</div>

<p>Now that the body is emitted, we compute the next value of the iteration
variable by adding the step value, or 1.0 if it isn't present.
'<tt>next_var</tt>' will be the value of the loop variable on the next iteration
of the loop.</p>

<div class="doc_code">
<pre>
      (* Compute the end condition. *)
      let end_cond = codegen_expr end_ in

      (* Convert condition to a bool by comparing equal to 0.0. *)
      let zero = const_float double_type 0.0 in
      let end_cond = build_fcmp Fcmp.One end_cond zero "loopcond" builder in
</pre>
</div>

<p>Finally, we evaluate the exit value of the loop, to determine whether the
loop should exit.  This mirrors the condition evaluation for the if/then/else
statement.</p>

<div class="doc_code">
<pre>
      (* Create the "after loop" block and insert it. *)
      let loop_end_bb = insertion_block builder in
      let after_bb = append_block context "afterloop" the_function in

      (* Insert the conditional branch into the end of loop_end_bb. *)
      ignore (build_cond_br end_cond loop_bb after_bb builder);

      (* Any new code will be inserted in after_bb. *)
      position_at_end after_bb builder;
</pre>
</div>

<p>With the code for the body of the loop complete, we just need to finish up
the control flow for it.  This code remembers the end block (for the phi node), then creates the block for the loop exit ("afterloop").  Based on the value of the
exit condition, it creates a conditional branch that chooses between executing
the loop again and exiting the loop.  Any future code is emitted in the
"afterloop" block, so it sets the insertion position to it.</p>

<div class="doc_code">
<pre>
      (* Add a new entry to the PHI node for the backedge. *)
      add_incoming (next_var, loop_end_bb) variable;

      (* Restore the unshadowed variable. *)
      begin match old_val with
      | Some old_val -&gt; Hashtbl.add named_values var_name old_val
      | None -&gt; ()
      end;

      (* for expr always returns 0.0. *)
      const_null double_type
</pre>
</div>

<p>The final code handles various cleanups: now that we have the
"<tt>next_var</tt>" value, we can add the incoming value to the loop PHI node.
After that, we remove the loop variable from the symbol table, so that it isn't
in scope after the for loop.  Finally, code generation of the for loop always
returns 0.0, so that is what we return from <tt>Codegen.codegen_expr</tt>.</p>

<p>With this, we conclude the "adding control flow to Kaleidoscope" chapter of
the tutorial.  In this chapter we added two control flow constructs, and used
them to motivate a couple of aspects of the LLVM IR that are important for
front-end implementors to know.  In the next chapter of our saga, we will get
a bit crazier and add <a href="OCamlLangImpl6.html">user-defined operators</a>
to our poor innocent language.</p>

</div>

<!-- *********************************************************************** -->
<div class="doc_section"><a name="code">Full Code Listing</a></div>
<!-- *********************************************************************** -->

<div class="doc_text">

<p>
Here is the complete code listing for our running example, enhanced with the
if/then/else and for expressions..  To build this example, use:
</p>

<div class="doc_code">
<pre>
# Compile
ocamlbuild toy.byte
# Run
./toy.byte
</pre>
</div>

<p>Here is the code:</p>

<dl>
<dt>_tags:</dt>
<dd class="doc_code">
<pre>
&lt;{lexer,parser}.ml&gt;: use_camlp4, pp(camlp4of)
&lt;*.{byte,native}&gt;: g++, use_llvm, use_llvm_analysis
&lt;*.{byte,native}&gt;: use_llvm_executionengine, use_llvm_target
&lt;*.{byte,native}&gt;: use_llvm_scalar_opts, use_bindings
</pre>
</dd>

<dt>myocamlbuild.ml:</dt>
<dd class="doc_code">
<pre>
open Ocamlbuild_plugin;;

ocaml_lib ~extern:true "llvm";;
ocaml_lib ~extern:true "llvm_analysis";;
ocaml_lib ~extern:true "llvm_executionengine";;
ocaml_lib ~extern:true "llvm_target";;
ocaml_lib ~extern:true "llvm_scalar_opts";;

flag ["link"; "ocaml"; "g++"] (S[A"-cc"; A"g++"]);;
dep ["link"; "ocaml"; "use_bindings"] ["bindings.o"];;
</pre>
</dd>

<dt>token.ml:</dt>
<dd class="doc_code">
<pre>
(*===----------------------------------------------------------------------===
 * Lexer Tokens
 *===----------------------------------------------------------------------===*)

(* The lexer returns these 'Kwd' if it is an unknown character, otherwise one of
 * these others for known things. *)
type token =
  (* commands *)
  | Def | Extern

  (* primary *)
  | Ident of string | Number of float

  (* unknown *)
  | Kwd of char

  (* control *)
  | If | Then | Else
  | For | In
</pre>
</dd>

<dt>lexer.ml:</dt>
<dd class="doc_code">
<pre>
(*===----------------------------------------------------------------------===
 * Lexer
 *===----------------------------------------------------------------------===*)

let rec lex = parser
  (* Skip any whitespace. *)
  | [&lt; ' (' ' | '\n' | '\r' | '\t'); stream &gt;] -&gt; lex stream

  (* identifier: [a-zA-Z][a-zA-Z0-9] *)
  | [&lt; ' ('A' .. 'Z' | 'a' .. 'z' as c); stream &gt;] -&gt;
      let buffer = Buffer.create 1 in
      Buffer.add_char buffer c;
      lex_ident buffer stream

  (* number: [0-9.]+ *)
  | [&lt; ' ('0' .. '9' as c); stream &gt;] -&gt;
      let buffer = Buffer.create 1 in
      Buffer.add_char buffer c;
      lex_number buffer stream

  (* Comment until end of line. *)
  | [&lt; ' ('#'); stream &gt;] -&gt;
      lex_comment stream

  (* Otherwise, just return the character as its ascii value. *)
  | [&lt; 'c; stream &gt;] -&gt;
      [&lt; 'Token.Kwd c; lex stream &gt;]

  (* end of stream. *)
  | [&lt; &gt;] -&gt; [&lt; &gt;]

and lex_number buffer = parser
  | [&lt; ' ('0' .. '9' | '.' as c); stream &gt;] -&gt;
      Buffer.add_char buffer c;
      lex_number buffer stream
  | [&lt; stream=lex &gt;] -&gt;
      [&lt; 'Token.Number (float_of_string (Buffer.contents buffer)); stream &gt;]

and lex_ident buffer = parser
  | [&lt; ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream &gt;] -&gt;
      Buffer.add_char buffer c;
      lex_ident buffer stream
  | [&lt; stream=lex &gt;] -&gt;
      match Buffer.contents buffer with
      | "def" -&gt; [&lt; 'Token.Def; stream &gt;]
      | "extern" -&gt; [&lt; 'Token.Extern; stream &gt;]
      | "if" -&gt; [&lt; 'Token.If; stream &gt;]
      | "then" -&gt; [&lt; 'Token.Then; stream &gt;]
      | "else" -&gt; [&lt; 'Token.Else; stream &gt;]
      | "for" -&gt; [&lt; 'Token.For; stream &gt;]
      | "in" -&gt; [&lt; 'Token.In; stream &gt;]
      | id -&gt; [&lt; 'Token.Ident id; stream &gt;]

and lex_comment = parser
  | [&lt; ' ('\n'); stream=lex &gt;] -&gt; stream
  | [&lt; 'c; e=lex_comment &gt;] -&gt; e
  | [&lt; &gt;] -&gt; [&lt; &gt;]
</pre>
</dd>

<dt>ast.ml:</dt>
<dd class="doc_code">
<pre>
(*===----------------------------------------------------------------------===
 * Abstract Syntax Tree (aka Parse Tree)
 *===----------------------------------------------------------------------===*)

(* expr - Base type for all expression nodes. *)
type expr =
  (* variant for numeric literals like "1.0". *)
  | Number of float

  (* variant for referencing a variable, like "a". *)
  | Variable of string

  (* variant for a binary operator. *)
  | Binary of char * expr * expr

  (* variant for function calls. *)
  | Call of string * expr array

  (* variant for if/then/else. *)
  | If of expr * expr * expr

  (* variant for for/in. *)
  | For of string * expr * expr * expr option * expr

(* proto - This type represents the "prototype" for a function, which captures
 * its name, and its argument names (thus implicitly the number of arguments the
 * function takes). *)
type proto = Prototype of string * string array

(* func - This type represents a function definition itself. *)
type func = Function of proto * expr
</pre>
</dd>

<dt>parser.ml:</dt>
<dd class="doc_code">
<pre>
(*===---------------------------------------------------------------------===
 * Parser
 *===---------------------------------------------------------------------===*)

(* binop_precedence - This holds the precedence for each binary operator that is
 * defined *)
let binop_precedence:(char, int) Hashtbl.t = Hashtbl.create 10

(* precedence - Get the precedence of the pending binary operator token. *)
let precedence c = try Hashtbl.find binop_precedence c with Not_found -&gt; -1

(* primary
 *   ::= identifier
 *   ::= numberexpr
 *   ::= parenexpr
 *   ::= ifexpr
 *   ::= forexpr *)
let rec parse_primary = parser
  (* numberexpr ::= number *)
  | [&lt; 'Token.Number n &gt;] -&gt; Ast.Number n

  (* parenexpr ::= '(' expression ')' *)
  | [&lt; 'Token.Kwd '('; e=parse_expr; 'Token.Kwd ')' ?? "expected ')'" &gt;] -&gt; e

  (* identifierexpr
   *   ::= identifier
   *   ::= identifier '(' argumentexpr ')' *)
  | [&lt; 'Token.Ident id; stream &gt;] -&gt;
      let rec parse_args accumulator = parser
        | [&lt; e=parse_expr; stream &gt;] -&gt;
            begin parser
              | [&lt; 'Token.Kwd ','; e=parse_args (e :: accumulator) &gt;] -&gt; e
              | [&lt; &gt;] -&gt; e :: accumulator
            end stream
        | [&lt; &gt;] -&gt; accumulator
      in
      let rec parse_ident id = parser
        (* Call. *)
        | [&lt; 'Token.Kwd '(';
             args=parse_args [];
             'Token.Kwd ')' ?? "expected ')'"&gt;] -&gt;
            Ast.Call (id, Array.of_list (List.rev args))

        (* Simple variable ref. *)
        | [&lt; &gt;] -&gt; Ast.Variable id
      in
      parse_ident id stream

  (* ifexpr ::= 'if' expr 'then' expr 'else' expr *)
  | [&lt; 'Token.If; c=parse_expr;
       'Token.Then ?? "expected 'then'"; t=parse_expr;
       'Token.Else ?? "expected 'else'"; e=parse_expr &gt;] -&gt;
      Ast.If (c, t, e)

  (* forexpr
        ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression *)
  | [&lt; 'Token.For;
       'Token.Ident id ?? "expected identifier after for";
       'Token.Kwd '=' ?? "expected '=' after for";
       stream &gt;] -&gt;
      begin parser
        | [&lt;
             start=parse_expr;
             'Token.Kwd ',' ?? "expected ',' after for";
             end_=parse_expr;
             stream &gt;] -&gt;
            let step =
              begin parser
              | [&lt; 'Token.Kwd ','; step=parse_expr &gt;] -&gt; Some step
              | [&lt; &gt;] -&gt; None
              end stream
            in
            begin parser
            | [&lt; 'Token.In; body=parse_expr &gt;] -&gt;
                Ast.For (id, start, end_, step, body)
            | [&lt; &gt;] -&gt;
                raise (Stream.Error "expected 'in' after for")
            end stream
        | [&lt; &gt;] -&gt;
            raise (Stream.Error "expected '=' after for")
      end stream

  | [&lt; &gt;] -&gt; raise (Stream.Error "unknown token when expecting an expression.")

(* binoprhs
 *   ::= ('+' primary)* *)
and parse_bin_rhs expr_prec lhs stream =
  match Stream.peek stream with
  (* If this is a binop, find its precedence. *)
  | Some (Token.Kwd c) when Hashtbl.mem binop_precedence c -&gt;
      let token_prec = precedence c in

      (* If this is a binop that binds at least as tightly as the current binop,
       * consume it, otherwise we are done. *)
      if token_prec &lt; expr_prec then lhs else begin
        (* Eat the binop. *)
        Stream.junk stream;

        (* Parse the primary expression after the binary operator. *)
        let rhs = parse_primary stream in

        (* Okay, we know this is a binop. *)
        let rhs =
          match Stream.peek stream with
          | Some (Token.Kwd c2) -&gt;
              (* If BinOp binds less tightly with rhs than the operator after
               * rhs, let the pending operator take rhs as its lhs. *)
              let next_prec = precedence c2 in
              if token_prec &lt; next_prec
              then parse_bin_rhs (token_prec + 1) rhs stream
              else rhs
          | _ -&gt; rhs
        in

        (* Merge lhs/rhs. *)
        let lhs = Ast.Binary (c, lhs, rhs) in
        parse_bin_rhs expr_prec lhs stream
      end
  | _ -&gt; lhs

(* expression
 *   ::= primary binoprhs *)
and parse_expr = parser
  | [&lt; lhs=parse_primary; stream &gt;] -&gt; parse_bin_rhs 0 lhs stream

(* prototype
 *   ::= id '(' id* ')' *)
let parse_prototype =
  let rec parse_args accumulator = parser
    | [&lt; 'Token.Ident id; e=parse_args (id::accumulator) &gt;] -&gt; e
    | [&lt; &gt;] -&gt; accumulator
  in

  parser
  | [&lt; 'Token.Ident id;
       'Token.Kwd '(' ?? "expected '(' in prototype";
       args=parse_args [];
       'Token.Kwd ')' ?? "expected ')' in prototype" &gt;] -&gt;
      (* success. *)
      Ast.Prototype (id, Array.of_list (List.rev args))

  | [&lt; &gt;] -&gt;
      raise (Stream.Error "expected function name in prototype")

(* definition ::= 'def' prototype expression *)
let parse_definition = parser
  | [&lt; 'Token.Def; p=parse_prototype; e=parse_expr &gt;] -&gt;
      Ast.Function (p, e)

(* toplevelexpr ::= expression *)
let parse_toplevel = parser
  | [&lt; e=parse_expr &gt;] -&gt;
      (* Make an anonymous proto. *)
      Ast.Function (Ast.Prototype ("", [||]), e)

(*  external ::= 'extern' prototype *)
let parse_extern = parser
  | [&lt; 'Token.Extern; e=parse_prototype &gt;] -&gt; e
</pre>
</dd>

<dt>codegen.ml:</dt>
<dd class="doc_code">
<pre>
(*===----------------------------------------------------------------------===
 * Code Generation
 *===----------------------------------------------------------------------===*)

open Llvm

exception Error of string

let context = global_context ()
let the_module = create_module context "my cool jit"
let builder = builder context
let named_values:(string, llvalue) Hashtbl.t = Hashtbl.create 10
let double_type = double_type context

let rec codegen_expr = function
  | Ast.Number n -&gt; const_float double_type n
  | Ast.Variable name -&gt;
      (try Hashtbl.find named_values name with
        | Not_found -&gt; raise (Error "unknown variable name"))
  | Ast.Binary (op, lhs, rhs) -&gt;
      let lhs_val = codegen_expr lhs in
      let rhs_val = codegen_expr rhs in
      begin
        match op with
        | '+' -&gt; build_add lhs_val rhs_val "addtmp" builder
        | '-' -&gt; build_sub lhs_val rhs_val "subtmp" builder
        | '*' -&gt; build_mul lhs_val rhs_val "multmp" builder
        | '&lt;' -&gt;
            (* Convert bool 0/1 to double 0.0 or 1.0 *)
            let i = build_fcmp Fcmp.Ult lhs_val rhs_val "cmptmp" builder in
            build_uitofp i double_type "booltmp" builder
        | _ -&gt; raise (Error "invalid binary operator")
      end
  | Ast.Call (callee, args) -&gt;
      (* Look up the name in the module table. *)
      let callee =
        match lookup_function callee the_module with
        | Some callee -&gt; callee
        | None -&gt; raise (Error "unknown function referenced")
      in
      let params = params callee in

      (* If argument mismatch error. *)
      if Array.length params == Array.length args then () else
        raise (Error "incorrect # arguments passed");
      let args = Array.map codegen_expr args in
      build_call callee args "calltmp" builder
  | Ast.If (cond, then_, else_) -&gt;
      let cond = codegen_expr cond in

      (* Convert condition to a bool by comparing equal to 0.0 *)
      let zero = const_float double_type 0.0 in
      let cond_val = build_fcmp Fcmp.One cond zero "ifcond" builder in

      (* Grab the first block so that we might later add the conditional branch
       * to it at the end of the function. *)
      let start_bb = insertion_block builder in
      let the_function = block_parent start_bb in

      let then_bb = append_block context "then" the_function in

      (* Emit 'then' value. *)
      position_at_end then_bb builder;
      let then_val = codegen_expr then_ in

      (* Codegen of 'then' can change the current block, update then_bb for the
       * phi. We create a new name because one is used for the phi node, and the
       * other is used for the conditional branch. *)
      let new_then_bb = insertion_block builder in

      (* Emit 'else' value. *)
      let else_bb = append_block context "else" the_function in
      position_at_end else_bb builder;
      let else_val = codegen_expr else_ in

      (* Codegen of 'else' can change the current block, update else_bb for the
       * phi. *)
      let new_else_bb = insertion_block builder in

      (* Emit merge block. *)
      let merge_bb = append_block context "ifcont" the_function in
      position_at_end merge_bb builder;
      let incoming = [(then_val, new_then_bb); (else_val, new_else_bb)] in
      let phi = build_phi incoming "iftmp" builder in

      (* Return to the start block to add the conditional branch. *)
      position_at_end start_bb builder;
      ignore (build_cond_br cond_val then_bb else_bb builder);

      (* Set a unconditional branch at the end of the 'then' block and the
       * 'else' block to the 'merge' block. *)
      position_at_end new_then_bb builder; ignore (build_br merge_bb builder);
      position_at_end new_else_bb builder; ignore (build_br merge_bb builder);

      (* Finally, set the builder to the end of the merge block. *)
      position_at_end merge_bb builder;

      phi
  | Ast.For (var_name, start, end_, step, body) -&gt;
      (* Emit the start code first, without 'variable' in scope. *)
      let start_val = codegen_expr start in

      (* Make the new basic block for the loop header, inserting after current
       * block. *)
      let preheader_bb = insertion_block builder in
      let the_function = block_parent preheader_bb in
      let loop_bb = append_block context "loop" the_function in

      (* Insert an explicit fall through from the current block to the
       * loop_bb. *)
      ignore (build_br loop_bb builder);

      (* Start insertion in loop_bb. *)
      position_at_end loop_bb builder;

      (* Start the PHI node with an entry for start. *)
      let variable = build_phi [(start_val, preheader_bb)] var_name builder in

      (* Within the loop, the variable is defined equal to the PHI node. If it
       * shadows an existing variable, we have to restore it, so save it
       * now. *)
      let old_val =
        try Some (Hashtbl.find named_values var_name) with Not_found -&gt; None
      in
      Hashtbl.add named_values var_name variable;

      (* Emit the body of the loop.  This, like any other expr, can change the
       * current BB.  Note that we ignore the value computed by the body, but
       * don't allow an error *)
      ignore (codegen_expr body);

      (* Emit the step value. *)
      let step_val =
        match step with
        | Some step -&gt; codegen_expr step
        (* If not specified, use 1.0. *)
        | None -&gt; const_float double_type 1.0
      in

      let next_var = build_add variable step_val "nextvar" builder in

      (* Compute the end condition. *)
      let end_cond = codegen_expr end_ in

      (* Convert condition to a bool by comparing equal to 0.0. *)
      let zero = const_float double_type 0.0 in
      let end_cond = build_fcmp Fcmp.One end_cond zero "loopcond" builder in

      (* Create the "after loop" block and insert it. *)
      let loop_end_bb = insertion_block builder in
      let after_bb = append_block context "afterloop" the_function in

      (* Insert the conditional branch into the end of loop_end_bb. *)
      ignore (build_cond_br end_cond loop_bb after_bb builder);

      (* Any new code will be inserted in after_bb. *)
      position_at_end after_bb builder;

      (* Add a new entry to the PHI node for the backedge. *)
      add_incoming (next_var, loop_end_bb) variable;

      (* Restore the unshadowed variable. *)
      begin match old_val with
      | Some old_val -&gt; Hashtbl.add named_values var_name old_val
      | None -&gt; ()
      end;

      (* for expr always returns 0.0. *)
      const_null double_type

let codegen_proto = function
  | Ast.Prototype (name, args) -&gt;
      (* Make the function type: double(double,double) etc. *)
      let doubles = Array.make (Array.length args) double_type in
      let ft = function_type double_type doubles in
      let f =
        match lookup_function name the_module with
        | None -&gt; declare_function name ft the_module

        (* If 'f' conflicted, there was already something named 'name'. If it
         * has a body, don't allow redefinition or reextern. *)
        | Some f -&gt;
            (* If 'f' already has a body, reject this. *)
            if block_begin f &lt;&gt; At_end f then
              raise (Error "redefinition of function");

            (* If 'f' took a different number of arguments, reject. *)
            if element_type (type_of f) &lt;&gt; ft then
              raise (Error "redefinition of function with different # args");
            f
      in

      (* Set names for all arguments. *)
      Array.iteri (fun i a -&gt;
        let n = args.(i) in
        set_value_name n a;
        Hashtbl.add named_values n a;
      ) (params f);
      f

let codegen_func the_fpm = function
  | Ast.Function (proto, body) -&gt;
      Hashtbl.clear named_values;
      let the_function = codegen_proto proto in

      (* Create a new basic block to start insertion into. *)
      let bb = append_block context "entry" the_function in
      position_at_end bb builder;

      try
        let ret_val = codegen_expr body in

        (* Finish off the function. *)
        let _ = build_ret ret_val builder in

        (* Validate the generated code, checking for consistency. *)
        Llvm_analysis.assert_valid_function the_function;

        (* Optimize the function. *)
        let _ = PassManager.run_function the_function the_fpm in

        the_function
      with e -&gt;
        delete_function the_function;
        raise e
</pre>
</dd>

<dt>toplevel.ml:</dt>
<dd class="doc_code">
<pre>
(*===----------------------------------------------------------------------===
 * Top-Level parsing and JIT Driver
 *===----------------------------------------------------------------------===*)

open Llvm
open Llvm_executionengine

(* top ::= definition | external | expression | ';' *)
let rec main_loop the_fpm the_execution_engine stream =
  match Stream.peek stream with
  | None -&gt; ()

  (* ignore top-level semicolons. *)
  | Some (Token.Kwd ';') -&gt;
      Stream.junk stream;
      main_loop the_fpm the_execution_engine stream

  | Some token -&gt;
      begin
        try match token with
        | Token.Def -&gt;
            let e = Parser.parse_definition stream in
            print_endline "parsed a function definition.";
            dump_value (Codegen.codegen_func the_fpm e);
        | Token.Extern -&gt;
            let e = Parser.parse_extern stream in
            print_endline "parsed an extern.";
            dump_value (Codegen.codegen_proto e);
        | _ -&gt;
            (* Evaluate a top-level expression into an anonymous function. *)
            let e = Parser.parse_toplevel stream in
            print_endline "parsed a top-level expr";
            let the_function = Codegen.codegen_func the_fpm e in
            dump_value the_function;

            (* JIT the function, returning a function pointer. *)
            let result = ExecutionEngine.run_function the_function [||]
              the_execution_engine in

            print_string "Evaluated to ";
            print_float (GenericValue.as_float Codegen.double_type result);
            print_newline ();
        with Stream.Error s | Codegen.Error s -&gt;
          (* Skip token for error recovery. *)
          Stream.junk stream;
          print_endline s;
      end;
      print_string "ready&gt; "; flush stdout;
      main_loop the_fpm the_execution_engine stream
</pre>
</dd>

<dt>toy.ml:</dt>
<dd class="doc_code">
<pre>
(*===----------------------------------------------------------------------===
 * Main driver code.
 *===----------------------------------------------------------------------===*)

open Llvm
open Llvm_executionengine
open Llvm_target
open Llvm_scalar_opts

let main () =
  ignore (initialize_native_target ());

  (* Install standard binary operators.
   * 1 is the lowest precedence. *)
  Hashtbl.add Parser.binop_precedence '&lt;' 10;
  Hashtbl.add Parser.binop_precedence '+' 20;
  Hashtbl.add Parser.binop_precedence '-' 20;
  Hashtbl.add Parser.binop_precedence '*' 40;    (* highest. *)

  (* Prime the first token. *)
  print_string "ready&gt; "; flush stdout;
  let stream = Lexer.lex (Stream.of_channel stdin) in

  (* Create the JIT. *)
  let the_execution_engine = ExecutionEngine.create Codegen.the_module in
  let the_fpm = PassManager.create_function Codegen.the_module in

  (* Set up the optimizer pipeline.  Start with registering info about how the
   * target lays out data structures. *)
  TargetData.add (ExecutionEngine.target_data the_execution_engine) the_fpm;

  (* Do simple "peephole" optimizations and bit-twiddling optzn. *)
  add_instruction_combination the_fpm;

  (* reassociate expressions. *)
  add_reassociation the_fpm;

  (* Eliminate Common SubExpressions. *)
  add_gvn the_fpm;

  (* Simplify the control flow graph (deleting unreachable blocks, etc). *)
  add_cfg_simplification the_fpm;

  ignore (PassManager.initialize the_fpm);

  (* Run the main "interpreter loop" now. *)
  Toplevel.main_loop the_fpm the_execution_engine stream;

  (* Print out all the generated code. *)
  dump_module Codegen.the_module
;;

main ()
</pre>
</dd>

<dt>bindings.c</dt>
<dd class="doc_code">
<pre>
#include &lt;stdio.h&gt;

/* putchard - putchar that takes a double and returns 0. */
extern double putchard(double X) {
  putchar((char)X);
  return 0;
}
</pre>
</dd>
</dl>

<a href="OCamlLangImpl6.html">Next: Extending the language: user-defined
operators</a>
</div>

<!-- *********************************************************************** -->
<hr>
<address>
  <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
  src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a>
  <a href="http://validator.w3.org/check/referer"><img
  src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>

  <a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
  <a href="mailto:idadesub@users.sourceforge.net">Erick Tryzelaar</a><br>
  <a href="http://llvm.org">The LLVM Compiler Infrastructure</a><br>
  Last modified: $Date$
</address>
</body>
</html>
