Always emit a function pointer as a pointer to the function stub (if there is one...
authorEvan Cheng <evan.cheng@apple.com>
Thu, 13 Nov 2008 21:50:50 +0000 (21:50 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 13 Nov 2008 21:50:50 +0000 (21:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59265 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/JIT/JITEmitter.cpp

index 14705a4a966948e522f63e0a4cb9d008d5ad6388..dd81f321c1203981bb01f3c0853f2dd347089ced 100644 (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()) {