mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-20 18:48:13 +00:00
add a mechanism for the JIT to invoke a function to lazily create functions as they are referenced.
llvm-svn: 43210
This commit is contained in:
parent
14bd59e060
commit
ecea068eb2
@ -64,6 +64,7 @@ class ExecutionEngine {
|
||||
const TargetData *TD;
|
||||
ExecutionEngineState state;
|
||||
bool LazyCompilationDisabled;
|
||||
|
||||
protected:
|
||||
/// Modules - This is a list of ModuleProvider's that we are JIT'ing from. We
|
||||
/// use a smallvector to optimize for the case where there is only one module.
|
||||
@ -78,7 +79,11 @@ protected:
|
||||
// at startup time if they are linked in.
|
||||
typedef ExecutionEngine *(*EECtorFn)(ModuleProvider*, std::string*);
|
||||
static EECtorFn JITCtor, InterpCtor;
|
||||
|
||||
|
||||
/// LazyFunctionCreator - If an unknown function is needed, this function
|
||||
/// pointer is invoked to create it. If this returns null, the JIT will abort.
|
||||
void* (*LazyFunctionCreator)(const std::string &);
|
||||
|
||||
public:
|
||||
/// lock - This lock is protects the ExecutionEngine, JIT, JITResolver and
|
||||
/// JITEmitter classes. It must be held while changing the internal state of
|
||||
@ -218,6 +223,14 @@ public:
|
||||
bool isLazyCompilationDisabled() const {
|
||||
return LazyCompilationDisabled;
|
||||
}
|
||||
|
||||
|
||||
/// InstallLazyFunctionCreator - If an unknown function is needed, the
|
||||
/// specified function pointer is invoked to create it. If it returns null,
|
||||
/// the JIT will abort.
|
||||
void InstallLazyFunctionCreator(void* (*P)(const std::string &)) {
|
||||
LazyFunctionCreator = P;
|
||||
}
|
||||
|
||||
protected:
|
||||
void emitGlobals();
|
||||
|
@ -33,13 +33,13 @@ STATISTIC(NumGlobals , "Number of global vars initialized");
|
||||
ExecutionEngine::EECtorFn ExecutionEngine::JITCtor = 0;
|
||||
ExecutionEngine::EECtorFn ExecutionEngine::InterpCtor = 0;
|
||||
|
||||
ExecutionEngine::ExecutionEngine(ModuleProvider *P) {
|
||||
ExecutionEngine::ExecutionEngine(ModuleProvider *P) : LazyFunctionCreator(0) {
|
||||
LazyCompilationDisabled = false;
|
||||
Modules.push_back(P);
|
||||
assert(P && "ModuleProvider is null?");
|
||||
}
|
||||
|
||||
ExecutionEngine::ExecutionEngine(Module *M) {
|
||||
ExecutionEngine::ExecutionEngine(Module *M) : LazyFunctionCreator(0) {
|
||||
LazyCompilationDisabled = false;
|
||||
assert(M && "Module is null?");
|
||||
Modules.push_back(new ExistingModuleProvider(M));
|
||||
|
@ -101,6 +101,11 @@ void *JIT::getPointerToNamedFunction(const std::string &Name) {
|
||||
Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr+1);
|
||||
if (Ptr) return Ptr;
|
||||
}
|
||||
|
||||
/// If a LazyFunctionCreator is installed, use it to get/create the function.
|
||||
if (LazyFunctionCreator)
|
||||
if (void *RP = LazyFunctionCreator(Name))
|
||||
return RP;
|
||||
|
||||
cerr << "ERROR: Program used external function '" << Name
|
||||
<< "' which could not be resolved!\n";
|
||||
|
Loading…
Reference in New Issue
Block a user