1 //===--- examples/Fibonacci/fibonacci.cpp - An example use of the JIT -----===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This small program provides an example of how to build quickly a small module
11 // with function Fibonacci and execute it with the JIT.
13 // The goal of this snippet is to create in the memory the LLVM module
14 // consisting of one function as follow:
18 // return fib(x-1)+fib(x-2);
21 // Once we have this, we compile the module via JIT, then execute the `fib'
22 // function and return result to a driver, i.e. to a "host program".
24 //===----------------------------------------------------------------------===//
26 #include "llvm/Module.h"
27 #include "llvm/DerivedTypes.h"
28 #include "llvm/Constants.h"
29 #include "llvm/Instructions.h"
30 #include "llvm/ModuleProvider.h"
31 #include "llvm/Analysis/Verifier.h"
32 #include "llvm/ExecutionEngine/JIT.h"
33 #include "llvm/ExecutionEngine/Interpreter.h"
34 #include "llvm/ExecutionEngine/GenericValue.h"
35 #include "llvm/Support/raw_ostream.h"
38 static Function
*CreateFibFunction(Module
*M
) {
39 // Create the fib function and insert it into module M. This function is said
40 // to return an int and take an int parameter.
42 cast
<Function
>(M
->getOrInsertFunction("fib", Type::Int32Ty
, Type::Int32Ty
,
45 // Add a basic block to the function.
46 BasicBlock
*BB
= BasicBlock::Create("EntryBlock", FibF
);
48 // Get pointers to the constants.
49 Value
*One
= ConstantInt::get(Type::Int32Ty
, 1);
50 Value
*Two
= ConstantInt::get(Type::Int32Ty
, 2);
52 // Get pointer to the integer argument of the add1 function...
53 Argument
*ArgX
= FibF
->arg_begin(); // Get the arg.
54 ArgX
->setName("AnArg"); // Give it a nice symbolic name for fun.
56 // Create the true_block.
57 BasicBlock
*RetBB
= BasicBlock::Create("return", FibF
);
58 // Create an exit block.
59 BasicBlock
* RecurseBB
= BasicBlock::Create("recurse", FibF
);
61 // Create the "if (arg <= 2) goto exitbb"
62 Value
*CondInst
= new ICmpInst(ICmpInst::ICMP_SLE
, ArgX
, Two
, "cond", BB
);
63 BranchInst::Create(RetBB
, RecurseBB
, CondInst
, BB
);
66 ReturnInst::Create(One
, RetBB
);
69 Value
*Sub
= BinaryOperator::CreateSub(ArgX
, One
, "arg", RecurseBB
);
70 CallInst
*CallFibX1
= CallInst::Create(FibF
, Sub
, "fibx1", RecurseBB
);
71 CallFibX1
->setTailCall();
74 Sub
= BinaryOperator::CreateSub(ArgX
, Two
, "arg", RecurseBB
);
75 CallInst
*CallFibX2
= CallInst::Create(FibF
, Sub
, "fibx2", RecurseBB
);
76 CallFibX2
->setTailCall();
80 Value
*Sum
= BinaryOperator::CreateAdd(CallFibX1
, CallFibX2
,
81 "addresult", RecurseBB
);
83 // Create the return instruction and add it to the basic block
84 ReturnInst::Create(Sum
, RecurseBB
);
90 int main(int argc
, char **argv
) {
91 int n
= argc
> 1 ? atol(argv
[1]) : 24;
93 // Create some module to put our function into it.
94 Module
*M
= new Module("test");
96 // We are about to create the "fib" function:
97 Function
*FibF
= CreateFibFunction(M
);
99 // Now we going to create JIT
100 ExistingModuleProvider
*MP
= new ExistingModuleProvider(M
);
101 ExecutionEngine
*EE
= ExecutionEngine::create(MP
, false);
103 errs() << "verifying... ";
104 if (verifyModule(*M
)) {
105 errs() << argv
[0] << ": Error constructing function!\n";
110 errs() << "We just constructed this LLVM module:\n\n---------\n" << *M
;
111 errs() << "---------\nstarting fibonacci(" << n
<< ") with JIT...\n";
113 // Call the Fibonacci function with argument n:
114 std::vector
<GenericValue
> Args(1);
115 Args
[0].IntVal
= APInt(32, n
);
116 GenericValue GV
= EE
->runFunction(FibF
, Args
);
118 // import result of execution
119 outs() << "Result: " << GV
.IntVal
<< "\n";