JIT.cpp revision 9722294d30fff2a432d8e171eb904f33956353e2
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" 99722294d30fff2a432d8e171eb904f33956353e2Brian Gaeke#include "llvm/ExecutionEngine/GenericValue.h" 10bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "llvm/Target/TargetMachine.h" 11bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "llvm/Target/TargetMachineImpls.h" 12bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "llvm/Module.h" 13abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman#include "Support/CommandLine.h" 14abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman 154e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman// FIXME: REMOVE THIS 164e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman#include "llvm/PassManager.h" 174e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman 1882742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#if !defined(ENABLE_X86_JIT) && !defined(ENABLE_SPARC_JIT) 1982742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#define NO_JITS_ENABLED 2082742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#endif 2182742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman 22abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukmannamespace { 2382742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman enum ArchName { x86, Sparc }; 2497ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner 2582742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#ifndef NO_JITS_ENABLED 2697ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner cl::opt<ArchName> 2797ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner Arch("march", cl::desc("Architecture to JIT to:"), cl::Prefix, 2882742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman cl::values( 2982742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#ifdef ENABLE_X86_JIT 3082742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman clEnumVal(x86, " IA-32 (Pentium and above)"), 3182742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#endif 3282742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#ifdef ENABLE_SPARC_JIT 33de3209bfdbb5b26198af8e6f30684bc50eb39ab6Chris Lattner clEnumValN(Sparc, "sparc", " Sparc-V9"), 3497ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner#endif 3597ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner 0), 3682742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#if defined(ENABLE_X86_JIT) 3797ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner cl::init(x86) 3882742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#elif defined(ENABLE_SPARC_JIT) 39de3209bfdbb5b26198af8e6f30684bc50eb39ab6Chris Lattner cl::init(Sparc) 40abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman#endif 4197ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner ); 4282742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#endif /* NO_JITS_ENABLED */ 43abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman} 44bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 4582d8277ad5862b54341808812bb4016e52347060Brian Gaeke/// create - Create an return a new JIT compiler if there is one available 4682d8277ad5862b54341808812bb4016e52347060Brian Gaeke/// for the current target. Otherwise, return null. 47bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner/// 4882d8277ad5862b54341808812bb4016e52347060Brian GaekeExecutionEngine *VM::create(Module *M) { 4939c07264da992fd5d37fa7eaac0b9f02f55f80d0Chris Lattner TargetMachine* (*TargetMachineAllocator)(const Module &) = 0; 50abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman 51abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman // Allow a command-line switch to override what *should* be the default target 52abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman // machine for this platform. This allows for debugging a Sparc JIT on X86 -- 5382742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman // our X86 machines are much faster at recompiling LLVM and linking LLI. 5482742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#ifdef NO_JITS_ENABLED 5582742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman return 0; 5682742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#endif 5782742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman 5897ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner switch (Arch) { 5982742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#ifdef ENABLE_X86_JIT 6097ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner case x86: 61abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman TargetMachineAllocator = allocateX86TargetMachine; 6297ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner break; 6382742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#endif 6482742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#ifdef ENABLE_SPARC_JIT 65de3209bfdbb5b26198af8e6f30684bc50eb39ab6Chris Lattner case Sparc: 66906f5fa5c8bb790201c79a33ea6d906f9f57f827Misha Brukman TargetMachineAllocator = allocateSparcTargetMachine; 6797ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner break; 687aefa966cdeaf054922de341a1e36b4fceee08ceChris Lattner#endif 6997ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner default: 7097ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner assert(0 && "-march flag not supported on this host!"); 71abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman } 7297ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner 7397ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner // Allocate a target... 7439c07264da992fd5d37fa7eaac0b9f02f55f80d0Chris Lattner TargetMachine *Target = TargetMachineAllocator(*M); 7597ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner assert(Target && "Could not allocate target machine!"); 7697ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner 7797ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner // Create the virtual machine object... 7897ac14f33cc8fed7f34cb8c7199ef42be124de7eChris Lattner return new VM(M, Target); 79bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner} 80bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 81bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris LattnerVM::VM(Module *M, TargetMachine *tm) : ExecutionEngine(M), TM(*tm) { 82bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner setTargetData(TM.getTargetData()); 83abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman 84abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman // Initialize MCE 85906f5fa5c8bb790201c79a33ea6d906f9f57f827Misha Brukman MCE = createEmitter(*this); 86abb027cf412944db4d27579ba3ae00717d23c25eMisha Brukman 87bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner setupPassManager(); 884e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman 8982742916f30b09b878d1ad9d95005389c23b02c6Misha Brukman#ifdef ENABLE_SPARC_JIT 904e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman // THIS GOES BEYOND UGLY HACKS 914e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman if (TM.getName() == "UltraSparc-Native") { 924e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman extern Pass *createPreSelectionPass(TargetMachine &TM); 934e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman PassManager PM; 944e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman // Specialize LLVM code for this target machine and then 954e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman // run basic dataflow optimizations on LLVM code. 964e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman PM.add(createPreSelectionPass(TM)); 974e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman PM.run(*M); 984e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman } 997aefa966cdeaf054922de341a1e36b4fceee08ceChris Lattner#endif 1004e8c999518361ceafd2f816e29f76284c7f8a210Misha Brukman 10156adf152f6354a9b5609e059050fd2315ad5960cChris Lattner emitGlobals(); 102bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner} 103bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 10470975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke/// run - Start execution with the specified function and arguments. 10505a1a306bcfba2b533dc1210d24924e5f3e9ed0eChris Lattner/// 10670975eef572b9e132bbaade16ba9edb76f15f287Brian GaekeGenericValue VM::run(Function *F, const std::vector<GenericValue> &ArgValues) 10770975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke{ 10870975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke assert (F && "Function *F was null at entry to run()"); 109bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 11070975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke int (*PF)(int, char **, const char **) = 11170975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke (int(*)(int, char **, const char **))getPointerToFunction(F); 11270975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke assert(PF != 0 && "Pointer to fn's code was null after getPointerToFunction"); 113bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 11470975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke // Call the function. 11570975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke int ExitCode = PF(ArgValues[0].IntVal, (char **) GVTOP (ArgValues[1]), 11670975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke (const char **) GVTOP (ArgValues[2])); 11722080f9f168b0129d0ed3a2a29a145e17723c3baChris Lattner 11822080f9f168b0129d0ed3a2a29a145e17723c3baChris Lattner // Run any atexit handlers now! 11922080f9f168b0129d0ed3a2a29a145e17723c3baChris Lattner runAtExitHandlers(); 12070975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke 12170975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke GenericValue rv; 12270975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke rv.IntVal = ExitCode; 12370975eef572b9e132bbaade16ba9edb76f15f287Brian Gaeke return rv; 124bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner} 125