From f8ba919d76e46af7ab557d3c604d84ea3083c8e1 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Thu, 13 Nov 2008 21:50:50 +0000 Subject: [PATCH] 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. llvm-svn: 59265 --- lib/ExecutionEngine/JIT/JITEmitter.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/ExecutionEngine/JIT/JITEmitter.cpp b/lib/ExecutionEngine/JIT/JITEmitter.cpp index 14705a4a966..dd81f321c12 100644 --- a/lib/ExecutionEngine/JIT/JITEmitter.cpp +++ b/lib/ExecutionEngine/JIT/JITEmitter.cpp @@ -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(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()) {