diff --git a/llvm/examples/ThinLtoJIT/ThinLtoJIT.cpp b/llvm/examples/ThinLtoJIT/ThinLtoJIT.cpp --- a/llvm/examples/ThinLtoJIT/ThinLtoJIT.cpp +++ b/llvm/examples/ThinLtoJIT/ThinLtoJIT.cpp @@ -362,9 +362,13 @@ ModuleNames RemainingPaths; for (auto &KV : ModuleInfoMap) { StringRef Path = KV.first(); - // TODO: Allow to distinguish regular static lookups from lookups for - // transitive dependencies issued by the linker. - RemainingPaths.push_back(Path); + ModuleInfo &MI = KV.second; + if (K == LookupKind::TransitiveStatic && MI.AllCallable) { + if (Error Err = submitCallThroughStubs(Path, std::move(MI))) + return Err; + } else { + RemainingPaths.push_back(Path); + } } // For direct requests and transitive data dependencies, emit reexports. diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Core.h b/llvm/include/llvm/ExecutionEngine/Orc/Core.h --- a/llvm/include/llvm/ExecutionEngine/Orc/Core.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Core.h @@ -86,7 +86,7 @@ /// /// DLSym -- Lookup is being performed as-if at runtime (e.g. generators /// representing static archives should not pull in new definitions). -enum class LookupKind { Static, DLSym }; +enum class LookupKind { Static, DLSym, TransitiveStatic }; /// A list of (JITDylib*, JITDylibLookupFlags) pairs to be used as a search /// order during symbol lookup. diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp --- a/llvm/lib/ExecutionEngine/Orc/Core.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp @@ -225,6 +225,8 @@ return OS << "Static"; case LookupKind::DLSym: return OS << "DLSym"; + case LookupKind::TransitiveStatic: + return OS << "TransitiveStatic"; } llvm_unreachable("Invalid lookup kind"); } diff --git a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp --- a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp @@ -50,7 +50,7 @@ JITDylibSearchOrder SearchOrder; MR.getTargetJITDylib().withSearchOrderDo( [&](const JITDylibSearchOrder &JDs) { SearchOrder = JDs; }); - ES.lookup(LookupKind::Static, SearchOrder, InternedSymbols, + ES.lookup(LookupKind::TransitiveStatic, SearchOrder, InternedSymbols, SymbolState::Resolved, std::move(OnResolvedWithUnwrap), RegisterDependencies); }