[ORC] Add an initial implementation of a replacement CompileOnDemandLayer.
CompileOnDemandLayer2 is a replacement for CompileOnDemandLayer built on the ORC
Core APIs. Functions in added modules are extracted and compiled lazily.
CompileOnDemandLayer2 supports multithreaded JIT'd code, and compilation on
multiple threads.
llvm-svn: 334967
diff --git a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
index 3e5336ca..61e8ee8 100644
--- a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
@@ -54,9 +54,24 @@
auto Info = RTDyld->loadObject(**ObjFile);
{
+ std::set<StringRef> InternalSymbols;
+ for (auto &Sym : (*ObjFile)->symbols()) {
+ if (!(Sym.getFlags() & object::BasicSymbolRef::SF_Global)) {
+ if (auto SymName = Sym.getName())
+ InternalSymbols.insert(*SymName);
+ else {
+ ES.reportError(SymName.takeError());
+ R.failMaterialization();
+ return;
+ }
+ }
+ }
+
SymbolMap Symbols;
for (auto &KV : RTDyld->getSymbolTable())
- Symbols[ES.getSymbolStringPool().intern(KV.first)] = KV.second;
+ if (!InternalSymbols.count(KV.first))
+ Symbols[ES.getSymbolStringPool().intern(KV.first)] = KV.second;
+
R.resolve(Symbols);
}
@@ -74,6 +89,7 @@
ES.reportError(make_error<StringError>(RTDyld->getErrorString(),
inconvertibleErrorCode()));
R.failMaterialization();
+ return;
}
R.finalize();