diff options
author | Chris Lattner <sabre@nondot.org> | 2003-12-12 07:12:02 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-12-12 07:12:02 +0000 |
commit | 993bdcec009bb833c501b1e61707cd7030068698 (patch) | |
tree | 24745316c880d80692b2fa2854bed621bd24d0eb /lib/ExecutionEngine | |
parent | 65b05ce02229b8e0cc270e4b4d3f1dd612300519 (diff) | |
download | external_llvm-993bdcec009bb833c501b1e61707cd7030068698.zip external_llvm-993bdcec009bb833c501b1e61707cd7030068698.tar.gz external_llvm-993bdcec009bb833c501b1e61707cd7030068698.tar.bz2 |
Implement the ExecutionEngine::getPointerToFunctionOrStub by forwarding the
request on to the TargetMachine if it supports the getJITStubForFunction method
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10431 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine')
-rw-r--r-- | lib/ExecutionEngine/JIT/JIT.h | 6 | ||||
-rw-r--r-- | lib/ExecutionEngine/JIT/VM.cpp | 17 | ||||
-rw-r--r-- | lib/ExecutionEngine/JIT/VM.h | 6 |
3 files changed, 29 insertions, 0 deletions
diff --git a/lib/ExecutionEngine/JIT/JIT.h b/lib/ExecutionEngine/JIT/JIT.h index 9a17c96..dc82067 100644 --- a/lib/ExecutionEngine/JIT/JIT.h +++ b/lib/ExecutionEngine/JIT/JIT.h @@ -66,6 +66,12 @@ public: /// void *getPointerToFunction(Function *F); + /// getPointerToFunctionOrStub - If the specified function has been + /// code-gen'd, return a pointer to the function. If not, compile it, or use + /// a stub to implement lazy compilation if available. + /// + void *getPointerToFunctionOrStub(Function *F); + /// recompileAndRelinkFunction - This method is used to force a function /// which has already been compiled, to be compiled again, possibly /// after it has been modified. Then the entry to the old copy is overwritten diff --git a/lib/ExecutionEngine/JIT/VM.cpp b/lib/ExecutionEngine/JIT/VM.cpp index e71ec60..29ffa30 100644 --- a/lib/ExecutionEngine/JIT/VM.cpp +++ b/lib/ExecutionEngine/JIT/VM.cpp @@ -77,6 +77,23 @@ void *VM::getPointerToFunction(Function *F) { return Addr; } +// getPointerToFunctionOrStub - If the specified function has been +// code-gen'd, return a pointer to the function. If not, compile it, or use +// a stub to implement lazy compilation if available. +// +void *VM::getPointerToFunctionOrStub(Function *F) { + // If we have already code generated the function, just return the address. + std::map<const GlobalValue*, void *>::iterator I = GlobalAddress.find(F); + if (I != GlobalAddress.end()) return I->second; + + // If the target supports "stubs" for functions, get a stub now. + if (void *Ptr = TM.getJITStubForFunction(F, *MCE)) + return Ptr; + + // Otherwise, if the target doesn't support it, just codegen the function. + return getPointerToFunction(F); +} + /// recompileAndRelinkFunction - This method is used to force a function /// which has already been compiled, to be compiled again, possibly /// after it has been modified. Then the entry to the old copy is overwritten diff --git a/lib/ExecutionEngine/JIT/VM.h b/lib/ExecutionEngine/JIT/VM.h index 9a17c96..dc82067 100644 --- a/lib/ExecutionEngine/JIT/VM.h +++ b/lib/ExecutionEngine/JIT/VM.h @@ -66,6 +66,12 @@ public: /// void *getPointerToFunction(Function *F); + /// getPointerToFunctionOrStub - If the specified function has been + /// code-gen'd, return a pointer to the function. If not, compile it, or use + /// a stub to implement lazy compilation if available. + /// + void *getPointerToFunctionOrStub(Function *F); + /// recompileAndRelinkFunction - This method is used to force a function /// which has already been compiled, to be compiled again, possibly /// after it has been modified. Then the entry to the old copy is overwritten |