//
// The LLVM Compiler Infrastructure
//
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
class TargetJITInfo;
class MachineCodeEmitter;
-class JIT : public ExecutionEngine {
- TargetMachine &TM; // The current target we are compiling to
- TargetJITInfo &TJI; // The JITInfo for the target we are compiling to
-
+class JITState {
+private:
FunctionPassManager PM; // Passes to compile a function
- MachineCodeEmitter *MCE; // MCE object
/// PendingGlobals - Global variables which have had memory allocated for them
/// while a function was code generated, but which have not been initialized
/// yet.
std::vector<const GlobalVariable*> PendingGlobals;
- JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji);
+public:
+ explicit JITState(ModuleProvider *MP) : PM(MP) {}
+
+ FunctionPassManager &getPM(const MutexGuard &L) {
+ return PM;
+ }
+
+ std::vector<const GlobalVariable*> &getPendingGlobals(const MutexGuard &L) {
+ return PendingGlobals;
+ }
+};
+
+
+class JIT : public ExecutionEngine {
+ TargetMachine &TM; // The current target we are compiling to
+ TargetJITInfo &TJI; // The JITInfo for the target we are compiling to
+ MachineCodeEmitter *MCE; // MCE object
+
+ JITState *jitstate;
+
+ JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji,
+ JITMemoryManager *JMM);
public:
~JIT();
+ static void Register() {
+ JITCtor = create;
+ }
+
/// getJITInfo - Return the target JIT information structure.
///
TargetJITInfo &getJITInfo() const { return TJI; }
/// create - Create an return a new JIT compiler if there is one available
- /// for the current target. Otherwise, return null. If the JIT is created
- /// successfully, it takes responsibility for deleting the specified
- /// IntrinsicLowering implementation.
+ /// for the current target. Otherwise, return null.
///
- static ExecutionEngine *create(ModuleProvider *MP, IntrinsicLowering *IL = 0);
+ static ExecutionEngine *create(ModuleProvider *MP, std::string *Err) {
+ return createJIT(MP, Err, 0);
+ }
+
+ virtual void addModuleProvider(ModuleProvider *MP);
+ virtual Module *removeModuleProvider(ModuleProvider *MP,
+ std::string *ErrInfo = 0);
/// run - Start execution with the specified function and arguments.
///
///
void freeMachineCodeForFunction(Function *F);
+ /// getCodeEmitter - Return the code emitter this JIT is emitting into.
+ MachineCodeEmitter *getCodeEmitter() const { return MCE; }
+
+ static ExecutionEngine *createJIT(ModuleProvider *MP, std::string *Err,
+ JITMemoryManager *JMM);
+
private:
- static MachineCodeEmitter *createEmitter(JIT &J);
+ static MachineCodeEmitter *createEmitter(JIT &J, JITMemoryManager *JMM);
void runJITOnFunction (Function *F);
};