forked from OSchip/llvm-project
Enabling incremental bytecode loading in the JIT:
* The VM is now constructed with a ModuleProvider llvm-svn: 9125
This commit is contained in:
parent
2f1e200248
commit
299f3e650f
|
@ -45,7 +45,7 @@ namespace {
|
|||
/// create - Create an return a new JIT compiler if there is one available
|
||||
/// for the current target. Otherwise, return null.
|
||||
///
|
||||
ExecutionEngine *VM::create(Module *M) {
|
||||
ExecutionEngine *VM::create(ModuleProvider *MP) {
|
||||
TargetMachine* (*TargetMachineAllocator)(const Module &) = 0;
|
||||
|
||||
// Allow a command-line switch to override what *should* be the default target
|
||||
|
@ -71,14 +71,16 @@ ExecutionEngine *VM::create(Module *M) {
|
|||
}
|
||||
|
||||
// Allocate a target...
|
||||
TargetMachine *Target = TargetMachineAllocator(*M);
|
||||
TargetMachine *Target = TargetMachineAllocator(*(MP->getModule()));
|
||||
assert(Target && "Could not allocate target machine!");
|
||||
|
||||
// Create the virtual machine object...
|
||||
return new VM(M, Target);
|
||||
return new VM(MP, Target);
|
||||
}
|
||||
|
||||
VM::VM(Module *M, TargetMachine *tm) : ExecutionEngine(M), TM(*tm) {
|
||||
VM::VM(ModuleProvider *MP, TargetMachine *tm) : ExecutionEngine(MP), TM(*tm),
|
||||
PM(MP)
|
||||
{
|
||||
setTargetData(TM.getTargetData());
|
||||
|
||||
// Initialize MCE
|
||||
|
@ -94,7 +96,10 @@ VM::VM(Module *M, TargetMachine *tm) : ExecutionEngine(M), TM(*tm) {
|
|||
// Specialize LLVM code for this target machine and then
|
||||
// run basic dataflow optimizations on LLVM code.
|
||||
PM.add(createPreSelectionPass(TM));
|
||||
PM.run(*M);
|
||||
// We cannot utilize function-at-a-time loading here because PreSelection
|
||||
// is a ModulePass.
|
||||
MP->materializeModule();
|
||||
PM.run(*(MP->getModule()));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -43,6 +43,9 @@ void *VM::getPointerToFunction(Function *F) {
|
|||
void *&Addr = GlobalAddress[F]; // Function already code gen'd
|
||||
if (Addr) return Addr;
|
||||
|
||||
// Make sure we read in the function if it exists in this Module
|
||||
MP->materializeFunction(F);
|
||||
|
||||
if (F->isExternal())
|
||||
return Addr = getPointerToNamedFunction(F->getName());
|
||||
|
||||
|
|
|
@ -23,13 +23,13 @@ class VM : public ExecutionEngine {
|
|||
MachineCodeEmitter *MCE; // MCE object
|
||||
|
||||
public:
|
||||
VM(Module *M, TargetMachine *tm);
|
||||
VM(ModuleProvider *MP, TargetMachine *tm);
|
||||
~VM();
|
||||
|
||||
/// create - Create an return a new JIT compiler if there is one available
|
||||
/// for the current target. Otherwise, return null.
|
||||
///
|
||||
static ExecutionEngine *create(Module *M);
|
||||
static ExecutionEngine *create(ModuleProvider *MP);
|
||||
|
||||
/// run - Start execution with the specified function and arguments.
|
||||
///
|
||||
|
|
Loading…
Reference in New Issue