llvm-6502/lib/ExecutionEngine/JIT/JIT.cpp
Chris Lattner 56adf152f6 Make sure that globals are emitted AFTER the passmanager is set up for the JIT,
because the globals may refer to functions that need to be compiled!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6105 91177308-0d34-0410-b5e6-96231b3b80d8
2003-05-12 02:14:34 +00:00

55 lines
1.7 KiB
C++

//===-- JIT.cpp - LLVM Just in Time Compiler ------------------------------===//
//
// This file implements the top-level support for creating a Just-In-Time
// compiler for the current architecture.
//
//===----------------------------------------------------------------------===//
#include "VM.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetMachineImpls.h"
#include "llvm/Module.h"
/// createJIT - Create an return a new JIT compiler if there is one available
/// for the current target. Otherwise it returns null.
///
ExecutionEngine *ExecutionEngine::createJIT(Module *M, unsigned Config) {
// FIXME: This should be controlled by which subdirectory gets linked in!
#if !defined(i386) && !defined(__i386__) && !defined(__x86__)
return 0;
#endif
// Allocate a target... in the future this will be controllable on the
// command line.
TargetMachine *Target = allocateX86TargetMachine(Config);
assert(Target && "Could not allocate X86 target machine!");
// Create the virtual machine object...
return new VM(M, Target);
}
VM::VM(Module *M, TargetMachine *tm) : ExecutionEngine(M), TM(*tm) {
setTargetData(TM.getTargetData());
MCE = createEmitter(*this); // Initialize MCE
setupPassManager();
registerCallback();
emitGlobals();
}
int VM::run(const std::string &FnName, const std::vector<std::string> &Args) {
Function *F = getModule().getNamedFunction(FnName);
if (F == 0) {
std::cerr << "Could not find function '" << FnName <<"' in module!\n";
return 1;
}
int(*PF)(int, char**) = (int(*)(int, char**))getPointerToFunction(F);
assert(PF != 0 && "Null pointer to function?");
// Build an argv vector...
char **Argv = (char**)CreateArgv(Args);
// Call the main function...
return PF(Args.size(), Argv);
}