SymbolNameSet DynamicLibrarySearchGenerator:: operator()(JITDylib &JD, const SymbolNameSet &Names) { orc::SymbolNameSet Added; orc::SymbolMap NewSymbols; bool HasGlobalPrefix = (GlobalPrefix != '\0'); for (auto &Name : Names) { if ((*Name).empty()) continue; if (Allow && !Allow(Name)) continue; if (HasGlobalPrefix && (*Name).front() != GlobalPrefix) continue; std::string Tmp((*Name).data() + (HasGlobalPrefix ? 1 : 0), (*Name).size()); if (void *Addr = Dylib.getAddressOfSymbol(Tmp.c_str())) { Added.insert(Name); NewSymbols[Name] = JITEvaluatedSymbol( static_cast<JITTargetAddress>(reinterpret_cast<uintptr_t>(Addr)), JITSymbolFlags::Exported); } } // Add any new symbols to JD. Since the generator is only called for symbols // that are not already defined, this will never trigger a duplicate // definition error, so we can wrap this call in a 'cantFail'. if (!NewSymbols.empty()) cantFail(JD.define(absoluteSymbols(std::move(NewSymbols)))); return Added; }
void OrcMCJITReplacement::runStaticConstructorsDestructors(bool isDtors) { auto &CtorDtorsMap = isDtors ? UnexecutedDestructors : UnexecutedConstructors; for (auto &KV : CtorDtorsMap) cantFail(CtorDtorRunner<LazyEmitLayerT>(std::move(KV.second), KV.first) .runViaLayer(LazyEmitLayer)); CtorDtorsMap.clear(); }
Expected<JITTargetAddress> JITCompileCallbackManager::getCompileCallback(CompileFunction Compile) { if (auto TrampolineAddr = getAvailableTrampolineAddr()) { auto CallbackName = ES.getSymbolStringPool().intern( std::string("cc") + std::to_string(++NextCallbackId)); std::lock_guard<std::mutex> Lock(CCMgrMutex); AddrToSymbol[*TrampolineAddr] = CallbackName; cantFail(CallbacksJD.define( llvm::make_unique<CompileCallbackMaterializationUnit>( std::move(CallbackName), std::move(Compile)))); return *TrampolineAddr; } else return TrampolineAddr.takeError(); }
ThreadSafeModule cloneToNewContext(ThreadSafeModule &TSM, GVPredicate ShouldCloneDef, GVModifier UpdateClonedDefSource) { assert(TSM && "Can not clone null module"); if (!ShouldCloneDef) ShouldCloneDef = [](const GlobalValue &) { return true; }; auto Lock = TSM.getContextLock(); SmallVector<char, 1> ClonedModuleBuffer; { std::set<GlobalValue *> ClonedDefsInSrc; ValueToValueMapTy VMap; auto Tmp = CloneModule(*TSM.getModule(), VMap, [&](const GlobalValue *GV) { if (ShouldCloneDef(*GV)) { ClonedDefsInSrc.insert(const_cast<GlobalValue *>(GV)); return true; } return false; }); if (UpdateClonedDefSource) for (auto *GV : ClonedDefsInSrc) UpdateClonedDefSource(*GV); BitcodeWriter BCWriter(ClonedModuleBuffer); BCWriter.writeModule(*Tmp); BCWriter.writeSymtab(); BCWriter.writeStrtab(); } MemoryBufferRef ClonedModuleBufferRef( StringRef(ClonedModuleBuffer.data(), ClonedModuleBuffer.size()), "cloned module buffer"); ThreadSafeContext NewTSCtx(llvm::make_unique<LLVMContext>()); auto ClonedModule = cantFail(parseBitcodeFile(ClonedModuleBufferRef, *NewTSCtx.getContext())); ClonedModule->setModuleIdentifier(TSM.getModule()->getName()); return ThreadSafeModule(std::move(ClonedModule), std::move(NewTSCtx)); }