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/LLVMContext.h"
27 #include "llvm/Module.h"
28 #include "llvm/DerivedTypes.h"
29 #include "llvm/Constants.h"
30 #include "llvm/Instructions.h"
31 #include "llvm/ModuleProvider.h"
32 #include "llvm/Analysis/Verifier.h"
33 #include "llvm/ExecutionEngine/JIT.h"
34 #include "llvm/ExecutionEngine/Interpreter.h"
35 #include "llvm/ExecutionEngine/GenericValue.h"
36 #include "llvm/Support/raw_ostream.h"
39 static Function
*CreateFibFunction(Module
*M
, LLVMContext
&Context
) {
40 // Create the fib function and insert it into module M. This function is said
41 // to return an int and take an int parameter.
43 cast
<Function
>(M
->getOrInsertFunction("fib", Type::getInt32Ty(Context
),
44 Type::getInt32Ty(Context
),
47 // Add a basic block to the function.
48 BasicBlock
*BB
= BasicBlock::Create(Context
, "EntryBlock", FibF
);
50 // Get pointers to the constants.
51 Value
*One
= ConstantInt::get(Type::getInt32Ty(Context
), 1);
52 Value
*Two
= ConstantInt::get(Type::getInt32Ty(Context
), 2);
54 // Get pointer to the integer argument of the add1 function...
55 Argument
*ArgX
= FibF
->arg_begin(); // Get the arg.
56 ArgX
->setName("AnArg"); // Give it a nice symbolic name for fun.
58 // Create the true_block.
59 BasicBlock
*RetBB
= BasicBlock::Create(Context
, "return", FibF
);
60 // Create an exit block.
61 BasicBlock
* RecurseBB
= BasicBlock::Create(Context
, "recurse", FibF
);
63 // Create the "if (arg <= 2) goto exitbb"
64 Value
*CondInst
= new ICmpInst(*BB
, ICmpInst::ICMP_SLE
, ArgX
, Two
, "cond");
65 BranchInst::Create(RetBB
, RecurseBB
, CondInst
, BB
);
68 ReturnInst::Create(Context
, One
, RetBB
);
71 Value
*Sub
= BinaryOperator::CreateSub(ArgX
, One
, "arg", RecurseBB
);
72 CallInst
*CallFibX1
= CallInst::Create(FibF
, Sub
, "fibx1", RecurseBB
);
73 CallFibX1
->setTailCall();
76 Sub
= BinaryOperator::CreateSub(ArgX
, Two
, "arg", RecurseBB
);
77 CallInst
*CallFibX2
= CallInst::Create(FibF
, Sub
, "fibx2", RecurseBB
);
78 CallFibX2
->setTailCall();
82 Value
*Sum
= BinaryOperator::CreateAdd(CallFibX1
, CallFibX2
,
83 "addresult", RecurseBB
);
85 // Create the return instruction and add it to the basic block
86 ReturnInst::Create(Context
, Sum
, RecurseBB
);
92 int main(int argc
, char **argv
) {
93 int n
= argc
> 1 ? atol(argv
[1]) : 24;
97 // Create some module to put our function into it.
98 Module
*M
= new Module("test", Context
);
100 // We are about to create the "fib" function:
101 Function
*FibF
= CreateFibFunction(M
, Context
);
103 // Now we going to create JIT
104 ExecutionEngine
*EE
= EngineBuilder(M
).create();
106 errs() << "verifying... ";
107 if (verifyModule(*M
)) {
108 errs() << argv
[0] << ": Error constructing function!\n";
113 errs() << "We just constructed this LLVM module:\n\n---------\n" << *M
;
114 errs() << "---------\nstarting fibonacci(" << n
<< ") with JIT...\n";
116 // Call the Fibonacci function with argument n:
117 std::vector
<GenericValue
> Args(1);
118 Args
[0].IntVal
= APInt(32, n
);
119 GenericValue GV
= EE
->runFunction(FibF
, Args
);
121 // import result of execution
122 outs() << "Result: " << GV
.IntVal
<< "\n";