Add new parameter Fast to createJIT to enable the fast codegen path.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54523 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2008-08-08 08:11:34 +00:00
parent 381cb07544
commit 502f20b17e
8 changed files with 30 additions and 20 deletions

View File

@ -79,7 +79,8 @@ protected:
// To avoid having libexecutionengine depend on the JIT and interpreter // To avoid having libexecutionengine depend on the JIT and interpreter
// libraries, the JIT and Interpreter set these functions to ctor pointers // libraries, the JIT and Interpreter set these functions to ctor pointers
// at startup time if they are linked in. // at startup time if they are linked in.
typedef ExecutionEngine *(*EECtorFn)(ModuleProvider*, std::string*); typedef ExecutionEngine *(*EECtorFn)(ModuleProvider*, std::string*,
bool Fast);
static EECtorFn JITCtor, InterpCtor; static EECtorFn JITCtor, InterpCtor;
/// LazyFunctionCreator - If an unknown function is needed, this function /// LazyFunctionCreator - If an unknown function is needed, this function
@ -108,7 +109,8 @@ public:
/// module provider. /// module provider.
static ExecutionEngine *create(ModuleProvider *MP, static ExecutionEngine *create(ModuleProvider *MP,
bool ForceInterpreter = false, bool ForceInterpreter = false,
std::string *ErrorStr = 0); std::string *ErrorStr = 0,
bool Fast = false);
/// create - This is the factory method for creating an execution engine which /// create - This is the factory method for creating an execution engine which
/// is appropriate for the current machine. This takes ownership of the /// is appropriate for the current machine. This takes ownership of the
@ -120,7 +122,8 @@ public:
/// of the ModuleProvider and JITMemoryManager if successful. /// of the ModuleProvider and JITMemoryManager if successful.
static ExecutionEngine *createJIT(ModuleProvider *MP, static ExecutionEngine *createJIT(ModuleProvider *MP,
std::string *ErrorStr = 0, std::string *ErrorStr = 0,
JITMemoryManager *JMM = 0); JITMemoryManager *JMM = 0,
bool Fast = false);

View File

@ -345,7 +345,8 @@ int ExecutionEngine::runFunctionAsMain(Function *Fn,
/// ///
ExecutionEngine *ExecutionEngine::create(ModuleProvider *MP, ExecutionEngine *ExecutionEngine::create(ModuleProvider *MP,
bool ForceInterpreter, bool ForceInterpreter,
std::string *ErrorStr) { std::string *ErrorStr,
bool Fast) {
ExecutionEngine *EE = 0; ExecutionEngine *EE = 0;
// Make sure we can resolve symbols in the program as well. The zero arg // Make sure we can resolve symbols in the program as well. The zero arg
@ -355,11 +356,11 @@ ExecutionEngine *ExecutionEngine::create(ModuleProvider *MP,
// Unless the interpreter was explicitly selected, try making a JIT. // Unless the interpreter was explicitly selected, try making a JIT.
if (!ForceInterpreter && JITCtor) if (!ForceInterpreter && JITCtor)
EE = JITCtor(MP, ErrorStr); EE = JITCtor(MP, ErrorStr, Fast);
// If we can't make a JIT, make an interpreter instead. // If we can't make a JIT, make an interpreter instead.
if (EE == 0 && InterpCtor) if (EE == 0 && InterpCtor)
EE = InterpCtor(MP, ErrorStr); EE = InterpCtor(MP, ErrorStr, Fast);
return EE; return EE;
} }

View File

@ -114,9 +114,11 @@ int LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp,
int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT, int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
LLVMModuleProviderRef MP, LLVMModuleProviderRef MP,
char **OutError) { char **OutError,
bool Fast = false) {
std::string Error; std::string Error;
if (ExecutionEngine *JIT = ExecutionEngine::createJIT(unwrap(MP), &Error)) { if (ExecutionEngine *JIT = ExecutionEngine::createJIT(unwrap(MP), &Error, 0,
Fast)) {
*OutJIT = wrap(JIT); *OutJIT = wrap(JIT);
return 0; return 0;
} }

View File

@ -36,7 +36,8 @@ namespace llvm {
/// create - Create a new interpreter object. This can never fail. /// create - Create a new interpreter object. This can never fail.
/// ///
ExecutionEngine *Interpreter::create(ModuleProvider *MP, std::string* ErrStr) { ExecutionEngine *Interpreter::create(ModuleProvider *MP, std::string* ErrStr,
bool Fast /*unused*/) {
// Tell this ModuleProvide to materialize and release the module // Tell this ModuleProvide to materialize and release the module
if (!MP->materializeModule(ErrStr)) if (!MP->materializeModule(ErrStr))
// We got an error, just return 0 // We got an error, just return 0

View File

@ -108,7 +108,8 @@ public:
/// create - Create an interpreter ExecutionEngine. This can never fail. /// create - Create an interpreter ExecutionEngine. This can never fail.
/// ///
static ExecutionEngine *create(ModuleProvider *M, std::string *ErrorStr = 0); static ExecutionEngine *create(ModuleProvider *M, std::string *ErrorStr = 0,
bool Fast /*unused*/ = 0);
/// run - Start execution with the specified function and arguments. /// run - Start execution with the specified function and arguments.
/// ///

View File

@ -73,8 +73,9 @@ extern "C" void __register_frame(void*);
/// of the module provider. /// of the module provider.
ExecutionEngine *ExecutionEngine::createJIT(ModuleProvider *MP, ExecutionEngine *ExecutionEngine::createJIT(ModuleProvider *MP,
std::string *ErrorStr, std::string *ErrorStr,
JITMemoryManager *JMM) { JITMemoryManager *JMM,
ExecutionEngine *EE = JIT::createJIT(MP, ErrorStr, JMM); bool Fast) {
ExecutionEngine *EE = JIT::createJIT(MP, ErrorStr, JMM, Fast);
if (!EE) return 0; if (!EE) return 0;
// Register routine for informing unwinding runtime about new EH frames // Register routine for informing unwinding runtime about new EH frames
@ -89,7 +90,7 @@ ExecutionEngine *ExecutionEngine::createJIT(ModuleProvider *MP,
} }
JIT::JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji, JIT::JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji,
JITMemoryManager *JMM) JITMemoryManager *JMM, bool Fast)
: ExecutionEngine(MP), TM(tm), TJI(tji) { : ExecutionEngine(MP), TM(tm), TJI(tji) {
setTargetData(TM.getTargetData()); setTargetData(TM.getTargetData());
@ -105,7 +106,7 @@ JIT::JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji,
// Turn the machine code intermediate representation into bytes in memory that // Turn the machine code intermediate representation into bytes in memory that
// may be executed. // may be executed.
if (TM.addPassesToEmitMachineCode(PM, *MCE, false /*fast*/)) { if (TM.addPassesToEmitMachineCode(PM, *MCE, Fast)) {
cerr << "Target does not support machine code emission!\n"; cerr << "Target does not support machine code emission!\n";
abort(); abort();
} }

View File

@ -56,7 +56,7 @@ class JIT : public ExecutionEngine {
JITState *jitstate; JITState *jitstate;
JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji, JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji,
JITMemoryManager *JMM); JITMemoryManager *JMM, bool Fast);
public: public:
~JIT(); ~JIT();
@ -71,8 +71,9 @@ public:
/// create - Create an return a new JIT compiler if there is one available /// create - Create an return a new JIT compiler if there is one available
/// for the current target. Otherwise, return null. /// for the current target. Otherwise, return null.
/// ///
static ExecutionEngine *create(ModuleProvider *MP, std::string *Err) { static ExecutionEngine *create(ModuleProvider *MP, std::string *Err,
return createJIT(MP, Err, 0); bool Fast = false) {
return createJIT(MP, Err, 0, Fast);
} }
virtual void addModuleProvider(ModuleProvider *MP); virtual void addModuleProvider(ModuleProvider *MP);
@ -128,7 +129,7 @@ public:
MachineCodeEmitter *getCodeEmitter() const { return MCE; } MachineCodeEmitter *getCodeEmitter() const { return MCE; }
static ExecutionEngine *createJIT(ModuleProvider *MP, std::string *Err, static ExecutionEngine *createJIT(ModuleProvider *MP, std::string *Err,
JITMemoryManager *JMM); JITMemoryManager *JMM, bool Fast);
private: private:
static MachineCodeEmitter *createEmitter(JIT &J, JITMemoryManager *JMM); static MachineCodeEmitter *createEmitter(JIT &J, JITMemoryManager *JMM);

View File

@ -41,7 +41,7 @@ MAttrs("mattr",
/// available for the current target. Otherwise, return null. /// available for the current target. Otherwise, return null.
/// ///
ExecutionEngine *JIT::createJIT(ModuleProvider *MP, std::string *ErrorStr, ExecutionEngine *JIT::createJIT(ModuleProvider *MP, std::string *ErrorStr,
JITMemoryManager *JMM) { JITMemoryManager *JMM, bool Fast) {
const TargetMachineRegistry::entry *TheArch = MArch; const TargetMachineRegistry::entry *TheArch = MArch;
if (TheArch == 0) { if (TheArch == 0) {
std::string Error; std::string Error;
@ -73,7 +73,7 @@ ExecutionEngine *JIT::createJIT(ModuleProvider *MP, std::string *ErrorStr,
// If the target supports JIT code generation, return a new JIT now. // If the target supports JIT code generation, return a new JIT now.
if (TargetJITInfo *TJ = Target->getJITInfo()) if (TargetJITInfo *TJ = Target->getJITInfo())
return new JIT(MP, *Target, *TJ, JMM); return new JIT(MP, *Target, *TJ, JMM, Fast);
if (ErrorStr) if (ErrorStr)
*ErrorStr = "target does not support JIT code generation"; *ErrorStr = "target does not support JIT code generation";