//===-- examples/HowToUseJIT/HowToUseJIT.cpp - An example use of the JIT --===//
// 
//                     The LLVM Compiler Infrastructure
//
// This file was developed by Valery A. Khamenya and is distributed under the
// University of Illinois Open Source License. See LICENSE.TXT for details.
// 
//===----------------------------------------------------------------------===//
//
//  This small program provides an example of how to quickly build a small
//  module with two functions and execute it with the JIT. 
// 
// Goal: 
//  The goal of this snippet is to create in the memory
//  the LLVM module consisting of two functions as follow:
//
// int add1(int x) {
//   return x+1;
// }
// 
// int foo() {
//   return add1(10);
// }
// 
// then compile the module via JIT, then execute the `foo' 
// function and return result to a driver, i.e. to a "host program".
// 
// Some remarks and questions:
// 
// - could we invoke some code using noname functions too?
//   e.g. evaluate "foo()+foo()" without fears to introduce 
//   conflict of temporary function name with some real
//   existing function name?
// 
//===----------------------------------------------------------------------===//

#include "llvm/Module.h"
#include "llvm/Constants.h"
#include "llvm/Type.h"
#include "llvm/Instructions.h"
#include "llvm/ModuleProvider.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#include "llvm/ExecutionEngine/GenericValue.h"
#include <iostream>
using namespace llvm;

int main() {
  // Create some module to put our function into it.
  Module *M = new Module("test");

  // 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 = M->getOrInsertFunction("add1", Type::IntTy, Type::IntTy, 0);

  // Add a basic block to the function. As before, it automatically inserts
  // because of the last argument.
  BasicBlock *BB = new BasicBlock("EntryBlock", Add1F);
  
  // Get pointers to the constant `1'.
  Value *One = ConstantSInt::get(Type::IntTy, 1);

  // Get pointers to the integer argument of the add1 function...
  assert(Add1F->abegin() != Add1F->aend()); // Make sure there's an arg
  Argument *ArgX = Add1F->abegin();  // Get the arg
  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);
  
  // Create the return instruction and add it to the basic block
  new ReturnInst(Add, BB);

  // Now, function add1 is ready.


  // Now we going to create function `foo', which returns an int and takes no
  // arguments.
  Function *FooF = M->getOrInsertFunction("foo", Type::IntTy, 0);

  // Add a basic block to the FooF function.
  BB = new BasicBlock("EntryBlock", FooF);

  // Get pointers to the constant `10'.
  Value *Ten = ConstantSInt::get(Type::IntTy, 10);

  // Pass Ten to the call call:
  std::vector<Value*> Params;
  Params.push_back(Ten);
  CallInst * Add1CallRes = new CallInst(Add1F, Params, "add1", BB);
    
  // Create the return instruction and add it to the basic block.
  new ReturnInst(Add1CallRes, BB);

  // Now we create the JIT.
  ExistingModuleProvider* MP = new ExistingModuleProvider(M);
  ExecutionEngine* EE = ExecutionEngine::create(MP, false);

  std::cout << "We just constructed this LLVM module:\n\n" << *M;
  std::cout << "\n\nRunning foo: " << std::flush;

  // Call the `foo' function with no arguments:
  std::vector<GenericValue> noargs;
  GenericValue gv = EE->runFunction(FooF, noargs);

  // Import result of execution:
  std::cout << "Result: " << gv.IntVal << "\n";
  return 0;
}
