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::Int32Ty
, Type::Int32Ty
,
46 // Add a basic block to the function.
47 BasicBlock
*BB
= BasicBlock::Create("EntryBlock", FibF
);
49 // Get pointers to the constants.
50 Value
*One
= ConstantInt::get(Type::Int32Ty
, 1);
51 Value
*Two
= ConstantInt::get(Type::Int32Ty
, 2);
53 // Get pointer to the integer argument of the add1 function...
54 Argument
*ArgX
= FibF
->arg_begin(); // Get the arg.
55 ArgX
->setName("AnArg"); // Give it a nice symbolic name for fun.
57 // Create the true_block.
58 BasicBlock
*RetBB
= BasicBlock::Create("return", FibF
);
59 // Create an exit block.
60 BasicBlock
* RecurseBB
= BasicBlock::Create("recurse", FibF
);
62 // Create the "if (arg <= 2) goto exitbb"
63 Value
*CondInst
= new ICmpInst(*BB
, ICmpInst::ICMP_SLE
, ArgX
, Two
, "cond");
64 BranchInst::Create(RetBB
, RecurseBB
, CondInst
, BB
);
67 ReturnInst::Create(One
, RetBB
);
70 Value
*Sub
= BinaryOperator::CreateSub(ArgX
, One
, "arg", RecurseBB
);
71 CallInst
*CallFibX1
= CallInst::Create(FibF
, Sub
, "fibx1", RecurseBB
);
72 CallFibX1
->setTailCall();
75 Sub
= BinaryOperator::CreateSub(ArgX
, Two
, "arg", RecurseBB
);
76 CallInst
*CallFibX2
= CallInst::Create(FibF
, Sub
, "fibx2", RecurseBB
);
77 CallFibX2
->setTailCall();
81 Value
*Sum
= BinaryOperator::CreateAdd(CallFibX1
, CallFibX2
,
82 "addresult", RecurseBB
);
84 // Create the return instruction and add it to the basic block
85 ReturnInst::Create(Sum
, RecurseBB
);
91 int main(int argc
, char **argv
) {
92 int n
= argc
> 1 ? atol(argv
[1]) : 24;
96 // Create some module to put our function into it.
97 Module
*M
= new Module("test", Context
);
99 // We are about to create the "fib" function:
100 Function
*FibF
= CreateFibFunction(M
, Context
);
102 // Now we going to create JIT
103 ExecutionEngine
*EE
= EngineBuilder(M
).create();
105 errs() << "verifying... ";
106 if (verifyModule(*M
)) {
107 errs() << argv
[0] << ": Error constructing function!\n";
112 errs() << "We just constructed this LLVM module:\n\n---------\n" << *M
;
113 errs() << "---------\nstarting fibonacci(" << n
<< ") with JIT...\n";
115 // Call the Fibonacci function with argument n:
116 std::vector
<GenericValue
> Args(1);
117 Args
[0].IntVal
= APInt(32, n
);
118 GenericValue GV
= EE
->runFunction(FibF
, Args
);
120 // import result of execution
121 outs() << "Result: " << GV
.IntVal
<< "\n";