mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 21:29:20 +00:00
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:
parent
381cb07544
commit
502f20b17e
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
///
|
///
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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";
|
||||||
|
Loading…
Reference in New Issue
Block a user