JIT.cpp revision 22080f9f168b0129d0ed3a2a29a145e17723c3ba
1bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===-- JIT.cpp - LLVM Just in Time Compiler ------------------------------===//
2bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//
3bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// This file implements the top-level support for creating a Just-In-Time
4bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// compiler for the current architecture.
5bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//
6bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===----------------------------------------------------------------------===//
7bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
8bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "VM.h"
9bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "llvm/Target/TargetMachine.h"
10bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "llvm/Target/TargetMachineImpls.h"
11bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "llvm/Module.h"
12bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
13bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
14bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner/// createJIT - Create an return a new JIT compiler if there is one available
15bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner/// for the current target.  Otherwise it returns null.
16bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner///
17bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris LattnerExecutionEngine *ExecutionEngine::createJIT(Module *M, unsigned Config) {
18bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // FIXME: This should be controlled by which subdirectory gets linked in!
19bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#if !defined(i386) && !defined(__i386__) && !defined(__x86__)
20bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  return 0;
21bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#endif
22bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // Allocate a target... in the future this will be controllable on the
23bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // command line.
24bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  TargetMachine *Target = allocateX86TargetMachine(Config);
25bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  assert(Target && "Could not allocate X86 target machine!");
26bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
27bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // Create the virtual machine object...
28bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  return new VM(M, Target);
29bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner}
30bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
31bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris LattnerVM::VM(Module *M, TargetMachine *tm) : ExecutionEngine(M), TM(*tm) {
32bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  setTargetData(TM.getTargetData());
33bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  MCE = createEmitter(*this);  // Initialize MCE
34bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  setupPassManager();
35bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  registerCallback();
3656adf152f6354a9b5609e059050fd2315ad5960cChris Lattner  emitGlobals();
37bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner}
38bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
39bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnerint VM::run(const std::string &FnName, const std::vector<std::string> &Args) {
40bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  Function *F = getModule().getNamedFunction(FnName);
41bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  if (F == 0) {
42bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    std::cerr << "Could not find function '" << FnName <<"' in module!\n";
43bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner    return 1;
44bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  }
45bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
46bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  int(*PF)(int, char**) = (int(*)(int, char**))getPointerToFunction(F);
47bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  assert(PF != 0 && "Null pointer to function?");
48bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
49bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // Build an argv vector...
50bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  char **Argv = (char**)CreateArgv(Args);
51bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner
52bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner  // Call the main function...
5322080f9f168b0129d0ed3a2a29a145e17723c3baChris Lattner  int Result = PF(Args.size(), Argv);
5422080f9f168b0129d0ed3a2a29a145e17723c3baChris Lattner
5522080f9f168b0129d0ed3a2a29a145e17723c3baChris Lattner  // Run any atexit handlers now!
5622080f9f168b0129d0ed3a2a29a145e17723c3baChris Lattner  runAtExitHandlers();
5722080f9f168b0129d0ed3a2a29a145e17723c3baChris Lattner  return Result;
58bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner}
59