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