Always emit a function pointer as a pointer to the function stub (if there is one). This makes it possible to compare function pointer values in lazy compilation mode. This fixes PR3043.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59265 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2008-11-13 21:50:50 +00:00
parent 550f5afb68
commit 704bff9e6c

View File

@ -115,6 +115,10 @@ namespace {
TheJITResolver = 0;
}
/// getFunctionStubIfAvailable - This returns a pointer to a function stub
/// if it has already been created.
void *getFunctionStubIfAvailable(Function *F);
/// getFunctionStub - This returns a pointer to a function stub, creating
/// one on demand as needed.
void *getFunctionStub(Function *F);
@ -151,6 +155,16 @@ namespace {
JITResolver *JITResolver::TheJITResolver = 0;
/// getFunctionStubIfAvailable - This returns a pointer to a function stub
/// if it has already been created.
void *JITResolver::getFunctionStubIfAvailable(Function *F) {
MutexGuard locked(TheJIT->lock);
// If we already have a stub for this function, recycle it.
void *&Stub = state.getFunctionToStubMap(locked)[F];
return Stub;
}
/// getFunctionStub - This returns a pointer to a function stub, creating
/// one on demand as needed.
void *JITResolver::getFunctionStub(Function *F) {
@ -596,7 +610,12 @@ void *JITEmitter::getPointerToGlobal(GlobalValue *V, void *Reference,
// If we have already compiled the function, return a pointer to its body.
Function *F = cast<Function>(V);
void *ResultPtr = TheJIT->getPointerToGlobalIfAvailable(F);
void *ResultPtr;
if (!DoesntNeedStub)
// Return the function stub if it's already created.
ResultPtr = Resolver.getFunctionStubIfAvailable(F);
else
ResultPtr = TheJIT->getPointerToGlobalIfAvailable(F);
if (ResultPtr) return ResultPtr;
if (F->isDeclaration() && !F->hasNotBeenReadFromBitcode()) {