/// getPointerToFunction - This method is used to get the address of the /// specified function, compiling it if neccesary. /// void *JIT::getPointerToFunction(Function *F) { if (void *Addr = getPointerToGlobalIfAvailable(F)) return Addr; // Check if function already code gen'd MutexGuard locked(lock); // Now that this thread owns the lock, check if another thread has already // code gen'd the function. if (void *Addr = getPointerToGlobalIfAvailable(F)) return Addr; // Make sure we read in the function if it exists in this Module. if (F->hasNotBeenReadFromBitcode()) { // Determine the module provider this function is provided by. Module *M = F->getParent(); ModuleProvider *MP = 0; for (unsigned i = 0, e = Modules.size(); i != e; ++i) { if (Modules[i]->getModule() == M) { MP = Modules[i]; break; } } assert(MP && "Function isn't in a module we know about!"); std::string ErrorMsg; if (MP->materializeFunction(F, &ErrorMsg)) { llvm_report_error("Error reading function '" + F->getName()+ "' from bitcode file: " + ErrorMsg); } // Now retry to get the address. if (void *Addr = getPointerToGlobalIfAvailable(F)) return Addr; } if (F->isDeclaration() || F->hasAvailableExternallyLinkage()) { bool AbortOnFailure = !F->hasExternalWeakLinkage(); void *Addr = getPointerToNamedFunction(F->getName(), AbortOnFailure); addGlobalMapping(F, Addr); return Addr; } runJITOnFunctionUnlocked(F, locked); void *Addr = getPointerToGlobalIfAvailable(F); assert(Addr && "Code generation didn't add function to GlobalAddress table!"); return Addr; }
/// getPointerToFunction - This method is used to get the address of the /// specified function, compiling it if neccesary. /// void *JIT::getPointerToFunction(Function *F) { if (void *Addr = getPointerToGlobalIfAvailable(F)) return Addr; // Check if function already code gen'd // Make sure we read in the function if it exists in this Module. if (F->hasNotBeenReadFromBitcode()) { // Determine the module provider this function is provided by. Module *M = F->getParent(); ModuleProvider *MP = 0; for (unsigned i = 0, e = Modules.size(); i != e; ++i) { if (Modules[i]->getModule() == M) { MP = Modules[i]; break; } } assert(MP && "Function isn't in a module we know about!"); std::string ErrorMsg; if (MP->materializeFunction(F, &ErrorMsg)) { cerr << "Error reading function '" << F->getName() << "' from bitcode file: " << ErrorMsg << "\n"; abort(); } } if (void *Addr = getPointerToGlobalIfAvailable(F)) { return Addr; } MutexGuard locked(lock); if (F->isDeclaration()) { void *Addr = getPointerToNamedFunction(F->getName()); addGlobalMapping(F, Addr); return Addr; } runJITOnFunction(F); void *Addr = getPointerToGlobalIfAvailable(F); assert(Addr && "Code generation didn't add function to GlobalAddress table!"); return Addr; }