166e7cd0eea6f116f3ed79acb8948c6d8db50833cReid Spencer//===-- examples/HowToUseJIT/HowToUseJIT.cpp - An example use of the JIT --===// 2237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman// 326a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// The LLVM Compiler Infrastructure 426a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// 5fc001bbfc360ab828e5a4b0cbe4bb7db87361b85Chris Lattner// This file is distributed under the University of Illinois Open Source 6fc001bbfc360ab828e5a4b0cbe4bb7db87361b85Chris Lattner// License. See LICENSE.TXT for details. 7237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman// 826a4ba73d3984645da270921caeabc34834e84e5Reid Spencer//===----------------------------------------------------------------------===// 926a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// 1054706d680107a3809985bf1308b198c7b1d0f7f5Reid Spencer// This small program provides an example of how to quickly build a small 11237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman// module with two functions and execute it with the JIT. 12237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman// 13237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman// Goal: 1426a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// The goal of this snippet is to create in the memory 15f9fba3087e840e2f6912d96c932f80d8b6698a84Garrison Venn// the LLVM module consisting of two functions as follow: 1626a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// 1726a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// int add1(int x) { 1826a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// return x+1; 1926a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// } 20237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman// 2126a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// int foo() { 2226a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// return add1(10); 2326a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// } 24237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman// 25237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman// then compile the module via JIT, then execute the `foo' 2626a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// function and return result to a driver, i.e. to a "host program". 27237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman// 2826a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// Some remarks and questions: 29237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman// 3026a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// - could we invoke some code using noname functions too? 31237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman// e.g. evaluate "foo()+foo()" without fears to introduce 3226a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// conflict of temporary function name with some real 3326a4ba73d3984645da270921caeabc34834e84e5Reid Spencer// existing function name? 34237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman// 35e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner//===----------------------------------------------------------------------===// 3626a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 374ca7e09b7c1e41535f2a1bd86915375d023daf27Chandler Carruth#include "llvm/ExecutionEngine/GenericValue.h" 384ca7e09b7c1e41535f2a1bd86915375d023daf27Chandler Carruth#include "llvm/ExecutionEngine/Interpreter.h" 394ca7e09b7c1e41535f2a1bd86915375d023daf27Chandler Carruth#include "llvm/ExecutionEngine/JIT.h" 400a08460599eed603e469e3e16d0cf6aa33b8ba93Chandler Carruth#include "llvm/IR/Constants.h" 410a08460599eed603e469e3e16d0cf6aa33b8ba93Chandler Carruth#include "llvm/IR/DerivedTypes.h" 420a08460599eed603e469e3e16d0cf6aa33b8ba93Chandler Carruth#include "llvm/IR/IRBuilder.h" 430a08460599eed603e469e3e16d0cf6aa33b8ba93Chandler Carruth#include "llvm/IR/Instructions.h" 440a08460599eed603e469e3e16d0cf6aa33b8ba93Chandler Carruth#include "llvm/IR/LLVMContext.h" 450a08460599eed603e469e3e16d0cf6aa33b8ba93Chandler Carruth#include "llvm/IR/Module.h" 46eb55f3ea3c6a12e5d098f72f3f9a16d4b7e77645Torok Edwin#include "llvm/Support/ManagedStatic.h" 474ca7e09b7c1e41535f2a1bd86915375d023daf27Chandler Carruth#include "llvm/Support/TargetSelect.h" 48944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner#include "llvm/Support/raw_ostream.h" 49c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher 5026a4ba73d3984645da270921caeabc34834e84e5Reid Spencerusing namespace llvm; 5126a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 5226a4ba73d3984645da270921caeabc34834e84e5Reid Spencerint main() { 53da06288aeb28393b937e17dcd180658c3737a6e5Chris Lattner 54da06288aeb28393b937e17dcd180658c3737a6e5Chris Lattner InitializeNativeTarget(); 558b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson 568b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson LLVMContext Context; 57da06288aeb28393b937e17dcd180658c3737a6e5Chris Lattner 5826a4ba73d3984645da270921caeabc34834e84e5Reid Spencer // Create some module to put our function into it. 5931895e73591d3c9ceae731a1274c8f56194b9616Owen Anderson Module *M = new Module("test", Context); 6026a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 61e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // Create the add1 function entry and insert this entry into module M. The 62e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // function will have a return type of "int" and take an argument of "int". 63e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // The '0' terminates the list of argument types. 646a98754ebbc211958297b0d20a77e8c3261c3708Chris Lattner Function *Add1F = 651d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson cast<Function>(M->getOrInsertFunction("add1", Type::getInt32Ty(Context), 661d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson Type::getInt32Ty(Context), 676a98754ebbc211958297b0d20a77e8c3261c3708Chris Lattner (Type *)0)); 6826a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 69e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // Add a basic block to the function. As before, it automatically inserts 70e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // because of the last argument. 711d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson BasicBlock *BB = BasicBlock::Create(Context, "EntryBlock", Add1F); 72237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman 73c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher // Create a basic block builder with default parameters. The builder will 74c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher // automatically append instructions to the basic block `BB'. 75c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher IRBuilder<> builder(BB); 76c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher 77e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // Get pointers to the constant `1'. 78c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher Value *One = builder.getInt32(1); 7926a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 80e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // Get pointers to the integer argument of the add1 function... 811d9f262b9dac7032e94857c1079b4ee62e0509d9Alkis Evlogimenos assert(Add1F->arg_begin() != Add1F->arg_end()); // Make sure there's an arg 821d9f262b9dac7032e94857c1079b4ee62e0509d9Alkis Evlogimenos Argument *ArgX = Add1F->arg_begin(); // Get the arg 83e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner ArgX->setName("AnArg"); // Give it a nice symbolic name for fun. 8426a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 85e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // Create the add instruction, inserting it into the end of BB. 86c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher Value *Add = builder.CreateAdd(One, ArgX); 87237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman 88e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // Create the return instruction and add it to the basic block 89c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher builder.CreateRet(Add); 9026a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 91e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // Now, function add1 is ready. 9226a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 9326a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 94e5dfa8f697d3c48361d507491d0cff35607ed419Johnny Chen // Now we're going to create function `foo', which returns an int and takes no 95e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // arguments. 966a98754ebbc211958297b0d20a77e8c3261c3708Chris Lattner Function *FooF = 971d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson cast<Function>(M->getOrInsertFunction("foo", Type::getInt32Ty(Context), 981d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson (Type *)0)); 9926a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 100e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // Add a basic block to the FooF function. 1011d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson BB = BasicBlock::Create(Context, "EntryBlock", FooF); 10226a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 103c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher // Tell the basic block builder to attach itself to the new basic block 104c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher builder.SetInsertPoint(BB); 105c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher 106c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher // Get pointer to the constant `10'. 107c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher Value *Ten = builder.getInt32(10); 10826a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 109c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher // Pass Ten to the call to Add1F 110c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher CallInst *Add1CallRes = builder.CreateCall(Add1F, Ten); 11147968e4dfd849b83a7eb958611c994e6b500998cChris Lattner Add1CallRes->setTailCall(true); 112237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman 113e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // Create the return instruction and add it to the basic block. 114c3a627de3f857d3788b8e689cfa4b93b5013b07cEric Christopher builder.CreateRet(Add1CallRes); 11526a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 116e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // Now we create the JIT. 1174b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner ExecutionEngine* EE = EngineBuilder(M).create(); 118e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner 119944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner outs() << "We just constructed this LLVM module:\n\n" << *M; 120944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner outs() << "\n\nRunning foo: "; 121944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner outs().flush(); 12226a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 12326a4ba73d3984645da270921caeabc34834e84e5Reid Spencer // Call the `foo' function with no arguments: 12426a4ba73d3984645da270921caeabc34834e84e5Reid Spencer std::vector<GenericValue> noargs; 12526a4ba73d3984645da270921caeabc34834e84e5Reid Spencer GenericValue gv = EE->runFunction(FooF, noargs); 12626a4ba73d3984645da270921caeabc34834e84e5Reid Spencer 127e8bf58c17085f6110d7f757d2417d7a96e9d329fChris Lattner // Import result of execution: 128944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner outs() << "Result: " << gv.IntVal << "\n"; 129eb55f3ea3c6a12e5d098f72f3f9a16d4b7e77645Torok Edwin EE->freeMachineCodeForFunction(FooF); 130eb55f3ea3c6a12e5d098f72f3f9a16d4b7e77645Torok Edwin delete EE; 131eb55f3ea3c6a12e5d098f72f3f9a16d4b7e77645Torok Edwin llvm_shutdown(); 13226a4ba73d3984645da270921caeabc34834e84e5Reid Spencer return 0; 13326a4ba73d3984645da270921caeabc34834e84e5Reid Spencer} 134