X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=examples%2FHowToUseJIT%2FHowToUseJIT.cpp;h=8e3b6dc4a2733c8c41b9eefa2efc52e596deceb7;hb=a75ce9f5d2236d93c117e861e60e6f3f748c9555;hp=2aba8e1128a28518828f1c5e2e525d567e0fea6c;hpb=051a950000e21935165db56695e35bade668193b;p=oota-llvm.git diff --git a/examples/HowToUseJIT/HowToUseJIT.cpp b/examples/HowToUseJIT/HowToUseJIT.cpp index 2aba8e1128a..8e3b6dc4a27 100644 --- a/examples/HowToUseJIT/HowToUseJIT.cpp +++ b/examples/HowToUseJIT/HowToUseJIT.cpp @@ -12,7 +12,7 @@ // // Goal: // The goal of this snippet is to create in the memory -// the LLVM module consisting of two functions as follow: +// the LLVM module consisting of two functions as follow: // // int add1(int x) { // return x+1; @@ -34,34 +34,42 @@ // //===----------------------------------------------------------------------===// +#include "llvm/LLVMContext.h" #include "llvm/Module.h" #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Instructions.h" -#include "llvm/ModuleProvider.h" #include "llvm/ExecutionEngine/JIT.h" #include "llvm/ExecutionEngine/Interpreter.h" #include "llvm/ExecutionEngine/GenericValue.h" -#include +#include "llvm/Target/TargetSelect.h" +#include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/raw_ostream.h" using namespace llvm; int main() { + + InitializeNativeTarget(); + + LLVMContext Context; + // Create some module to put our function into it. - Module *M = new Module("test"); + Module *M = new Module("test", Context); // Create the add1 function entry and insert this entry into module M. The // function will have a return type of "int" and take an argument of "int". // The '0' terminates the list of argument types. Function *Add1F = - cast(M->getOrInsertFunction("add1", Type::Int32Ty, Type::Int32Ty, + cast(M->getOrInsertFunction("add1", Type::getInt32Ty(Context), + Type::getInt32Ty(Context), (Type *)0)); // Add a basic block to the function. As before, it automatically inserts // because of the last argument. - BasicBlock *BB = BasicBlock::Create("EntryBlock", Add1F); + BasicBlock *BB = BasicBlock::Create(Context, "EntryBlock", Add1F); // Get pointers to the constant `1'. - Value *One = ConstantInt::get(Type::Int32Ty, 1); + Value *One = ConstantInt::get(Type::getInt32Ty(Context), 1); // Get pointers to the integer argument of the add1 function... assert(Add1F->arg_begin() != Add1F->arg_end()); // Make sure there's an arg @@ -69,10 +77,10 @@ int main() { ArgX->setName("AnArg"); // Give it a nice symbolic name for fun. // Create the add instruction, inserting it into the end of BB. - Instruction *Add = BinaryOperator::createAdd(One, ArgX, "addresult", BB); + Instruction *Add = BinaryOperator::CreateAdd(One, ArgX, "addresult", BB); // Create the return instruction and add it to the basic block - ReturnInst::Create(Add, BB); + ReturnInst::Create(Context, Add, BB); // Now, function add1 is ready. @@ -80,33 +88,37 @@ int main() { // Now we going to create function `foo', which returns an int and takes no // arguments. Function *FooF = - cast(M->getOrInsertFunction("foo", Type::Int32Ty, (Type *)0)); + cast(M->getOrInsertFunction("foo", Type::getInt32Ty(Context), + (Type *)0)); // Add a basic block to the FooF function. - BB = BasicBlock::Create("EntryBlock", FooF); + BB = BasicBlock::Create(Context, "EntryBlock", FooF); // Get pointers to the constant `10'. - Value *Ten = ConstantInt::get(Type::Int32Ty, 10); + Value *Ten = ConstantInt::get(Type::getInt32Ty(Context), 10); // Pass Ten to the call call: CallInst *Add1CallRes = CallInst::Create(Add1F, Ten, "add1", BB); Add1CallRes->setTailCall(true); // Create the return instruction and add it to the basic block. - ReturnInst::Create(Add1CallRes, BB); + ReturnInst::Create(Context, Add1CallRes, BB); // Now we create the JIT. - ExistingModuleProvider* MP = new ExistingModuleProvider(M); - ExecutionEngine* EE = ExecutionEngine::create(MP, false); + ExecutionEngine* EE = EngineBuilder(M).create(); - std::cout << "We just constructed this LLVM module:\n\n" << *M; - std::cout << "\n\nRunning foo: " << std::flush; + outs() << "We just constructed this LLVM module:\n\n" << *M; + outs() << "\n\nRunning foo: "; + outs().flush(); // Call the `foo' function with no arguments: std::vector noargs; GenericValue gv = EE->runFunction(FooF, noargs); // Import result of execution: - std::cout << "Result: " << gv.IntVal.toStringUnsigned(10) << "\n"; + outs() << "Result: " << gv.IntVal << "\n"; + EE->freeMachineCodeForFunction(FooF); + delete EE; + llvm_shutdown(); return 0; }