• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1==============================================
2Kaleidoscope: Adding JIT and Optimizer Support
3==============================================
4
5.. contents::
6   :local:
7
8Chapter 4 Introduction
9======================
10
11Welcome to Chapter 4 of the "`Implementing a language with
12LLVM <index.html>`_" tutorial. Chapters 1-3 described the implementation
13of a simple language and added support for generating LLVM IR. This
14chapter describes two new techniques: adding optimizer support to your
15language, and adding JIT compiler support. These additions will
16demonstrate how to get nice, efficient code for the Kaleidoscope
17language.
18
19Trivial Constant Folding
20========================
21
22Our demonstration for Chapter 3 is elegant and easy to extend.
23Unfortunately, it does not produce wonderful code. The IRBuilder,
24however, does give us obvious optimizations when compiling simple code:
25
26::
27
28    ready> def test(x) 1+2+x;
29    Read function definition:
30    define double @test(double %x) {
31    entry:
32            %addtmp = fadd double 3.000000e+00, %x
33            ret double %addtmp
34    }
35
36This code is not a literal transcription of the AST built by parsing the
37input. That would be:
38
39::
40
41    ready> def test(x) 1+2+x;
42    Read function definition:
43    define double @test(double %x) {
44    entry:
45            %addtmp = fadd double 2.000000e+00, 1.000000e+00
46            %addtmp1 = fadd double %addtmp, %x
47            ret double %addtmp1
48    }
49
50Constant folding, as seen above, in particular, is a very common and
51very important optimization: so much so that many language implementors
52implement constant folding support in their AST representation.
53
54With LLVM, you don't need this support in the AST. Since all calls to
55build LLVM IR go through the LLVM IR builder, the builder itself checked
56to see if there was a constant folding opportunity when you call it. If
57so, it just does the constant fold and return the constant instead of
58creating an instruction.
59
60Well, that was easy :). In practice, we recommend always using
61``IRBuilder`` when generating code like this. It has no "syntactic
62overhead" for its use (you don't have to uglify your compiler with
63constant checks everywhere) and it can dramatically reduce the amount of
64LLVM IR that is generated in some cases (particular for languages with a
65macro preprocessor or that use a lot of constants).
66
67On the other hand, the ``IRBuilder`` is limited by the fact that it does
68all of its analysis inline with the code as it is built. If you take a
69slightly more complex example:
70
71::
72
73    ready> def test(x) (1+2+x)*(x+(1+2));
74    ready> Read function definition:
75    define double @test(double %x) {
76    entry:
77            %addtmp = fadd double 3.000000e+00, %x
78            %addtmp1 = fadd double %x, 3.000000e+00
79            %multmp = fmul double %addtmp, %addtmp1
80            ret double %multmp
81    }
82
83In this case, the LHS and RHS of the multiplication are the same value.
84We'd really like to see this generate "``tmp = x+3; result = tmp*tmp;``"
85instead of computing "``x+3``" twice.
86
87Unfortunately, no amount of local analysis will be able to detect and
88correct this. This requires two transformations: reassociation of
89expressions (to make the add's lexically identical) and Common
90Subexpression Elimination (CSE) to delete the redundant add instruction.
91Fortunately, LLVM provides a broad range of optimizations that you can
92use, in the form of "passes".
93
94LLVM Optimization Passes
95========================
96
97LLVM provides many optimization passes, which do many different sorts of
98things and have different tradeoffs. Unlike other systems, LLVM doesn't
99hold to the mistaken notion that one set of optimizations is right for
100all languages and for all situations. LLVM allows a compiler implementor
101to make complete decisions about what optimizations to use, in which
102order, and in what situation.
103
104As a concrete example, LLVM supports both "whole module" passes, which
105look across as large of body of code as they can (often a whole file,
106but if run at link time, this can be a substantial portion of the whole
107program). It also supports and includes "per-function" passes which just
108operate on a single function at a time, without looking at other
109functions. For more information on passes and how they are run, see the
110`How to Write a Pass <../WritingAnLLVMPass.html>`_ document and the
111`List of LLVM Passes <../Passes.html>`_.
112
113For Kaleidoscope, we are currently generating functions on the fly, one
114at a time, as the user types them in. We aren't shooting for the
115ultimate optimization experience in this setting, but we also want to
116catch the easy and quick stuff where possible. As such, we will choose
117to run a few per-function optimizations as the user types the function
118in. If we wanted to make a "static Kaleidoscope compiler", we would use
119exactly the code we have now, except that we would defer running the
120optimizer until the entire file has been parsed.
121
122In order to get per-function optimizations going, we need to set up a
123`FunctionPassManager <../WritingAnLLVMPass.html#passmanager>`_ to hold
124and organize the LLVM optimizations that we want to run. Once we have
125that, we can add a set of optimizations to run. The code looks like
126this:
127
128.. code-block:: c++
129
130      FunctionPassManager OurFPM(TheModule);
131
132      // Set up the optimizer pipeline.  Start with registering info about how the
133      // target lays out data structures.
134      OurFPM.add(new DataLayout(*TheExecutionEngine->getDataLayout()));
135      // Provide basic AliasAnalysis support for GVN.
136      OurFPM.add(createBasicAliasAnalysisPass());
137      // Do simple "peephole" optimizations and bit-twiddling optzns.
138      OurFPM.add(createInstructionCombiningPass());
139      // Reassociate expressions.
140      OurFPM.add(createReassociatePass());
141      // Eliminate Common SubExpressions.
142      OurFPM.add(createGVNPass());
143      // Simplify the control flow graph (deleting unreachable blocks, etc).
144      OurFPM.add(createCFGSimplificationPass());
145
146      OurFPM.doInitialization();
147
148      // Set the global so the code gen can use this.
149      TheFPM = &OurFPM;
150
151      // Run the main "interpreter loop" now.
152      MainLoop();
153
154This code defines a ``FunctionPassManager``, "``OurFPM``". It requires a
155pointer to the ``Module`` to construct itself. Once it is set up, we use
156a series of "add" calls to add a bunch of LLVM passes. The first pass is
157basically boilerplate, it adds a pass so that later optimizations know
158how the data structures in the program are laid out. The
159"``TheExecutionEngine``" variable is related to the JIT, which we will
160get to in the next section.
161
162In this case, we choose to add 4 optimization passes. The passes we
163chose here are a pretty standard set of "cleanup" optimizations that are
164useful for a wide variety of code. I won't delve into what they do but,
165believe me, they are a good starting place :).
166
167Once the PassManager is set up, we need to make use of it. We do this by
168running it after our newly created function is constructed (in
169``FunctionAST::Codegen``), but before it is returned to the client:
170
171.. code-block:: c++
172
173      if (Value *RetVal = Body->Codegen()) {
174        // Finish off the function.
175        Builder.CreateRet(RetVal);
176
177        // Validate the generated code, checking for consistency.
178        verifyFunction(*TheFunction);
179
180        // Optimize the function.
181        TheFPM->run(*TheFunction);
182
183        return TheFunction;
184      }
185
186As you can see, this is pretty straightforward. The
187``FunctionPassManager`` optimizes and updates the LLVM Function\* in
188place, improving (hopefully) its body. With this in place, we can try
189our test above again:
190
191::
192
193    ready> def test(x) (1+2+x)*(x+(1+2));
194    ready> Read function definition:
195    define double @test(double %x) {
196    entry:
197            %addtmp = fadd double %x, 3.000000e+00
198            %multmp = fmul double %addtmp, %addtmp
199            ret double %multmp
200    }
201
202As expected, we now get our nicely optimized code, saving a floating
203point add instruction from every execution of this function.
204
205LLVM provides a wide variety of optimizations that can be used in
206certain circumstances. Some `documentation about the various
207passes <../Passes.html>`_ is available, but it isn't very complete.
208Another good source of ideas can come from looking at the passes that
209``Clang`` runs to get started. The "``opt``" tool allows you to
210experiment with passes from the command line, so you can see if they do
211anything.
212
213Now that we have reasonable code coming out of our front-end, lets talk
214about executing it!
215
216Adding a JIT Compiler
217=====================
218
219Code that is available in LLVM IR can have a wide variety of tools
220applied to it. For example, you can run optimizations on it (as we did
221above), you can dump it out in textual or binary forms, you can compile
222the code to an assembly file (.s) for some target, or you can JIT
223compile it. The nice thing about the LLVM IR representation is that it
224is the "common currency" between many different parts of the compiler.
225
226In this section, we'll add JIT compiler support to our interpreter. The
227basic idea that we want for Kaleidoscope is to have the user enter
228function bodies as they do now, but immediately evaluate the top-level
229expressions they type in. For example, if they type in "1 + 2;", we
230should evaluate and print out 3. If they define a function, they should
231be able to call it from the command line.
232
233In order to do this, we first declare and initialize the JIT. This is
234done by adding a global variable and a call in ``main``:
235
236.. code-block:: c++
237
238    static ExecutionEngine *TheExecutionEngine;
239    ...
240    int main() {
241      ..
242      // Create the JIT.  This takes ownership of the module.
243      TheExecutionEngine = EngineBuilder(TheModule).create();
244      ..
245    }
246
247This creates an abstract "Execution Engine" which can be either a JIT
248compiler or the LLVM interpreter. LLVM will automatically pick a JIT
249compiler for you if one is available for your platform, otherwise it
250will fall back to the interpreter.
251
252Once the ``ExecutionEngine`` is created, the JIT is ready to be used.
253There are a variety of APIs that are useful, but the simplest one is the
254"``getPointerToFunction(F)``" method. This method JIT compiles the
255specified LLVM Function and returns a function pointer to the generated
256machine code. In our case, this means that we can change the code that
257parses a top-level expression to look like this:
258
259.. code-block:: c++
260
261    static void HandleTopLevelExpression() {
262      // Evaluate a top-level expression into an anonymous function.
263      if (FunctionAST *F = ParseTopLevelExpr()) {
264        if (Function *LF = F->Codegen()) {
265          LF->dump();  // Dump the function for exposition purposes.
266
267          // JIT the function, returning a function pointer.
268          void *FPtr = TheExecutionEngine->getPointerToFunction(LF);
269
270          // Cast it to the right type (takes no arguments, returns a double) so we
271          // can call it as a native function.
272          double (*FP)() = (double (*)())(intptr_t)FPtr;
273          fprintf(stderr, "Evaluated to %f\n", FP());
274        }
275
276Recall that we compile top-level expressions into a self-contained LLVM
277function that takes no arguments and returns the computed double.
278Because the LLVM JIT compiler matches the native platform ABI, this
279means that you can just cast the result pointer to a function pointer of
280that type and call it directly. This means, there is no difference
281between JIT compiled code and native machine code that is statically
282linked into your application.
283
284With just these two changes, lets see how Kaleidoscope works now!
285
286::
287
288    ready> 4+5;
289    Read top-level expression:
290    define double @0() {
291    entry:
292      ret double 9.000000e+00
293    }
294
295    Evaluated to 9.000000
296
297Well this looks like it is basically working. The dump of the function
298shows the "no argument function that always returns double" that we
299synthesize for each top-level expression that is typed in. This
300demonstrates very basic functionality, but can we do more?
301
302::
303
304    ready> def testfunc(x y) x + y*2;
305    Read function definition:
306    define double @testfunc(double %x, double %y) {
307    entry:
308      %multmp = fmul double %y, 2.000000e+00
309      %addtmp = fadd double %multmp, %x
310      ret double %addtmp
311    }
312
313    ready> testfunc(4, 10);
314    Read top-level expression:
315    define double @1() {
316    entry:
317      %calltmp = call double @testfunc(double 4.000000e+00, double 1.000000e+01)
318      ret double %calltmp
319    }
320
321    Evaluated to 24.000000
322
323This illustrates that we can now call user code, but there is something
324a bit subtle going on here. Note that we only invoke the JIT on the
325anonymous functions that *call testfunc*, but we never invoked it on
326*testfunc* itself. What actually happened here is that the JIT scanned
327for all non-JIT'd functions transitively called from the anonymous
328function and compiled all of them before returning from
329``getPointerToFunction()``.
330
331The JIT provides a number of other more advanced interfaces for things
332like freeing allocated machine code, rejit'ing functions to update them,
333etc. However, even with this simple code, we get some surprisingly
334powerful capabilities - check this out (I removed the dump of the
335anonymous functions, you should get the idea by now :) :
336
337::
338
339    ready> extern sin(x);
340    Read extern:
341    declare double @sin(double)
342
343    ready> extern cos(x);
344    Read extern:
345    declare double @cos(double)
346
347    ready> sin(1.0);
348    Read top-level expression:
349    define double @2() {
350    entry:
351      ret double 0x3FEAED548F090CEE
352    }
353
354    Evaluated to 0.841471
355
356    ready> def foo(x) sin(x)*sin(x) + cos(x)*cos(x);
357    Read function definition:
358    define double @foo(double %x) {
359    entry:
360      %calltmp = call double @sin(double %x)
361      %multmp = fmul double %calltmp, %calltmp
362      %calltmp2 = call double @cos(double %x)
363      %multmp4 = fmul double %calltmp2, %calltmp2
364      %addtmp = fadd double %multmp, %multmp4
365      ret double %addtmp
366    }
367
368    ready> foo(4.0);
369    Read top-level expression:
370    define double @3() {
371    entry:
372      %calltmp = call double @foo(double 4.000000e+00)
373      ret double %calltmp
374    }
375
376    Evaluated to 1.000000
377
378Whoa, how does the JIT know about sin and cos? The answer is
379surprisingly simple: in this example, the JIT started execution of a
380function and got to a function call. It realized that the function was
381not yet JIT compiled and invoked the standard set of routines to resolve
382the function. In this case, there is no body defined for the function,
383so the JIT ended up calling "``dlsym("sin")``" on the Kaleidoscope
384process itself. Since "``sin``" is defined within the JIT's address
385space, it simply patches up calls in the module to call the libm version
386of ``sin`` directly.
387
388The LLVM JIT provides a number of interfaces (look in the
389``ExecutionEngine.h`` file) for controlling how unknown functions get
390resolved. It allows you to establish explicit mappings between IR
391objects and addresses (useful for LLVM global variables that you want to
392map to static tables, for example), allows you to dynamically decide on
393the fly based on the function name, and even allows you to have the JIT
394compile functions lazily the first time they're called.
395
396One interesting application of this is that we can now extend the
397language by writing arbitrary C++ code to implement operations. For
398example, if we add:
399
400.. code-block:: c++
401
402    /// putchard - putchar that takes a double and returns 0.
403    extern "C"
404    double putchard(double X) {
405      putchar((char)X);
406      return 0;
407    }
408
409Now we can produce simple output to the console by using things like:
410"``extern putchard(x); putchard(120);``", which prints a lowercase 'x'
411on the console (120 is the ASCII code for 'x'). Similar code could be
412used to implement file I/O, console input, and many other capabilities
413in Kaleidoscope.
414
415This completes the JIT and optimizer chapter of the Kaleidoscope
416tutorial. At this point, we can compile a non-Turing-complete
417programming language, optimize and JIT compile it in a user-driven way.
418Next up we'll look into `extending the language with control flow
419constructs <LangImpl5.html>`_, tackling some interesting LLVM IR issues
420along the way.
421
422Full Code Listing
423=================
424
425Here is the complete code listing for our running example, enhanced with
426the LLVM JIT and optimizer. To build this example, use:
427
428.. code-block:: bash
429
430    # Compile
431    clang++ -g toy.cpp `llvm-config --cppflags --ldflags --libs core jit native` -O3 -o toy
432    # Run
433    ./toy
434
435If you are compiling this on Linux, make sure to add the "-rdynamic"
436option as well. This makes sure that the external functions are resolved
437properly at runtime.
438
439Here is the code:
440
441.. code-block:: c++
442
443    #include "llvm/DerivedTypes.h"
444    #include "llvm/ExecutionEngine/ExecutionEngine.h"
445    #include "llvm/ExecutionEngine/JIT.h"
446    #include "llvm/IRBuilder.h"
447    #include "llvm/LLVMContext.h"
448    #include "llvm/Module.h"
449    #include "llvm/PassManager.h"
450    #include "llvm/Analysis/Verifier.h"
451    #include "llvm/Analysis/Passes.h"
452    #include "llvm/DataLayout.h"
453    #include "llvm/Transforms/Scalar.h"
454    #include "llvm/Support/TargetSelect.h"
455    #include <cstdio>
456    #include <string>
457    #include <map>
458    #include <vector>
459    using namespace llvm;
460
461    //===----------------------------------------------------------------------===//
462    // Lexer
463    //===----------------------------------------------------------------------===//
464
465    // The lexer returns tokens [0-255] if it is an unknown character, otherwise one
466    // of these for known things.
467    enum Token {
468      tok_eof = -1,
469
470      // commands
471      tok_def = -2, tok_extern = -3,
472
473      // primary
474      tok_identifier = -4, tok_number = -5
475    };
476
477    static std::string IdentifierStr;  // Filled in if tok_identifier
478    static double NumVal;              // Filled in if tok_number
479
480    /// gettok - Return the next token from standard input.
481    static int gettok() {
482      static int LastChar = ' ';
483
484      // Skip any whitespace.
485      while (isspace(LastChar))
486        LastChar = getchar();
487
488      if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*
489        IdentifierStr = LastChar;
490        while (isalnum((LastChar = getchar())))
491          IdentifierStr += LastChar;
492
493        if (IdentifierStr == "def") return tok_def;
494        if (IdentifierStr == "extern") return tok_extern;
495        return tok_identifier;
496      }
497
498      if (isdigit(LastChar) || LastChar == '.') {   // Number: [0-9.]+
499        std::string NumStr;
500        do {
501          NumStr += LastChar;
502          LastChar = getchar();
503        } while (isdigit(LastChar) || LastChar == '.');
504
505        NumVal = strtod(NumStr.c_str(), 0);
506        return tok_number;
507      }
508
509      if (LastChar == '#') {
510        // Comment until end of line.
511        do LastChar = getchar();
512        while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
513
514        if (LastChar != EOF)
515          return gettok();
516      }
517
518      // Check for end of file.  Don't eat the EOF.
519      if (LastChar == EOF)
520        return tok_eof;
521
522      // Otherwise, just return the character as its ascii value.
523      int ThisChar = LastChar;
524      LastChar = getchar();
525      return ThisChar;
526    }
527
528    //===----------------------------------------------------------------------===//
529    // Abstract Syntax Tree (aka Parse Tree)
530    //===----------------------------------------------------------------------===//
531
532    /// ExprAST - Base class for all expression nodes.
533    class ExprAST {
534    public:
535      virtual ~ExprAST() {}
536      virtual Value *Codegen() = 0;
537    };
538
539    /// NumberExprAST - Expression class for numeric literals like "1.0".
540    class NumberExprAST : public ExprAST {
541      double Val;
542    public:
543      NumberExprAST(double val) : Val(val) {}
544      virtual Value *Codegen();
545    };
546
547    /// VariableExprAST - Expression class for referencing a variable, like "a".
548    class VariableExprAST : public ExprAST {
549      std::string Name;
550    public:
551      VariableExprAST(const std::string &name) : Name(name) {}
552      virtual Value *Codegen();
553    };
554
555    /// BinaryExprAST - Expression class for a binary operator.
556    class BinaryExprAST : public ExprAST {
557      char Op;
558      ExprAST *LHS, *RHS;
559    public:
560      BinaryExprAST(char op, ExprAST *lhs, ExprAST *rhs)
561        : Op(op), LHS(lhs), RHS(rhs) {}
562      virtual Value *Codegen();
563    };
564
565    /// CallExprAST - Expression class for function calls.
566    class CallExprAST : public ExprAST {
567      std::string Callee;
568      std::vector<ExprAST*> Args;
569    public:
570      CallExprAST(const std::string &callee, std::vector<ExprAST*> &args)
571        : Callee(callee), Args(args) {}
572      virtual Value *Codegen();
573    };
574
575    /// PrototypeAST - This class represents the "prototype" for a function,
576    /// which captures its name, and its argument names (thus implicitly the number
577    /// of arguments the function takes).
578    class PrototypeAST {
579      std::string Name;
580      std::vector<std::string> Args;
581    public:
582      PrototypeAST(const std::string &name, const std::vector<std::string> &args)
583        : Name(name), Args(args) {}
584
585      Function *Codegen();
586    };
587
588    /// FunctionAST - This class represents a function definition itself.
589    class FunctionAST {
590      PrototypeAST *Proto;
591      ExprAST *Body;
592    public:
593      FunctionAST(PrototypeAST *proto, ExprAST *body)
594        : Proto(proto), Body(body) {}
595
596      Function *Codegen();
597    };
598
599    //===----------------------------------------------------------------------===//
600    // Parser
601    //===----------------------------------------------------------------------===//
602
603    /// CurTok/getNextToken - Provide a simple token buffer.  CurTok is the current
604    /// token the parser is looking at.  getNextToken reads another token from the
605    /// lexer and updates CurTok with its results.
606    static int CurTok;
607    static int getNextToken() {
608      return CurTok = gettok();
609    }
610
611    /// BinopPrecedence - This holds the precedence for each binary operator that is
612    /// defined.
613    static std::map<char, int> BinopPrecedence;
614
615    /// GetTokPrecedence - Get the precedence of the pending binary operator token.
616    static int GetTokPrecedence() {
617      if (!isascii(CurTok))
618        return -1;
619
620      // Make sure it's a declared binop.
621      int TokPrec = BinopPrecedence[CurTok];
622      if (TokPrec <= 0) return -1;
623      return TokPrec;
624    }
625
626    /// Error* - These are little helper functions for error handling.
627    ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
628    PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
629    FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }
630
631    static ExprAST *ParseExpression();
632
633    /// identifierexpr
634    ///   ::= identifier
635    ///   ::= identifier '(' expression* ')'
636    static ExprAST *ParseIdentifierExpr() {
637      std::string IdName = IdentifierStr;
638
639      getNextToken();  // eat identifier.
640
641      if (CurTok != '(') // Simple variable ref.
642        return new VariableExprAST(IdName);
643
644      // Call.
645      getNextToken();  // eat (
646      std::vector<ExprAST*> Args;
647      if (CurTok != ')') {
648        while (1) {
649          ExprAST *Arg = ParseExpression();
650          if (!Arg) return 0;
651          Args.push_back(Arg);
652
653          if (CurTok == ')') break;
654
655          if (CurTok != ',')
656            return Error("Expected ')' or ',' in argument list");
657          getNextToken();
658        }
659      }
660
661      // Eat the ')'.
662      getNextToken();
663
664      return new CallExprAST(IdName, Args);
665    }
666
667    /// numberexpr ::= number
668    static ExprAST *ParseNumberExpr() {
669      ExprAST *Result = new NumberExprAST(NumVal);
670      getNextToken(); // consume the number
671      return Result;
672    }
673
674    /// parenexpr ::= '(' expression ')'
675    static ExprAST *ParseParenExpr() {
676      getNextToken();  // eat (.
677      ExprAST *V = ParseExpression();
678      if (!V) return 0;
679
680      if (CurTok != ')')
681        return Error("expected ')'");
682      getNextToken();  // eat ).
683      return V;
684    }
685
686    /// primary
687    ///   ::= identifierexpr
688    ///   ::= numberexpr
689    ///   ::= parenexpr
690    static ExprAST *ParsePrimary() {
691      switch (CurTok) {
692      default: return Error("unknown token when expecting an expression");
693      case tok_identifier: return ParseIdentifierExpr();
694      case tok_number:     return ParseNumberExpr();
695      case '(':            return ParseParenExpr();
696      }
697    }
698
699    /// binoprhs
700    ///   ::= ('+' primary)*
701    static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) {
702      // If this is a binop, find its precedence.
703      while (1) {
704        int TokPrec = GetTokPrecedence();
705
706        // If this is a binop that binds at least as tightly as the current binop,
707        // consume it, otherwise we are done.
708        if (TokPrec < ExprPrec)
709          return LHS;
710
711        // Okay, we know this is a binop.
712        int BinOp = CurTok;
713        getNextToken();  // eat binop
714
715        // Parse the primary expression after the binary operator.
716        ExprAST *RHS = ParsePrimary();
717        if (!RHS) return 0;
718
719        // If BinOp binds less tightly with RHS than the operator after RHS, let
720        // the pending operator take RHS as its LHS.
721        int NextPrec = GetTokPrecedence();
722        if (TokPrec < NextPrec) {
723          RHS = ParseBinOpRHS(TokPrec+1, RHS);
724          if (RHS == 0) return 0;
725        }
726
727        // Merge LHS/RHS.
728        LHS = new BinaryExprAST(BinOp, LHS, RHS);
729      }
730    }
731
732    /// expression
733    ///   ::= primary binoprhs
734    ///
735    static ExprAST *ParseExpression() {
736      ExprAST *LHS = ParsePrimary();
737      if (!LHS) return 0;
738
739      return ParseBinOpRHS(0, LHS);
740    }
741
742    /// prototype
743    ///   ::= id '(' id* ')'
744    static PrototypeAST *ParsePrototype() {
745      if (CurTok != tok_identifier)
746        return ErrorP("Expected function name in prototype");
747
748      std::string FnName = IdentifierStr;
749      getNextToken();
750
751      if (CurTok != '(')
752        return ErrorP("Expected '(' in prototype");
753
754      std::vector<std::string> ArgNames;
755      while (getNextToken() == tok_identifier)
756        ArgNames.push_back(IdentifierStr);
757      if (CurTok != ')')
758        return ErrorP("Expected ')' in prototype");
759
760      // success.
761      getNextToken();  // eat ')'.
762
763      return new PrototypeAST(FnName, ArgNames);
764    }
765
766    /// definition ::= 'def' prototype expression
767    static FunctionAST *ParseDefinition() {
768      getNextToken();  // eat def.
769      PrototypeAST *Proto = ParsePrototype();
770      if (Proto == 0) return 0;
771
772      if (ExprAST *E = ParseExpression())
773        return new FunctionAST(Proto, E);
774      return 0;
775    }
776
777    /// toplevelexpr ::= expression
778    static FunctionAST *ParseTopLevelExpr() {
779      if (ExprAST *E = ParseExpression()) {
780        // Make an anonymous proto.
781        PrototypeAST *Proto = new PrototypeAST("", std::vector<std::string>());
782        return new FunctionAST(Proto, E);
783      }
784      return 0;
785    }
786
787    /// external ::= 'extern' prototype
788    static PrototypeAST *ParseExtern() {
789      getNextToken();  // eat extern.
790      return ParsePrototype();
791    }
792
793    //===----------------------------------------------------------------------===//
794    // Code Generation
795    //===----------------------------------------------------------------------===//
796
797    static Module *TheModule;
798    static IRBuilder<> Builder(getGlobalContext());
799    static std::map<std::string, Value*> NamedValues;
800    static FunctionPassManager *TheFPM;
801
802    Value *ErrorV(const char *Str) { Error(Str); return 0; }
803
804    Value *NumberExprAST::Codegen() {
805      return ConstantFP::get(getGlobalContext(), APFloat(Val));
806    }
807
808    Value *VariableExprAST::Codegen() {
809      // Look this variable up in the function.
810      Value *V = NamedValues[Name];
811      return V ? V : ErrorV("Unknown variable name");
812    }
813
814    Value *BinaryExprAST::Codegen() {
815      Value *L = LHS->Codegen();
816      Value *R = RHS->Codegen();
817      if (L == 0 || R == 0) return 0;
818
819      switch (Op) {
820      case '+': return Builder.CreateFAdd(L, R, "addtmp");
821      case '-': return Builder.CreateFSub(L, R, "subtmp");
822      case '*': return Builder.CreateFMul(L, R, "multmp");
823      case '<':
824        L = Builder.CreateFCmpULT(L, R, "cmptmp");
825        // Convert bool 0/1 to double 0.0 or 1.0
826        return Builder.CreateUIToFP(L, Type::getDoubleTy(getGlobalContext()),
827                                    "booltmp");
828      default: return ErrorV("invalid binary operator");
829      }
830    }
831
832    Value *CallExprAST::Codegen() {
833      // Look up the name in the global module table.
834      Function *CalleeF = TheModule->getFunction(Callee);
835      if (CalleeF == 0)
836        return ErrorV("Unknown function referenced");
837
838      // If argument mismatch error.
839      if (CalleeF->arg_size() != Args.size())
840        return ErrorV("Incorrect # arguments passed");
841
842      std::vector<Value*> ArgsV;
843      for (unsigned i = 0, e = Args.size(); i != e; ++i) {
844        ArgsV.push_back(Args[i]->Codegen());
845        if (ArgsV.back() == 0) return 0;
846      }
847
848      return Builder.CreateCall(CalleeF, ArgsV, "calltmp");
849    }
850
851    Function *PrototypeAST::Codegen() {
852      // Make the function type:  double(double,double) etc.
853      std::vector<Type*> Doubles(Args.size(),
854                                 Type::getDoubleTy(getGlobalContext()));
855      FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
856                                           Doubles, false);
857
858      Function *F = Function::Create(FT, Function::ExternalLinkage, Name, TheModule);
859
860      // If F conflicted, there was already something named 'Name'.  If it has a
861      // body, don't allow redefinition or reextern.
862      if (F->getName() != Name) {
863        // Delete the one we just made and get the existing one.
864        F->eraseFromParent();
865        F = TheModule->getFunction(Name);
866
867        // If F already has a body, reject this.
868        if (!F->empty()) {
869          ErrorF("redefinition of function");
870          return 0;
871        }
872
873        // If F took a different number of args, reject.
874        if (F->arg_size() != Args.size()) {
875          ErrorF("redefinition of function with different # args");
876          return 0;
877        }
878      }
879
880      // Set names for all arguments.
881      unsigned Idx = 0;
882      for (Function::arg_iterator AI = F->arg_begin(); Idx != Args.size();
883           ++AI, ++Idx) {
884        AI->setName(Args[Idx]);
885
886        // Add arguments to variable symbol table.
887        NamedValues[Args[Idx]] = AI;
888      }
889
890      return F;
891    }
892
893    Function *FunctionAST::Codegen() {
894      NamedValues.clear();
895
896      Function *TheFunction = Proto->Codegen();
897      if (TheFunction == 0)
898        return 0;
899
900      // Create a new basic block to start insertion into.
901      BasicBlock *BB = BasicBlock::Create(getGlobalContext(), "entry", TheFunction);
902      Builder.SetInsertPoint(BB);
903
904      if (Value *RetVal = Body->Codegen()) {
905        // Finish off the function.
906        Builder.CreateRet(RetVal);
907
908        // Validate the generated code, checking for consistency.
909        verifyFunction(*TheFunction);
910
911        // Optimize the function.
912        TheFPM->run(*TheFunction);
913
914        return TheFunction;
915      }
916
917      // Error reading body, remove function.
918      TheFunction->eraseFromParent();
919      return 0;
920    }
921
922    //===----------------------------------------------------------------------===//
923    // Top-Level parsing and JIT Driver
924    //===----------------------------------------------------------------------===//
925
926    static ExecutionEngine *TheExecutionEngine;
927
928    static void HandleDefinition() {
929      if (FunctionAST *F = ParseDefinition()) {
930        if (Function *LF = F->Codegen()) {
931          fprintf(stderr, "Read function definition:");
932          LF->dump();
933        }
934      } else {
935        // Skip token for error recovery.
936        getNextToken();
937      }
938    }
939
940    static void HandleExtern() {
941      if (PrototypeAST *P = ParseExtern()) {
942        if (Function *F = P->Codegen()) {
943          fprintf(stderr, "Read extern: ");
944          F->dump();
945        }
946      } else {
947        // Skip token for error recovery.
948        getNextToken();
949      }
950    }
951
952    static void HandleTopLevelExpression() {
953      // Evaluate a top-level expression into an anonymous function.
954      if (FunctionAST *F = ParseTopLevelExpr()) {
955        if (Function *LF = F->Codegen()) {
956          fprintf(stderr, "Read top-level expression:");
957          LF->dump();
958
959          // JIT the function, returning a function pointer.
960          void *FPtr = TheExecutionEngine->getPointerToFunction(LF);
961
962          // Cast it to the right type (takes no arguments, returns a double) so we
963          // can call it as a native function.
964          double (*FP)() = (double (*)())(intptr_t)FPtr;
965          fprintf(stderr, "Evaluated to %f\n", FP());
966        }
967      } else {
968        // Skip token for error recovery.
969        getNextToken();
970      }
971    }
972
973    /// top ::= definition | external | expression | ';'
974    static void MainLoop() {
975      while (1) {
976        fprintf(stderr, "ready> ");
977        switch (CurTok) {
978        case tok_eof:    return;
979        case ';':        getNextToken(); break;  // ignore top-level semicolons.
980        case tok_def:    HandleDefinition(); break;
981        case tok_extern: HandleExtern(); break;
982        default:         HandleTopLevelExpression(); break;
983        }
984      }
985    }
986
987    //===----------------------------------------------------------------------===//
988    // "Library" functions that can be "extern'd" from user code.
989    //===----------------------------------------------------------------------===//
990
991    /// putchard - putchar that takes a double and returns 0.
992    extern "C"
993    double putchard(double X) {
994      putchar((char)X);
995      return 0;
996    }
997
998    //===----------------------------------------------------------------------===//
999    // Main driver code.
1000    //===----------------------------------------------------------------------===//
1001
1002    int main() {
1003      InitializeNativeTarget();
1004      LLVMContext &Context = getGlobalContext();
1005
1006      // Install standard binary operators.
1007      // 1 is lowest precedence.
1008      BinopPrecedence['<'] = 10;
1009      BinopPrecedence['+'] = 20;
1010      BinopPrecedence['-'] = 20;
1011      BinopPrecedence['*'] = 40;  // highest.
1012
1013      // Prime the first token.
1014      fprintf(stderr, "ready> ");
1015      getNextToken();
1016
1017      // Make the module, which holds all the code.
1018      TheModule = new Module("my cool jit", Context);
1019
1020      // Create the JIT.  This takes ownership of the module.
1021      std::string ErrStr;
1022      TheExecutionEngine = EngineBuilder(TheModule).setErrorStr(&ErrStr).create();
1023      if (!TheExecutionEngine) {
1024        fprintf(stderr, "Could not create ExecutionEngine: %s\n", ErrStr.c_str());
1025        exit(1);
1026      }
1027
1028      FunctionPassManager OurFPM(TheModule);
1029
1030      // Set up the optimizer pipeline.  Start with registering info about how the
1031      // target lays out data structures.
1032      OurFPM.add(new DataLayout(*TheExecutionEngine->getDataLayout()));
1033      // Provide basic AliasAnalysis support for GVN.
1034      OurFPM.add(createBasicAliasAnalysisPass());
1035      // Do simple "peephole" optimizations and bit-twiddling optzns.
1036      OurFPM.add(createInstructionCombiningPass());
1037      // Reassociate expressions.
1038      OurFPM.add(createReassociatePass());
1039      // Eliminate Common SubExpressions.
1040      OurFPM.add(createGVNPass());
1041      // Simplify the control flow graph (deleting unreachable blocks, etc).
1042      OurFPM.add(createCFGSimplificationPass());
1043
1044      OurFPM.doInitialization();
1045
1046      // Set the global so the code gen can use this.
1047      TheFPM = &OurFPM;
1048
1049      // Run the main "interpreter loop" now.
1050      MainLoop();
1051
1052      TheFPM = 0;
1053
1054      // Print out all of the generated code.
1055      TheModule->dump();
1056
1057      return 0;
1058    }
1059
1060`Next: Extending the language: control flow <LangImpl5.html>`_
1061
1062