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