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