[ORC] Start migrating ORC layers to use the new ORC Core.h APIs.

In particular this patch switches RTDyldObjectLinkingLayer to use
orc::SymbolResolver and threads the requried changse (ExecutionSession
references and VModuleKeys) through the existing layer APIs.

The purpose of the new resolver interface is to improve query performance and
better support parallelism, both in JIT'd code and within the compiler itself.

The most visibile change is switch of the <Layer>::addModule signatures from:

Expected<Handle> addModule(std::shared_ptr<ModuleType> Mod,
                           std::shared_ptr<JITSymbolResolver> Resolver)

to:

Expected<Handle> addModule(VModuleKey K, std::shared_ptr<ModuleType> Mod);

Typical usage of addModule will now look like:

auto K = ES.allocateVModuleKey();
Resolvers[K] = createSymbolResolver(...);
Layer.addModule(K, std::move(Mod));

See the BuildingAJIT tutorial code for example usage.

llvm-svn: 324405
diff --git a/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp
index 61ce310..4501b53 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp
@@ -59,9 +59,22 @@
 
   DummyCallbackManager CallbackMgr;
 
+  SymbolStringPool SSP;
+  ExecutionSession ES(SSP);
+
+  auto GetResolver =
+      [](orc::VModuleKey) -> std::shared_ptr<llvm::orc::SymbolResolver> {
+    llvm_unreachable("Should never be called");
+  };
+
+  auto SetResolver = [](orc::VModuleKey, std::shared_ptr<orc::SymbolResolver>) {
+    llvm_unreachable("Should never be called");
+  };
+
   llvm::orc::CompileOnDemandLayer<decltype(TestBaseLayer)> COD(
-      TestBaseLayer, [](Function &F) { return std::set<Function *>{&F}; },
-      CallbackMgr, [] { return llvm::make_unique<DummyStubsManager>(); }, true);
+      ES, TestBaseLayer, GetResolver, SetResolver,
+      [](Function &F) { return std::set<Function *>{&F}; }, CallbackMgr,
+      [] { return llvm::make_unique<DummyStubsManager>(); }, true);
 
   auto Sym = COD.findSymbol("foo", true);
 
diff --git a/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp
index 0dba66d..3801fa9 100644
--- a/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp
@@ -15,11 +15,8 @@
 
 struct MockBaseLayer {
   typedef int ModuleHandleT;
-  ModuleHandleT addModule(
-                  std::shared_ptr<llvm::Module>,
-                  std::unique_ptr<llvm::RuntimeDyld::MemoryManager> MemMgr,
-                  std::unique_ptr<llvm::JITSymbolResolver> Resolver) {
-    EXPECT_FALSE(MemMgr);
+  ModuleHandleT addModule(llvm::orc::VModuleKey,
+                          std::shared_ptr<llvm::Module>) {
     return 42;
   }
 };
@@ -27,7 +24,8 @@
 TEST(LazyEmittingLayerTest, Empty) {
   MockBaseLayer M;
   llvm::orc::LazyEmittingLayer<MockBaseLayer> L(M);
-  cantFail(L.addModule(std::unique_ptr<llvm::Module>(), nullptr));
+  cantFail(
+      L.addModule(llvm::orc::VModuleKey(), std::unique_ptr<llvm::Module>()));
 }
 
 }
diff --git a/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp
index 2aa2b48..9de1c22 100644
--- a/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp
@@ -11,7 +11,6 @@
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
-#include "llvm/ExecutionEngine/Orc/NullResolver.h"
 #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
 #include "llvm/ExecutionEngine/SectionMemoryManager.h"
 #include "llvm/Object/ObjectFile.h"
@@ -49,20 +48,16 @@
   MockBaseLayer() : MockSymbol(nullptr) { resetExpectations(); }
 
   template <typename ObjPtrT>
-  llvm::Expected<ObjHandleT>
-  addObject(ObjPtrT Obj,
-            std::shared_ptr<llvm::JITSymbolResolver> Resolver) {
-    EXPECT_EQ(MockResolver, Resolver) << "Resolver should pass through";
+  llvm::Expected<ObjHandleT> addObject(VModuleKey K, ObjPtrT Obj) {
+    EXPECT_EQ(MockKey, K) << "Key should pass through";
     EXPECT_EQ(MockObject + 1, *Obj) << "Transform should be applied";
     LastCalled = "addObject";
     MockObjHandle = 111;
     return MockObjHandle;
   }
 
-  template <typename ObjPtrT>
-  void expectAddObject(ObjPtrT Obj,
-                       std::shared_ptr<llvm::JITSymbolResolver> Resolver) {
-    MockResolver = Resolver;
+  template <typename ObjPtrT> void expectAddObject(VModuleKey K, ObjPtrT Obj) {
+    MockKey = K;
     MockObject = *Obj;
   }
 
@@ -162,7 +157,7 @@
 private:
   // Backing fields for remembering parameter/return values
   std::string LastCalled;
-  std::shared_ptr<llvm::JITSymbolResolver> MockResolver;
+  VModuleKey MockKey;
   MockObjectFile MockObject;
   ObjHandleT MockObjHandle;
   std::string MockName;
@@ -175,7 +170,7 @@
   // Clear remembered parameters between calls
   void resetExpectations() {
     LastCalled = "nothing";
-    MockResolver = nullptr;
+    MockKey = 0;
     MockObject = 0;
     MockObjHandle = 0;
     MockName = "bogus";
@@ -190,6 +185,9 @@
 TEST(ObjectTransformLayerTest, Main) {
   MockBaseLayer M;
 
+  SymbolStringPool SSP;
+  ExecutionSession ES(SSP);
+
   // Create one object transform layer using a transform (as a functor)
   // that allocates new objects, and deals in unique pointers.
   ObjectTransformLayer<MockBaseLayer, AllocatingTransform> T1(M);
@@ -205,16 +203,17 @@
   });
 
   // Test addObject with T1 (allocating)
+  auto K1 = ES.allocateVModule();
   auto Obj1 = std::make_shared<MockObjectFile>(211);
-  auto SR = std::make_shared<NullLegacyResolver>();
-  M.expectAddObject(Obj1, SR);
-  auto H = cantFail(T1.addObject(std::move(Obj1), SR));
+  M.expectAddObject(K1, Obj1);
+  auto H = cantFail(T1.addObject(K1, std::move(Obj1)));
   M.verifyAddObject(H);
 
   // Test addObjectSet with T2 (mutating)
+  auto K2 = ES.allocateVModule();
   auto Obj2 = std::make_shared<MockObjectFile>(222);
-  M.expectAddObject(Obj2, SR);
-  H = cantFail(T2.addObject(Obj2, SR));
+  M.expectAddObject(K2, Obj2);
+  H = cantFail(T2.addObject(K2, Obj2));
   M.verifyAddObject(H);
   EXPECT_EQ(223, *Obj2) << "Expected mutation";
 
@@ -291,9 +290,11 @@
 
   // Construct the jit layers.
   RTDyldObjectLinkingLayer BaseLayer(
-    []() {
-      return std::make_shared<llvm::SectionMemoryManager>();
-    });
+      ES,
+      [](VModuleKey) { return std::make_shared<llvm::SectionMemoryManager>(); },
+      [](VModuleKey) -> std::shared_ptr<SymbolResolver> {
+        llvm_unreachable("Should never be called");
+      });
 
   auto IdentityTransform =
     [](std::shared_ptr<llvm::object::OwningBinary<llvm::object::ObjectFile>>
@@ -311,8 +312,8 @@
 
   // Make sure that the calls from IRCompileLayer to ObjectTransformLayer
   // compile.
-  auto Resolver = std::make_shared<NullLegacyResolver>();
-  cantFail(CompileLayer.addModule(std::shared_ptr<llvm::Module>(), Resolver));
+  cantFail(CompileLayer.addModule(ES.allocateVModule(),
+                                  std::shared_ptr<llvm::Module>()));
 
   // Make sure that the calls from ObjectTransformLayer to ObjectLinkingLayer
   // compile.
diff --git a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
index 8b25ede..3e7d3f6 100644
--- a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
@@ -12,6 +12,7 @@
 #include "llvm/ExecutionEngine/ExecutionEngine.h"
 #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
 #include "llvm/ExecutionEngine/Orc/LambdaResolver.h"
+#include "llvm/ExecutionEngine/Orc/Legacy.h"
 #include "llvm/ExecutionEngine/Orc/NullResolver.h"
 #include "llvm/ExecutionEngine/SectionMemoryManager.h"
 #include "llvm/IR/Constants.h"
@@ -66,7 +67,12 @@
   bool DebugSectionSeen = false;
   auto MM = std::make_shared<MemoryManagerWrapper>(DebugSectionSeen);
 
-  RTDyldObjectLinkingLayer ObjLayer([&MM]() { return MM; });
+  SymbolStringPool SSP;
+  ExecutionSession ES(SSP);
+
+  RTDyldObjectLinkingLayer ObjLayer(
+      ES, [&MM](VModuleKey) { return MM; },
+      [](orc::VModuleKey) { return std::make_shared<NullResolver>(); });
 
   LLVMContext Context;
   auto M = llvm::make_unique<Module>("", Context);
@@ -92,18 +98,9 @@
     std::make_shared<object::OwningBinary<object::ObjectFile>>(
       SimpleCompiler(*TM)(*M));
 
-  auto Resolver =
-    createLambdaResolver(
-      [](const std::string &Name) {
-        return JITSymbol(nullptr);
-      },
-      [](const std::string &Name) {
-        return JITSymbol(nullptr);
-      });
-
   {
     // Test with ProcessAllSections = false (the default).
-    auto H = cantFail(ObjLayer.addObject(Obj, Resolver));
+    auto H = cantFail(ObjLayer.addObject(ES.allocateVModule(), Obj));
     cantFail(ObjLayer.emitAndFinalize(H));
     EXPECT_EQ(DebugSectionSeen, false)
       << "Unexpected debug info section";
@@ -113,7 +110,7 @@
   {
     // Test with ProcessAllSections = true.
     ObjLayer.setProcessAllSections(true);
-    auto H = cantFail(ObjLayer.addObject(Obj, Resolver));
+    auto H = cantFail(ObjLayer.addObject(ES.allocateVModule(), Obj));
     cantFail(ObjLayer.emitAndFinalize(H));
     EXPECT_EQ(DebugSectionSeen, true)
       << "Expected debug info section not seen";
@@ -125,9 +122,22 @@
   if (!TM)
     return;
 
+  SymbolStringPool SSP;
+  ExecutionSession ES(SSP);
+
   auto MM = std::make_shared<SectionMemoryManagerWrapper>();
 
-  RTDyldObjectLinkingLayer ObjLayer([&MM]() { return MM; });
+  std::map<orc::VModuleKey, std::shared_ptr<orc::SymbolResolver>> Resolvers;
+
+  RTDyldObjectLinkingLayer ObjLayer(ES, [&MM](VModuleKey) { return MM; },
+                                    [&](VModuleKey K) {
+                                      auto I = Resolvers.find(K);
+                                      assert(I != Resolvers.end() &&
+                                             "Missing resolver");
+                                      auto R = std::move(I->second);
+                                      Resolvers.erase(I);
+                                      return R;
+                                    });
   SimpleCompiler Compile(*TM);
 
   // Create a pair of modules that will trigger recursive finalization:
@@ -170,19 +180,25 @@
     std::make_shared<object::OwningBinary<object::ObjectFile>>(
       Compile(*MB2.getModule()));
 
-  auto Resolver =
-    createLambdaResolver(
-      [&](const std::string &Name) {
-        if (auto Sym = ObjLayer.findSymbol(Name, true))
-          return Sym;
-        return JITSymbol(nullptr);
+  auto K1 = ES.allocateVModule();
+  Resolvers[K1] = std::make_shared<NullResolver>();
+  cantFail(ObjLayer.addObject(K1, std::move(Obj1)));
+
+  auto K2 = ES.allocateVModule();
+  auto LegacyLookup = [&](const std::string &Name) {
+    return ObjLayer.findSymbol(Name, true);
+  };
+
+  Resolvers[K2] = createSymbolResolver(
+      [&](SymbolFlagsMap &SymbolFlags, const SymbolNameSet &Symbols) {
+        return cantFail(
+            lookupFlagsWithLegacyFn(SymbolFlags, Symbols, LegacyLookup));
       },
-      [](const std::string &Name) {
-        return JITSymbol(nullptr);
+      [&](AsynchronousSymbolQuery &Query, const SymbolNameSet &Symbols) {
+        return lookupWithLegacyFn(Query, Symbols, LegacyLookup);
       });
 
-  cantFail(ObjLayer.addObject(std::move(Obj1), Resolver));
-  auto H = cantFail(ObjLayer.addObject(std::move(Obj2), Resolver));
+  auto H = cantFail(ObjLayer.addObject(K2, std::move(Obj2)));
   cantFail(ObjLayer.emitAndFinalize(H));
   cantFail(ObjLayer.removeObject(H));
 
@@ -196,9 +212,14 @@
   if (!TM)
     return;
 
+  SymbolStringPool SSP;
+  ExecutionSession ES(SSP);
+
   auto MM = std::make_shared<SectionMemoryManagerWrapper>();
 
-  RTDyldObjectLinkingLayer ObjLayer([&MM]() { return MM; });
+  RTDyldObjectLinkingLayer ObjLayer(
+      ES, [&MM](VModuleKey) { return MM; },
+      [](VModuleKey) { return std::make_shared<NullResolver>(); });
   SimpleCompiler Compile(*TM);
 
   // Create a pair of unrelated modules:
@@ -243,9 +264,8 @@
     std::make_shared<object::OwningBinary<object::ObjectFile>>(
       Compile(*MB2.getModule()));
 
-  auto NR = std::make_shared<NullLegacyResolver>();
-  auto H = cantFail(ObjLayer.addObject(std::move(Obj1), NR));
-  cantFail(ObjLayer.addObject(std::move(Obj2), NR));
+  auto H = cantFail(ObjLayer.addObject(ES.allocateVModule(), std::move(Obj1)));
+  cantFail(ObjLayer.addObject(ES.allocateVModule(), std::move(Obj2)));
   cantFail(ObjLayer.emitAndFinalize(H));
   cantFail(ObjLayer.removeObject(H));
 
@@ -256,8 +276,11 @@
 }
 
 TEST_F(RTDyldObjectLinkingLayerExecutionTest, TestNotifyLoadedSignature) {
+  SymbolStringPool SSP;
+  ExecutionSession ES(SSP);
   RTDyldObjectLinkingLayer ObjLayer(
-      []() { return nullptr; },
+      ES, [](VModuleKey) { return nullptr; },
+      [](VModuleKey) { return std::make_shared<NullResolver>(); },
       [](RTDyldObjectLinkingLayer::ObjHandleT,
          const RTDyldObjectLinkingLayer::ObjectPtr &obj,
          const RuntimeDyld::LoadedObjectInfo &info) {});