Commit 29ef90e6 authored by Bill Wendling's avatar Bill Wendling
Browse files

Merging r142123:

------------------------------------------------------------------------
r142123 | void | 2011-10-16 01:06:54 -0700 (Sun, 16 Oct 2011) | 4 lines

Update tutorial to reflect the current APIs. Also correct a small omission in
LangImpl6.html (it needed to defined the 'binary :' operator).
PR9052

------------------------------------------------------------------------

llvm-svn: 142124
parent 58de1fdf
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -802,7 +802,7 @@ course.) To build this, just compile with:</p>
<div class="doc_code">
<pre>
# Compile
   g++ -g -O3 toy.cpp 
clang++ -g -O3 toy.cpp
# Run
./a.out 
</pre>
+44 −44
Original line number Diff line number Diff line
@@ -266,7 +266,7 @@ Value *CallExprAST::Codegen() {
    if (ArgsV.back() == 0) return 0;
  }
  
  return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
  return Builder.CreateCall(CalleeF, ArgsV, "calltmp");
}
</pre>
</div>
@@ -308,7 +308,7 @@ bodies and external function declarations. The code starts with:</p>
<pre>
Function *PrototypeAST::Codegen() {
  // Make the function type:  double(double,double) etc.
  std::vector&lt;const Type*&gt; Doubles(Args.size(),
  std::vector&lt;Type*&gt; Doubles(Args.size(),
                             Type::getDoubleTy(getGlobalContext()));
  FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
                                       Doubles, false);
@@ -532,7 +532,7 @@ functions. For example:
<pre>
ready> <b>4+5</b>;
Read top-level expression:
define double @""() {
define double @0() {
entry:
  ret double 9.000000e+00
}
@@ -593,7 +593,7 @@ declare double @cos(double)

ready&gt; <b>cos(1.234);</b>
Read top-level expression:
define double @""() {
define double @1() {
entry:
  %calltmp = call double @cos(double 1.234000e+00)
  ret double %calltmp
@@ -609,7 +609,7 @@ entry:
ready&gt; <b>^D</b>
; ModuleID = 'my cool jit'

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

declare double @cos(double)

define double @""() {
define double @1() {
entry:
  %calltmp = call double @cos(double 1.234000e+00)
  ret double %calltmp
@@ -671,7 +671,7 @@ our makefile/command line about which options to use:</p>
<div class="doc_code">
<pre>
# Compile
   g++ -g -O3 toy.cpp `llvm-config --cppflags --ldflags --libs core` -o toy
clang++ -g -O3 toy.cpp `llvm-config --cppflags --ldflags --libs core` -o toy
# Run
./toy
</pre>
@@ -1081,12 +1081,12 @@ Value *CallExprAST::Codegen() {
    if (ArgsV.back() == 0) return 0;
  }
  
  return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
  return Builder.CreateCall(CalleeF, ArgsV, "calltmp");
}

Function *PrototypeAST::Codegen() {
  // Make the function type:  double(double,double) etc.
  std::vector&lt;const Type*&gt; Doubles(Args.size(),
  std::vector&lt;Type*&gt; Doubles(Args.size(),
                             Type::getDoubleTy(getGlobalContext()));
  FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
                                       Doubles, false);
+41 −23
Original line number Diff line number Diff line
@@ -343,7 +343,8 @@ code that is statically linked into your application.</p>
<div class="doc_code">
<pre>
ready&gt; <b>4+5;</b>
define double @""() {
Read top-level expression:
define double @0() {
entry:
  ret double 9.000000e+00
}
@@ -369,7 +370,8 @@ entry:
}

ready&gt; <b>testfunc(4, 10);</b>
define double @""() {
Read top-level expression:
define double @1() {
entry:
  %calltmp = call double @testfunc(double 4.000000e+00, double 1.000000e+01)
  ret double %calltmp
@@ -404,6 +406,12 @@ Read extern:
declare double @cos(double)

ready&gt; <b>sin(1.0);</b>
Read top-level expression:
define double @2() {
entry:
  ret double 0x3FEAED548F090CEE
}

<em>Evaluated to 0.841471</em>

ready&gt; <b>def foo(x) sin(x)*sin(x) + cos(x)*cos(x);</b>
@@ -419,6 +427,13 @@ entry:
}

ready&gt; <b>foo(4.0);</b>
Read top-level expression:
define double @3() {
entry:
  %calltmp = call double @foo(double 4.000000e+00)
  ret double %calltmp
}

<em>Evaluated to 1.000000</em>
</pre>
</div>
@@ -485,7 +500,7 @@ LLVM JIT and optimizer. To build this example, use:
<div class="doc_code">
<pre>
# Compile
   g++ -g toy.cpp `llvm-config --cppflags --ldflags --libs core jit native` -O3 -o toy
clang++ -g toy.cpp `llvm-config --cppflags --ldflags --libs core jit native` -O3 -o toy
# Run
./toy
</pre>
@@ -509,9 +524,9 @@ at runtime.</p>
#include "llvm/Analysis/Verifier.h"
#include "llvm/Analysis/Passes.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetSelect.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Support/IRBuilder.h"
#include "llvm/Support/TargetSelect.h"
#include &lt;cstdio&gt;
#include &lt;string&gt;
#include &lt;map&gt;
@@ -905,12 +920,12 @@ Value *CallExprAST::Codegen() {
    if (ArgsV.back() == 0) return 0;
  }
  
  return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
  return Builder.CreateCall(CalleeF, ArgsV, "calltmp");
}

Function *PrototypeAST::Codegen() {
  // Make the function type:  double(double,double) etc.
  std::vector&lt;const Type*&gt; Doubles(Args.size(),
  std::vector&lt;Type*&gt; Doubles(Args.size(),
                             Type::getDoubleTy(getGlobalContext()));
  FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
                                       Doubles, false);
@@ -1013,6 +1028,9 @@ static void HandleTopLevelExpression() {
  // Evaluate a top-level expression into an anonymous function.
  if (FunctionAST *F = ParseTopLevelExpr()) {
    if (Function *LF = F-&gt;Codegen()) {
      fprintf(stderr, "Read top-level expression:");
      LF->dump();

      // JIT the function, returning a function pointer.
      void *FPtr = TheExecutionEngine-&gt;getPointerToFunction(LF);
      
+36 −35
Original line number Diff line number Diff line
@@ -829,10 +829,11 @@ statement.</p>
</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>
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>
@@ -881,7 +882,7 @@ if/then/else and for expressions.. To build this example, use:
<div class="doc_code">
<pre>
# Compile
   g++ -g toy.cpp `llvm-config --cppflags --ldflags --libs core jit native` -O3 -o toy
clang++ -g toy.cpp `llvm-config --cppflags --ldflags --libs core jit native` -O3 -o toy
# Run
./toy
</pre>
@@ -900,9 +901,9 @@ if/then/else and for expressions.. To build this example, use:
#include "llvm/Analysis/Verifier.h"
#include "llvm/Analysis/Passes.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetSelect.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Support/IRBuilder.h"
#include "llvm/Support/TargetSelect.h"
#include &lt;cstdio&gt;
#include &lt;string&gt;
#include &lt;map&gt;
@@ -1397,7 +1398,7 @@ Value *CallExprAST::Codegen() {
    if (ArgsV.back() == 0) return 0;
  }
  
  return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
  return Builder.CreateCall(CalleeF, ArgsV, "calltmp");
}

Value *IfExprAST::Codegen() {
@@ -1546,7 +1547,7 @@ Value *ForExprAST::Codegen() {

Function *PrototypeAST::Codegen() {
  // Make the function type:  double(double,double) etc.
  std::vector&lt;const Type*&gt; Doubles(Args.size(),
  std::vector&lt;Type*&gt; Doubles(Args.size(),
                             Type::getDoubleTy(getGlobalContext()));
  FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
                                       Doubles, false);
+33 −27
Original line number Diff line number Diff line
@@ -293,8 +293,8 @@ Value *BinaryExprAST::Codegen() {
  Function *F = TheModule-&gt;getFunction(std::string("binary")+Op);
  assert(F &amp;&amp; "binary operator not found!");
  
  Value *Ops[] = { L, R };
  return Builder.CreateCall(F, Ops, Ops+2, "binop");</b>
  Value *Ops[2] = { L, R };
  return Builder.CreateCall(F, Ops, "binop");</b>
}

</pre>
@@ -505,7 +505,9 @@ defined to print out the specified value and a newline):</p>
<div class="doc_code">
<pre>
ready&gt; <b>extern printd(x);</b>
Read extern: declare double @printd(double)
Read extern:
declare double @printd(double)

ready&gt; <b>def binary : 1 (x y) 0;  # Low-precedence operator that ignores operands.</b>
..
ready&gt; <b>printd(123) : printd(456) : printd(789);</b>
@@ -555,6 +557,9 @@ def binary&amp; 6 (LHS RHS)
def binary = 9 (LHS RHS)
  !(LHS &lt; RHS | LHS &gt; RHS);

# Define ':' for sequencing: as a low-precedence operator that ignores operands
# and just returns the RHS.
def binary : 1 (x y) y;
</pre>
</div>

@@ -580,8 +585,9 @@ def printdensity(d)
    putchard(42); # '*'</b>
...
ready&gt; <b>printdensity(1): printdensity(2): printdensity(3):
          printdensity(4): printdensity(5): printdensity(9): putchard(10);</b>
*++.. 
       printdensity(4): printdensity(5): printdensity(9):
       putchard(10);</b>
**++.
Evaluated to 0.000000
</pre>
</div>
@@ -593,7 +599,7 @@ converge:</p>

<div class="doc_code">
<pre>
# determine whether the specific location diverges.
# Determine whether the specific location diverges.
# Solve for z = z^2 + c in the complex plane.
def mandleconverger(real imag iters creal cimag)
  if iters &gt; 255 | (real*real + imag*imag &gt; 4) then
@@ -603,25 +609,25 @@ def mandleconverger(real imag iters creal cimag)
                    2*real*imag + cimag,
                    iters+1, creal, cimag);

# return the number of iterations required for the iteration to escape
# Return the number of iterations required for the iteration to escape
def mandleconverge(real imag)
  mandleconverger(real, imag, 0, real, imag);
</pre>
</div>

<p>This "z = z<sup>2</sup> + c" function is a beautiful little creature that is the basis
for computation of the <a 
href="http://en.wikipedia.org/wiki/Mandelbrot_set">Mandelbrot Set</a>.  Our
<tt>mandelconverge</tt> function returns the number of iterations that it takes
for a complex orbit to escape, saturating to 255.  This is not a very useful
function by itself, but if you plot its value over a two-dimensional plane,
you can see the Mandelbrot set.  Given that we are limited to using putchard
here, our amazing graphical output is limited, but we can whip together
<p>This "<code>z = z<sup>2</sup> + c</code>" function is a beautiful little
creature that is the basis for computation of
the <a href="http://en.wikipedia.org/wiki/Mandelbrot_set">Mandelbrot Set</a>.
Our <tt>mandelconverge</tt> function returns the number of iterations that it
takes for a complex orbit to escape, saturating to 255.  This is not a very
useful function by itself, but if you plot its value over a two-dimensional
plane, you can see the Mandelbrot set.  Given that we are limited to using
putchard here, our amazing graphical output is limited, but we can whip together
something using the density plotter above:</p>

<div class="doc_code">
<pre>
# compute and plot the mandlebrot set with the specified 2 dimensional range
# Compute and plot the mandlebrot set with the specified 2 dimensional range
# info.
def mandelhelp(xmin xmax xstep   ymin ymax ystep)
  for y = ymin, y &lt; ymax, ystep in (
@@ -809,7 +815,7 @@ if/then/else and for expressions.. To build this example, use:
<div class="doc_code">
<pre>
# Compile
   g++ -g toy.cpp `llvm-config --cppflags --ldflags --libs core jit native` -O3 -o toy
clang++ -g toy.cpp `llvm-config --cppflags --ldflags --libs core jit native` -O3 -o toy
# Run
./toy
</pre>
@@ -834,9 +840,9 @@ library, although doing that will cause problems on Windows.</p>
#include "llvm/Analysis/Verifier.h"
#include "llvm/Analysis/Passes.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetSelect.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Support/IRBuilder.h"
#include "llvm/Support/TargetSelect.h"
#include &lt;cstdio&gt;
#include &lt;string&gt;
#include &lt;map&gt;
@@ -1415,8 +1421,8 @@ Value *BinaryExprAST::Codegen() {
  Function *F = TheModule-&gt;getFunction(std::string("binary")+Op);
  assert(F &amp;&amp; "binary operator not found!");
  
  Value *Ops[] = { L, R };
  return Builder.CreateCall(F, Ops, Ops+2, "binop");
  Value *Ops[2] = { L, R };
  return Builder.CreateCall(F, Ops, "binop");
}

Value *CallExprAST::Codegen() {
@@ -1435,7 +1441,7 @@ Value *CallExprAST::Codegen() {
    if (ArgsV.back() == 0) return 0;
  }
  
  return Builder.CreateCall(CalleeF, ArgsV.begin(), ArgsV.end(), "calltmp");
  return Builder.CreateCall(CalleeF, ArgsV, "calltmp");
}

Value *IfExprAST::Codegen() {
@@ -1584,7 +1590,7 @@ Value *ForExprAST::Codegen() {

Function *PrototypeAST::Codegen() {
  // Make the function type:  double(double,double) etc.
  std::vector&lt;const Type*&gt; Doubles(Args.size(),
  std::vector&lt;Type*&gt; Doubles(Args.size(),
                             Type::getDoubleTy(getGlobalContext()));
  FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),
                                       Doubles, false);
Loading