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

<html>
<head>
  <title>Kaleidoscope: Implementing code generation to LLVM IR</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="../_static/llvm.css" type="text/css">
</head>

<body>

<h1>Kaleidoscope: Code generation to LLVM IR</h1>

<ul>
<li><a href="index.html">Up to Tutorial Index</a></li>
<li>Chapter 3
  <ol>
    <li><a href="#intro">Chapter 3 Introduction</a></li>
    <li><a href="#basics">Code Generation Setup</a></li>
    <li><a href="#exprs">Expression Code Generation</a></li>
    <li><a href="#funcs">Function Code Generation</a></li>
    <li><a href="#driver">Driver Changes and Closing Thoughts</a></li>
    <li><a href="#code">Full Code Listing</a></li>
  </ol>
</li>
<li><a href="OCamlLangImpl4.html">Chapter 4</a>: Adding JIT and Optimizer
Support</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>

<!-- *********************************************************************** -->
<h2><a name="intro">Chapter 3 Introduction</a></h2>
<!-- *********************************************************************** -->

<div>

<p>Welcome to Chapter 3 of the "<a href="index.html">Implementing a language
with LLVM</a>" tutorial.  This chapter shows you how to transform the <a
href="OCamlLangImpl2.html">Abstract Syntax Tree</a>, built in Chapter 2, into
LLVM IR.  This will teach you a little bit about how LLVM does things, as well
as demonstrate how easy it is to use.  It's much more work to build a lexer and
parser than it is to generate LLVM IR code. :)
</p>

<p><b>Please note</b>: the code in this chapter and later require LLVM 2.3 or
LLVM SVN to work.  LLVM 2.2 and before will not work with it.</p>

</div>

<!-- *********************************************************************** -->
<h2><a name="basics">Code Generation Setup</a></h2>
<!-- *********************************************************************** -->

<div>

<p>
In order to generate LLVM IR, we want some simple setup to get started.  First
we define virtual code generation (codegen) methods in each AST class:</p>

<div class="doc_code">
<pre>
let rec codegen_expr = function
  | Ast.Number n -&gt; ...
  | Ast.Variable name -&gt; ...
</pre>
</div>

<p>The <tt>Codegen.codegen_expr</tt> function says to emit IR for that AST node
along with all the things it depends on, and they all return an LLVM Value
object.  "Value" is the class used to represent a "<a
href="http://en.wikipedia.org/wiki/Static_single_assignment_form">Static Single
Assignment (SSA)</a> register" or "SSA value" in LLVM.  The most distinct aspect
of SSA values is that their value is computed as the related instruction
executes, and it does not get a new value until (and if) the instruction
re-executes.  In other words, there is no way to "change" an SSA value.  For
more information, please read up on <a
href="http://en.wikipedia.org/wiki/Static_single_assignment_form">Static Single
Assignment</a> - the concepts are really quite natural once you grok them.</p>

<p>The
second thing we want is an "Error" exception like we used for the parser, which
will be used to report errors found during code generation (for example, use of
an undeclared parameter):</p>

<div class="doc_code">
<pre>
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
</pre>
</div>

<p>The static variables will be used during code generation.
<tt>Codgen.the_module</tt> is the LLVM construct that contains all of the
functions and global variables in a chunk of code.  In many ways, it is the
top-level structure that the LLVM IR uses to contain code.</p>

<p>The <tt>Codegen.builder</tt> object is a helper object that makes it easy to
generate LLVM instructions.  Instances of the <a
href="http://llvm.org/doxygen/IRBuilder_8h-source.html"><tt>IRBuilder</tt></a>
class keep track of the current place to insert instructions and has methods to
create new instructions.</p>

<p>The <tt>Codegen.named_values</tt> map keeps track of which values are defined
in the current scope and what their LLVM representation is.  (In other words, it
is a symbol table for the code).  In this form of Kaleidoscope, the only things
that can be referenced are function parameters.  As such, function parameters
will be in this map when generating code for their function body.</p>

<p>
With these basics in place, we can start talking about how to generate code for
each expression.  Note that this assumes that the <tt>Codgen.builder</tt> has
been set up to generate code <em>into</em> something.  For now, we'll assume
that this has already been done, and we'll just use it to emit code.</p>

</div>

<!-- *********************************************************************** -->
<h2><a name="exprs">Expression Code Generation</a></h2>
<!-- *********************************************************************** -->

<div>

<p>Generating LLVM code for expression nodes is very straightforward: less
than 30 lines of commented code for all four of our expression nodes.  First
we'll do numeric literals:</p>

<div class="doc_code">
<pre>
  | Ast.Number n -&gt; const_float double_type n
</pre>
</div>

<p>In the LLVM IR, numeric constants are represented with the
<tt>ConstantFP</tt> class, which holds the numeric value in an <tt>APFloat</tt>
internally (<tt>APFloat</tt> has the capability of holding floating point
constants of <em>A</em>rbitrary <em>P</em>recision).  This code basically just
creates and returns a <tt>ConstantFP</tt>.  Note that in the LLVM IR
that constants are all uniqued together and shared.  For this reason, the API
uses "the foo::get(..)" idiom instead of "new foo(..)" or "foo::Create(..)".</p>

<div class="doc_code">
<pre>
  | Ast.Variable name -&gt;
      (try Hashtbl.find named_values name with
        | Not_found -&gt; raise (Error "unknown variable name"))
</pre>
</div>

<p>References to variables are also quite simple using LLVM.  In the simple
version of Kaleidoscope, we assume that the variable has already been emitted
somewhere and its value is available.  In practice, the only values that can be
in the <tt>Codegen.named_values</tt> map are function arguments.  This code
simply checks to see that the specified name is in the map (if not, an unknown
variable is being referenced) and returns the value for it.  In future chapters,
we'll add support for <a href="LangImpl5.html#for">loop induction variables</a>
in the symbol table, and for <a href="LangImpl7.html#localvars">local
variables</a>.</p>

<div class="doc_code">
<pre>
  | 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_fadd lhs_val rhs_val "addtmp" builder
        | '-' -&gt; build_fsub lhs_val rhs_val "subtmp" builder
        | '*' -&gt; build_fmul 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
</pre>
</div>

<p>Binary operators start to get more interesting.  The basic idea here is that
we recursively emit code for the left-hand side of the expression, then the
right-hand side, then we compute the result of the binary expression.  In this
code, we do a simple switch on the opcode to create the right LLVM instruction.
</p>

<p>In the example above, the LLVM builder class is starting to show its value.
IRBuilder knows where to insert the newly created instruction, all you have to
do is specify what instruction to create (e.g. with <tt>Llvm.create_add</tt>),
which operands to use (<tt>lhs</tt> and <tt>rhs</tt> here) and optionally
provide a name for the generated instruction.</p>

<p>One nice thing about LLVM is that the name is just a hint.  For instance, if
the code above emits multiple "addtmp" variables, LLVM will automatically
provide each one with an increasing, unique numeric suffix.  Local value names
for instructions are purely optional, but it makes it much easier to read the
IR dumps.</p>

<p><a href="../LangRef.html#instref">LLVM instructions</a> are constrained by
strict rules: for example, the Left and Right operators of
an <a href="../LangRef.html#i_add">add instruction</a> must have the same
type, and the result type of the add must match the operand types.  Because
all values in Kaleidoscope are doubles, this makes for very simple code for add,
sub and mul.</p>

<p>On the other hand, LLVM specifies that the <a
href="../LangRef.html#i_fcmp">fcmp instruction</a> always returns an 'i1' value
(a one bit integer).  The problem with this is that Kaleidoscope wants the value to be a 0.0 or 1.0 value.  In order to get these semantics, we combine the fcmp instruction with
a <a href="../LangRef.html#i_uitofp">uitofp instruction</a>.  This instruction
converts its input integer into a floating point value by treating the input
as an unsigned value.  In contrast, if we used the <a
href="../LangRef.html#i_sitofp">sitofp instruction</a>, the Kaleidoscope '&lt;'
operator would return 0.0 and -1.0, depending on the input value.</p>

<div class="doc_code">
<pre>
  | 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
</pre>
</div>

<p>Code generation for function calls is quite straightforward with LLVM.  The
code above initially does a function name lookup in the LLVM Module's symbol
table.  Recall that the LLVM Module is the container that holds all of the
functions we are JIT'ing.  By giving each function the same name as what the
user specifies, we can use the LLVM symbol table to resolve function names for
us.</p>

<p>Once we have the function to call, we recursively codegen each argument that
is to be passed in, and create an LLVM <a href="../LangRef.html#i_call">call
instruction</a>.  Note that LLVM uses the native C calling conventions by
default, allowing these calls to also call into standard library functions like
"sin" and "cos", with no additional effort.</p>

<p>This wraps up our handling of the four basic expressions that we have so far
in Kaleidoscope.  Feel free to go in and add some more.  For example, by
browsing the <a href="../LangRef.html">LLVM language reference</a> you'll find
several other interesting instructions that are really easy to plug into our
basic framework.</p>

</div>

<!-- *********************************************************************** -->
<h2><a name="funcs">Function Code Generation</a></h2>
<!-- *********************************************************************** -->

<div>

<p>Code generation for prototypes and functions must handle a number of
details, which make their code less beautiful than expression code
generation, but allows us to illustrate some important points.  First, lets
talk about code generation for prototypes: they are used both for function
bodies and external function declarations.  The code starts with:</p>

<div class="doc_code">
<pre>
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
</pre>
</div>

<p>This code packs a lot of power into a few lines.  Note first that this
function returns a "Function*" instead of a "Value*" (although at the moment
they both are modeled by <tt>llvalue</tt> in ocaml).  Because a "prototype"
really talks about the external interface for a function (not the value computed
by an expression), it makes sense for it to return the LLVM Function it
corresponds to when codegen'd.</p>

<p>The call to <tt>Llvm.function_type</tt> creates the <tt>Llvm.llvalue</tt>
that should be used for a given Prototype.  Since all function arguments in
Kaleidoscope are of type double, the first line creates a vector of "N" LLVM
double types.  It then uses the <tt>Llvm.function_type</tt> method to create a
function type that takes "N" doubles as arguments, returns one double as a
result, and that is not vararg (that uses the function
<tt>Llvm.var_arg_function_type</tt>).  Note that Types in LLVM are uniqued just
like <tt>Constant</tt>s are, so you don't "new" a type, you "get" it.</p>

<p>The final line above checks if the function has already been defined in
<tt>Codegen.the_module</tt>. If not, we will create it.</p>

<div class="doc_code">
<pre>
        | None -&gt; declare_function name ft the_module
</pre>
</div>

<p>This indicates the type and name to use, as well as which module to insert
into.  By default we assume a function has
<tt>Llvm.Linkage.ExternalLinkage</tt>.  "<a href="LangRef.html#linkage">external
linkage</a>" means that the function may be defined outside the current module
and/or that it is callable by functions outside the module.  The "<tt>name</tt>"
passed in is the name the user specified: this name is registered in
"<tt>Codegen.the_module</tt>"s symbol table, which is used by the function call
code above.</p>

<p>In Kaleidoscope, I choose to allow redefinitions of functions in two cases:
first, we want to allow 'extern'ing a function more than once, as long as the
prototypes for the externs match (since all arguments have the same type, we
just have to check that the number of arguments match).  Second, we want to
allow 'extern'ing a function and then defining a body for it.  This is useful
when defining mutually recursive functions.</p>

<div class="doc_code">
<pre>
        (* 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 Array.length (basic_blocks f) == 0 then () else
              raise (Error "redefinition of function");

            (* If 'f' took a different number of arguments, reject. *)
            if Array.length (params f) == Array.length args then () else
              raise (Error "redefinition of function with different # args");
            f
      in
</pre>
</div>

<p>In order to verify the logic above, we first check to see if the pre-existing
function is "empty".  In this case, empty means that it has no basic blocks in
it, which means it has no body.  If it has no body, it is a forward
declaration.  Since we don't allow anything after a full definition of the
function, the code rejects this case.  If the previous reference to a function
was an 'extern', we simply verify that the number of arguments for that
definition and this one match up.  If not, we emit an error.</p>

<div class="doc_code">
<pre>
      (* 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
</pre>
</div>

<p>The last bit of code for prototypes loops over all of the arguments in the
function, setting the name of the LLVM Argument objects to match, and registering
the arguments in the <tt>Codegen.named_values</tt> map for future use by the
<tt>Ast.Variable</tt> variant.  Once this is set up, it returns the Function
object to the caller.  Note that we don't check for conflicting
argument names here (e.g. "extern foo(a b a)").  Doing so would be very
straight-forward with the mechanics we have already used above.</p>

<div class="doc_code">
<pre>
let codegen_func = function
  | Ast.Function (proto, body) -&gt;
      Hashtbl.clear named_values;
      let the_function = codegen_proto proto in
</pre>
</div>

<p>Code generation for function definitions starts out simply enough: we just
codegen the prototype (Proto) and verify that it is ok.  We then clear out the
<tt>Codegen.named_values</tt> map to make sure that there isn't anything in it
from the last function we compiled.  Code generation of the prototype ensures
that there is an LLVM Function object that is ready to go for us.</p>

<div class="doc_code">
<pre>
      (* 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
</pre>
</div>

<p>Now we get to the point where the <tt>Codegen.builder</tt> is set up.  The
first line creates a new
<a href="http://en.wikipedia.org/wiki/Basic_block">basic block</a> (named
"entry"), which is inserted into <tt>the_function</tt>.  The second line then
tells the builder that new instructions should be inserted into the end of the
new basic block.  Basic blocks in LLVM are an important part of functions that
define the <a
href="http://en.wikipedia.org/wiki/Control_flow_graph">Control Flow Graph</a>.
Since we don't have any control flow, our functions will only contain one
block at this point.  We'll fix this in <a href="OCamlLangImpl5.html">Chapter
5</a> :).</p>

<div class="doc_code">
<pre>
        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;

        the_function
</pre>
</div>

<p>Once the insertion point is set up, we call the <tt>Codegen.codegen_func</tt>
method for the root expression of the function.  If no error happens, this emits
code to compute the expression into the entry block and returns the value that
was computed.  Assuming no error, we then create an LLVM <a
href="../LangRef.html#i_ret">ret instruction</a>, which completes the function.
Once the function is built, we call
<tt>Llvm_analysis.assert_valid_function</tt>, which is provided by LLVM.  This
function does a variety of consistency checks on the generated code, to
determine if our compiler is doing everything right.  Using this is important:
it can catch a lot of bugs.  Once the function is finished and validated, we
return it.</p>

<div class="doc_code">
<pre>
      with e -&gt;
        delete_function the_function;
        raise e
</pre>
</div>

<p>The only piece left here is handling of the error case.  For simplicity, we
handle this by merely deleting the function we produced with the
<tt>Llvm.delete_function</tt> method.  This allows the user to redefine a
function that they incorrectly typed in before: if we didn't delete it, it
would live in the symbol table, with a body, preventing future redefinition.</p>

<p>This code does have a bug, though.  Since the <tt>Codegen.codegen_proto</tt>
can return a previously defined forward declaration, our code can actually delete
a forward declaration.  There are a number of ways to fix this bug, see what you
can come up with!  Here is a testcase:</p>

<div class="doc_code">
<pre>
extern foo(a b);     # ok, defines foo.
def foo(a b) c;      # error, 'c' is invalid.
def bar() foo(1, 2); # error, unknown function "foo"
</pre>
</div>

</div>

<!-- *********************************************************************** -->
<h2><a name="driver">Driver Changes and Closing Thoughts</a></h2>
<!-- *********************************************************************** -->

<div>

<p>
For now, code generation to LLVM doesn't really get us much, except that we can
look at the pretty IR calls.  The sample code inserts calls to Codegen into the
"<tt>Toplevel.main_loop</tt>", and then dumps out the LLVM IR.  This gives a
nice way to look at the LLVM IR for simple functions.  For example:
</p>

<div class="doc_code">
<pre>
ready&gt; <b>4+5</b>;
Read top-level expression:
define double @""() {
entry:
        %addtmp = fadd double 4.000000e+00, 5.000000e+00
        ret double %addtmp
}
</pre>
</div>

<p>Note how the parser turns the top-level expression into anonymous functions
for us.  This will be handy when we add <a href="OCamlLangImpl4.html#jit">JIT
support</a> in the next chapter.  Also note that the code is very literally
transcribed, no optimizations are being performed.  We will
<a href="OCamlLangImpl4.html#trivialconstfold">add optimizations</a> explicitly
in the next chapter.</p>

<div class="doc_code">
<pre>
ready&gt; <b>def foo(a b) a*a + 2*a*b + b*b;</b>
Read function definition:
define double @foo(double %a, double %b) {
entry:
        %multmp = fmul double %a, %a
        %multmp1 = fmul double 2.000000e+00, %a
        %multmp2 = fmul double %multmp1, %b
        %addtmp = fadd double %multmp, %multmp2
        %multmp3 = fmul double %b, %b
        %addtmp4 = fadd double %addtmp, %multmp3
        ret double %addtmp4
}
</pre>
</div>

<p>This shows some simple arithmetic. Notice the striking similarity to the
LLVM builder calls that we use to create the instructions.</p>

<div class="doc_code">
<pre>
ready&gt; <b>def bar(a) foo(a, 4.0) + bar(31337);</b>
Read function definition:
define double @bar(double %a) {
entry:
        %calltmp = call double @foo(double %a, double 4.000000e+00)
        %calltmp1 = call double @bar(double 3.133700e+04)
        %addtmp = fadd double %calltmp, %calltmp1
        ret double %addtmp
}
</pre>
</div>

<p>This shows some function calls.  Note that this function will take a long
time to execute if you call it.  In the future we'll add conditional control
flow to actually make recursion useful :).</p>

<div class="doc_code">
<pre>
ready&gt; <b>extern cos(x);</b>
Read extern:
declare double @cos(double)

ready&gt; <b>cos(1.234);</b>
Read top-level expression:
define double @""() {
entry:
        %calltmp = call double @cos(double 1.234000e+00)
        ret double %calltmp
}
</pre>
</div>

<p>This shows an extern for the libm "cos" function, and a call to it.</p>


<div class="doc_code">
<pre>
ready&gt; <b>^D</b>
; ModuleID = 'my cool jit'

define double @""() {
entry:
        %addtmp = fadd double 4.000000e+00, 5.000000e+00
        ret double %addtmp
}

define double @foo(double %a, double %b) {
entry:
        %multmp = fmul double %a, %a
        %multmp1 = fmul double 2.000000e+00, %a
        %multmp2 = fmul double %multmp1, %b
        %addtmp = fadd double %multmp, %multmp2
        %multmp3 = fmul double %b, %b
        %addtmp4 = fadd double %addtmp, %multmp3
        ret double %addtmp4
}

define double @bar(double %a) {
entry:
        %calltmp = call double @foo(double %a, double 4.000000e+00)
        %calltmp1 = call double @bar(double 3.133700e+04)
        %addtmp = fadd double %calltmp, %calltmp1
        ret double %addtmp
}

declare double @cos(double)

define double @""() {
entry:
        %calltmp = call double @cos(double 1.234000e+00)
        ret double %calltmp
}
</pre>
</div>

<p>When you quit the current demo, it dumps out the IR for the entire module
generated.  Here you can see the big picture with all the functions referencing
each other.</p>

<p>This wraps up the third chapter of the Kaleidoscope tutorial.  Up next, we'll
describe how to <a href="OCamlLangImpl4.html">add JIT codegen and optimizer
support</a> to this so we can actually start running code!</p>

</div>


<!-- *********************************************************************** -->
<h2><a name="code">Full Code Listing</a></h2>
<!-- *********************************************************************** -->

<div>

<p>
Here is the complete code listing for our running example, enhanced with the
LLVM code generator.    Because this uses the LLVM libraries, we need to link
them in.  To do this, we use the <a
href="http://llvm.org/cmds/llvm-config.html">llvm-config</a> tool to inform
our makefile/command line about which options to 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
</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";;

flag ["link"; "ocaml"; "g++"] (S[A"-cc"; A"g++"]);;
</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
</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;]
      | 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

(* 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 *)
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

  | [&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

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 = 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;

        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

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

  (* ignore top-level semicolons. *)
  | Some (Token.Kwd ';') -&gt;
      Stream.junk stream;
      main_loop 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 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";
            dump_value (Codegen.codegen_func e);
        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 stream
</pre>
</dd>

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

open Llvm

let main () =
  (* 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

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

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

main ()
</pre>
</dd>
</dl>

<a href="OCamlLangImpl4.html">Next: Adding JIT and Optimizer Support</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>
