[llvm] [Orc] Move SymbolStringPool from EPC to ExecutionSession (NFC) (PR #85056)

Stefan Gränitz via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 13 04:02:06 PDT 2024


https://github.com/weliveindetail updated https://github.com/llvm/llvm-project/pull/85056

>From 23a9ec6ce3fa87e0cdaabab420d9f9938f246d0d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20Gr=C3=A4nitz?= <stefan.graenitz at gmail.com>
Date: Wed, 13 Mar 2024 11:02:46 +0100
Subject: [PATCH 1/4] [Orc] Move SymbolStringPool from EPC to ExecutionSession
 (NFC)

---
 llvm/include/llvm/ExecutionEngine/Orc/Core.h  | 10 +++---
 .../Orc/ExecutorProcessControl.h              | 18 +++--------
 .../ExecutionEngine/Orc/SimpleRemoteEPC.h     |  9 ++----
 llvm/lib/ExecutionEngine/Orc/Core.cpp         | 32 ++++++++-----------
 .../Orc/EPCDebugObjectRegistrar.cpp           |  4 +--
 .../Orc/ExecutorProcessControl.cpp            | 23 +++++++------
 llvm/tools/lli/lli.cpp                        |  3 +-
 llvm/tools/llvm-jitlink/llvm-jitlink.cpp      |  1 -
 .../ExecutionEngine/Orc/CoreAPIsTest.cpp      |  3 +-
 .../Orc/ObjectLinkingLayerTest.cpp            |  3 +-
 .../ExecutionEngine/Orc/OrcTestCommon.h       |  3 +-
 11 files changed, 43 insertions(+), 66 deletions(-)

diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Core.h b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
index 45bf9adcf2a4ec..e991f7e6cdb2cb 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/Core.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
@@ -1453,7 +1453,8 @@ class ExecutionSession {
 
   /// Construct an ExecutionSession with the given ExecutorProcessControl
   /// object.
-  ExecutionSession(std::unique_ptr<ExecutorProcessControl> EPC);
+  ExecutionSession(std::unique_ptr<ExecutorProcessControl> EPC,
+                   std::shared_ptr<SymbolStringPool> SSP = nullptr);
 
   /// Destroy an ExecutionSession. Verifies that endSession was called prior to
   /// destruction.
@@ -1474,12 +1475,10 @@ class ExecutionSession {
   size_t getPageSize() const { return EPC->getPageSize(); }
 
   /// Get the SymbolStringPool for this instance.
-  std::shared_ptr<SymbolStringPool> getSymbolStringPool() {
-    return EPC->getSymbolStringPool();
-  }
+  std::shared_ptr<SymbolStringPool> getSymbolStringPool() { return SSP; }
 
   /// Add a symbol name to the SymbolStringPool and return a pointer to it.
-  SymbolStringPtr intern(StringRef SymName) { return EPC->intern(SymName); }
+  SymbolStringPtr intern(StringRef SymName) { return SSP->intern(SymName); }
 
   /// Set the Platform for this ExecutionSession.
   void setPlatform(std::unique_ptr<Platform> P) { this->P = std::move(P); }
@@ -1856,6 +1855,7 @@ class ExecutionSession {
   mutable std::recursive_mutex SessionMutex;
   bool SessionOpen = true;
   std::unique_ptr<ExecutorProcessControl> EPC;
+  std::shared_ptr<SymbolStringPool> SSP;
   std::unique_ptr<Platform> P;
   ErrorReporter ReportError = logErrorsToStdErr;
   DispatchTaskFunction DispatchTask = runOnCurrentThread;
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
index 6468f2dfc11ad0..1673e3a0fe6b59 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
@@ -187,10 +187,7 @@ class ExecutorProcessControl {
     ExecutorAddr JITDispatchContext;
   };
 
-  ExecutorProcessControl(std::shared_ptr<SymbolStringPool> SSP,
-                         std::unique_ptr<TaskDispatcher> D)
-    : SSP(std::move(SSP)), D(std::move(D)) {}
-
+  ExecutorProcessControl(std::unique_ptr<TaskDispatcher> D) : D(std::move(D)) {}
   virtual ~ExecutorProcessControl();
 
   /// Return the ExecutionSession associated with this instance.
@@ -200,11 +197,8 @@ class ExecutorProcessControl {
     return *ES;
   }
 
-  /// Intern a symbol name in the SymbolStringPool.
-  SymbolStringPtr intern(StringRef SymName) { return SSP->intern(SymName); }
-
   /// Return a shared pointer to the SymbolStringPool for this instance.
-  std::shared_ptr<SymbolStringPool> getSymbolStringPool() const { return SSP; }
+  std::shared_ptr<SymbolStringPool> getSymbolStringPool() const;
 
   TaskDispatcher &getDispatcher() { return *D; }
 
@@ -464,11 +458,9 @@ class UnsupportedExecutorProcessControl : public ExecutorProcessControl,
                                           private InProcessMemoryAccess {
 public:
   UnsupportedExecutorProcessControl(
-      std::shared_ptr<SymbolStringPool> SSP = nullptr,
       std::unique_ptr<TaskDispatcher> D = nullptr, const std::string &TT = "",
       unsigned PageSize = 0)
       : ExecutorProcessControl(
-            SSP ? std::move(SSP) : std::make_shared<SymbolStringPool>(),
             D ? std::move(D) : std::make_unique<InPlaceTaskDispatcher>()),
         InProcessMemoryAccess(Triple(TT).isArch64Bit()) {
     this->TargetTriple = Triple(TT);
@@ -512,8 +504,7 @@ class SelfExecutorProcessControl : public ExecutorProcessControl,
                                    private InProcessMemoryAccess {
 public:
   SelfExecutorProcessControl(
-      std::shared_ptr<SymbolStringPool> SSP, std::unique_ptr<TaskDispatcher> D,
-      Triple TargetTriple, unsigned PageSize,
+      std::unique_ptr<TaskDispatcher> D, Triple TargetTriple, unsigned PageSize,
       std::unique_ptr<jitlink::JITLinkMemoryManager> MemMgr);
 
   /// Create a SelfExecutorProcessControl with the given symbol string pool and
@@ -522,8 +513,7 @@ class SelfExecutorProcessControl : public ExecutorProcessControl,
   /// If no memory manager is given a jitlink::InProcessMemoryManager will
   /// be created and used by default.
   static Expected<std::unique_ptr<SelfExecutorProcessControl>>
-  Create(std::shared_ptr<SymbolStringPool> SSP = nullptr,
-         std::unique_ptr<TaskDispatcher> D = nullptr,
+  Create(std::unique_ptr<TaskDispatcher> D = nullptr,
          std::unique_ptr<jitlink::JITLinkMemoryManager> MemMgr = nullptr);
 
   Expected<tpctypes::DylibHandle> loadDylib(const char *DylibPath) override;
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h b/llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h
index c10b8df01cc0a4..4f78fc2f7c4200 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h
@@ -50,9 +50,7 @@ class SimpleRemoteEPC : public ExecutorProcessControl,
   static Expected<std::unique_ptr<SimpleRemoteEPC>>
   Create(std::unique_ptr<TaskDispatcher> D, Setup S,
          TransportTCtorArgTs &&...TransportTCtorArgs) {
-    std::unique_ptr<SimpleRemoteEPC> SREPC(
-        new SimpleRemoteEPC(std::make_shared<SymbolStringPool>(),
-                            std::move(D)));
+    std::unique_ptr<SimpleRemoteEPC> SREPC(new SimpleRemoteEPC(std::move(D)));
     auto T = TransportT::Create(
         *SREPC, std::forward<TransportTCtorArgTs>(TransportTCtorArgs)...);
     if (!T)
@@ -94,9 +92,8 @@ class SimpleRemoteEPC : public ExecutorProcessControl,
   void handleDisconnect(Error Err) override;
 
 private:
-  SimpleRemoteEPC(std::shared_ptr<SymbolStringPool> SSP,
-                  std::unique_ptr<TaskDispatcher> D)
-    : ExecutorProcessControl(std::move(SSP), std::move(D)) {}
+  SimpleRemoteEPC(std::unique_ptr<TaskDispatcher> D)
+      : ExecutorProcessControl(std::move(D)) {}
 
   static Expected<std::unique_ptr<jitlink::JITLinkMemoryManager>>
   createDefaultMemoryManager(SimpleRemoteEPC &SREPC);
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index 37c32f86e8d873..93e4581a356f0e 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -1589,9 +1589,11 @@ void LookupTask::printDescription(raw_ostream &OS) { OS << "Lookup task"; }
 
 void LookupTask::run() { LS.continueLookup(Error::success()); }
 
-ExecutionSession::ExecutionSession(std::unique_ptr<ExecutorProcessControl> EPC)
-    : EPC(std::move(EPC)) {
-  // Associated EPC and this.
+ExecutionSession::ExecutionSession(std::unique_ptr<ExecutorProcessControl> EPC,
+                                   std::shared_ptr<SymbolStringPool> SSP)
+    : EPC(std::move(EPC)),
+      SSP(SSP ? std::move(SSP) : std::make_unique<SymbolStringPool>()) {
+  // Associate EPC with this session.
   this->EPC->ES = this;
 }
 
@@ -2001,8 +2003,7 @@ Error ExecutionSession::removeResourceTracker(ResourceTracker &RT) {
                      L->handleRemoveResources(JD, RT.getKeyUnsafe()));
 
   for (auto &Q : QueriesToFail)
-    Q->handleFailed(
-        make_error<FailedToMaterialize>(getSymbolStringPool(), FailedSymbols));
+    Q->handleFailed(make_error<FailedToMaterialize>(SSP, FailedSymbols));
 
   return Err;
 }
@@ -2075,15 +2076,14 @@ Error ExecutionSession::IL_updateCandidatesFor(
         // weakly referenced" specific error here to reduce confusion.
         if (SymI->second.getFlags().hasMaterializationSideEffectsOnly() &&
             SymLookupFlags != SymbolLookupFlags::WeaklyReferencedSymbol)
-          return make_error<SymbolsNotFound>(getSymbolStringPool(),
-                                             SymbolNameVector({Name}));
+          return make_error<SymbolsNotFound>(SSP, SymbolNameVector({Name}));
 
         // If we matched against this symbol but it is in the error state
         // then bail out and treat it as a failure to materialize.
         if (SymI->second.getFlags().hasError()) {
           auto FailedSymbolsMap = std::make_shared<SymbolDependenceMap>();
           (*FailedSymbolsMap)[&JD] = {Name};
-          return make_error<FailedToMaterialize>(getSymbolStringPool(),
+          return make_error<FailedToMaterialize>(SSP,
                                                  std::move(FailedSymbolsMap));
         }
 
@@ -2341,7 +2341,7 @@ void ExecutionSession::OL_applyQueryPhase1(
   } else {
     LLVM_DEBUG(dbgs() << "Phase 1 failed with unresolved symbols.\n");
     IPLS->fail(make_error<SymbolsNotFound>(
-        getSymbolStringPool(), IPLS->DefGeneratorCandidates.getSymbolNames()));
+        SSP, IPLS->DefGeneratorCandidates.getSymbolNames()));
   }
 }
 
@@ -2411,8 +2411,7 @@ void ExecutionSession::OL_completeLookup(
                 dbgs() << "error: "
                           "required, but symbol is has-side-effects-only\n";
               });
-              return make_error<SymbolsNotFound>(getSymbolStringPool(),
-                                                 SymbolNameVector({Name}));
+              return make_error<SymbolsNotFound>(SSP, SymbolNameVector({Name}));
             }
 
             // If we matched against this symbol but it is in the error state
@@ -2422,7 +2421,7 @@ void ExecutionSession::OL_completeLookup(
               auto FailedSymbolsMap = std::make_shared<SymbolDependenceMap>();
               (*FailedSymbolsMap)[&JD] = {Name};
               return make_error<FailedToMaterialize>(
-                  getSymbolStringPool(), std::move(FailedSymbolsMap));
+                  SSP, std::move(FailedSymbolsMap));
             }
 
             // Otherwise this is a match.
@@ -2526,8 +2525,7 @@ void ExecutionSession::OL_completeLookup(
 
     if (!IPLS->LookupSet.empty()) {
       LLVM_DEBUG(dbgs() << "Failing due to unresolved symbols\n");
-      return make_error<SymbolsNotFound>(getSymbolStringPool(),
-                                         IPLS->LookupSet.getSymbolNames());
+      return make_error<SymbolsNotFound>(SSP, IPLS->LookupSet.getSymbolNames());
     }
 
     // Record whether the query completed.
@@ -2652,8 +2650,7 @@ void ExecutionSession::OL_completeLookupFlags(
 
     if (!IPLS->LookupSet.empty()) {
       LLVM_DEBUG(dbgs() << "Failing due to unresolved symbols\n");
-      return make_error<SymbolsNotFound>(getSymbolStringPool(),
-                                         IPLS->LookupSet.getSymbolNames());
+      return make_error<SymbolsNotFound>(SSP, IPLS->LookupSet.getSymbolNames());
     }
 
     LLVM_DEBUG(dbgs() << "Succeded, result = " << Result << "\n");
@@ -3465,8 +3462,7 @@ void ExecutionSession::OL_notifyFailed(MaterializationResponsibility &MR) {
   });
 
   for (auto &Q : FailedQueries)
-    Q->handleFailed(
-        make_error<FailedToMaterialize>(getSymbolStringPool(), FailedSymbols));
+    Q->handleFailed(make_error<FailedToMaterialize>(SSP, FailedSymbols));
 }
 
 Error ExecutionSession::OL_replace(MaterializationResponsibility &MR,
diff --git a/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp b/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp
index acd7e5a409fc57..7d483191a46253 100644
--- a/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/EPCDebugObjectRegistrar.cpp
@@ -30,8 +30,8 @@ Expected<std::unique_ptr<EPCDebugObjectRegistrar>> createJITLoaderGDBRegistrar(
 
   SymbolStringPtr RegisterFn =
       EPC.getTargetTriple().isOSBinFormatMachO()
-          ? EPC.intern("_llvm_orc_registerJITLoaderGDBWrapper")
-          : EPC.intern("llvm_orc_registerJITLoaderGDBWrapper");
+          ? ES.intern("_llvm_orc_registerJITLoaderGDBWrapper")
+          : ES.intern("llvm_orc_registerJITLoaderGDBWrapper");
 
   SymbolLookupSet RegistrationSymbols;
   RegistrationSymbols.add(RegisterFn);
diff --git a/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp b/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp
index efafca949e61ef..ff9cba7ea9995d 100644
--- a/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp
@@ -25,11 +25,16 @@ ExecutorProcessControl::MemoryAccess::~MemoryAccess() = default;
 
 ExecutorProcessControl::~ExecutorProcessControl() = default;
 
+std::shared_ptr<SymbolStringPool>
+ExecutorProcessControl::getSymbolStringPool() const {
+  assert(ES && "Create an ExecutionSession with this EPC first");
+  return ES->getSymbolStringPool();
+}
+
 SelfExecutorProcessControl::SelfExecutorProcessControl(
-    std::shared_ptr<SymbolStringPool> SSP, std::unique_ptr<TaskDispatcher> D,
-    Triple TargetTriple, unsigned PageSize,
+    std::unique_ptr<TaskDispatcher> D, Triple TargetTriple, unsigned PageSize,
     std::unique_ptr<jitlink::JITLinkMemoryManager> MemMgr)
-    : ExecutorProcessControl(std::move(SSP), std::move(D)),
+    : ExecutorProcessControl(std::move(D)),
       InProcessMemoryAccess(TargetTriple.isArch64Bit()) {
 
   OwnedMemMgr = std::move(MemMgr);
@@ -54,13 +59,8 @@ SelfExecutorProcessControl::SelfExecutorProcessControl(
 
 Expected<std::unique_ptr<SelfExecutorProcessControl>>
 SelfExecutorProcessControl::Create(
-    std::shared_ptr<SymbolStringPool> SSP,
     std::unique_ptr<TaskDispatcher> D,
     std::unique_ptr<jitlink::JITLinkMemoryManager> MemMgr) {
-
-  if (!SSP)
-    SSP = std::make_shared<SymbolStringPool>();
-
   if (!D) {
 #if LLVM_ENABLE_THREADS
     D = std::make_unique<DynamicThreadPoolTaskDispatcher>();
@@ -76,8 +76,7 @@ SelfExecutorProcessControl::Create(
   Triple TT(sys::getProcessTriple());
 
   return std::make_unique<SelfExecutorProcessControl>(
-      std::move(SSP), std::move(D), std::move(TT), *PageSize,
-      std::move(MemMgr));
+      std::move(D), std::move(TT), *PageSize, std::move(MemMgr));
 }
 
 Expected<tpctypes::DylibHandle>
@@ -106,8 +105,8 @@ void SelfExecutorProcessControl::lookupSymbolsAsync(
         // FIXME: Collect all failing symbols before erroring out.
         SymbolNameVector MissingSymbols;
         MissingSymbols.push_back(Sym);
-        return Complete(
-            make_error<SymbolsNotFound>(SSP, std::move(MissingSymbols)));
+        return Complete(make_error<SymbolsNotFound>(ES->getSymbolStringPool(),
+                                                    std::move(MissingSymbols)));
       }
       // FIXME: determine accurate JITSymbolFlags.
       R.back().push_back(
diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp
index 25f43a4bb6811b..348caab9608ee4 100644
--- a/llvm/tools/lli/lli.cpp
+++ b/llvm/tools/lli/lli.cpp
@@ -1024,8 +1024,7 @@ int runOrcJIT(const char *ProgName) {
 
   std::unique_ptr<orc::ExecutorProcessControl> EPC = nullptr;
   if (JITLinker == JITLinkerKind::JITLink) {
-    EPC = ExitOnErr(orc::SelfExecutorProcessControl::Create(
-        std::make_shared<orc::SymbolStringPool>()));
+    EPC = ExitOnErr(orc::SelfExecutorProcessControl::Create());
 
     Builder.getJITTargetMachineBuilder()
         ->setRelocationModel(Reloc::PIC_)
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
index 09b2a5900eb0b7..b6c0c319e4548c 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
@@ -936,7 +936,6 @@ Expected<std::unique_ptr<Session>> Session::Create(Triple TT,
     if (!PageSize)
       return PageSize.takeError();
     EPC = std::make_unique<SelfExecutorProcessControl>(
-        std::make_shared<SymbolStringPool>(),
         std::make_unique<InPlaceTaskDispatcher>(), std::move(TT), *PageSize,
         createInProcessMemoryManager());
   }
diff --git a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
index 5e2b5f35bcf471..28da8952e08069 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
@@ -1711,8 +1711,7 @@ TEST_F(CoreAPIsStandardTest, RemoveJITDylibs) {
 TEST(CoreAPIsExtraTest, SessionTeardownByFailedToMaterialize) {
 
   auto RunTestCase = []() -> Error {
-    ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>(
-        std::make_shared<SymbolStringPool>())};
+    ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
     auto Foo = ES.intern("foo");
     auto FooFlags = JITSymbolFlags::Exported;
 
diff --git a/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp
index 7ab3e40df7459d..3b073b684687d7 100644
--- a/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp
@@ -182,8 +182,7 @@ TEST(ObjectLinkingLayerSearchGeneratorTest, AbsoluteSymbolsObjectLayer) {
   class TestEPC : public UnsupportedExecutorProcessControl {
   public:
     TestEPC()
-        : UnsupportedExecutorProcessControl(nullptr, nullptr,
-                                            "x86_64-apple-darwin") {}
+        : UnsupportedExecutorProcessControl(nullptr, "x86_64-apple-darwin") {}
 
     Expected<tpctypes::DylibHandle> loadDylib(const char *DylibPath) override {
       return ExecutorAddr::fromPtr((void *)nullptr);
diff --git a/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h b/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
index ce7da76c9653a3..2e5ce50d2fea2a 100644
--- a/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
+++ b/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
@@ -52,8 +52,7 @@ class CoreAPIsBasedStandardTest : public testing::Test {
   }
 
 protected:
-  std::shared_ptr<SymbolStringPool> SSP = std::make_shared<SymbolStringPool>();
-  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>(SSP)};
+  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
   JITDylib &JD = ES.createBareJITDylib("JD");
   SymbolStringPtr Foo = ES.intern("foo");
   SymbolStringPtr Bar = ES.intern("bar");

>From 573733ac30aa8b51122a507c92d700213f4596e6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20Gr=C3=A4nitz?= <stefan.graenitz at gmail.com>
Date: Wed, 13 Mar 2024 11:11:57 +0100
Subject: [PATCH 2/4] Drop SSP default value (optional)

---
 .../Kaleidoscope/include/KaleidoscopeJIT.h       |  4 +++-
 llvm/lib/ExecutionEngine/Orc/LLJIT.cpp           | 10 ++++++----
 llvm/tools/lli/lli.cpp                           |  3 ++-
 llvm/tools/llvm-jitlink/llvm-jitlink.cpp         |  2 +-
 .../ExecutionEngine/Orc/CoreAPIsTest.cpp         | 16 ++++++++++++----
 .../ExecutionSessionWrapperFunctionCallsTest.cpp | 12 ++++++++----
 .../Orc/ObjectLinkingLayerTest.cpp               |  6 ++++--
 .../ExecutionEngine/Orc/OrcTestCommon.h          |  4 +++-
 .../Orc/RTDyldObjectLinkingLayerTest.cpp         | 12 +++++++++---
 9 files changed, 48 insertions(+), 21 deletions(-)

diff --git a/llvm/examples/Kaleidoscope/include/KaleidoscopeJIT.h b/llvm/examples/Kaleidoscope/include/KaleidoscopeJIT.h
index 778437cd8a3d65..163f0833edd043 100644
--- a/llvm/examples/Kaleidoscope/include/KaleidoscopeJIT.h
+++ b/llvm/examples/Kaleidoscope/include/KaleidoscopeJIT.h
@@ -71,7 +71,9 @@ class KaleidoscopeJIT {
     if (!EPC)
       return EPC.takeError();
 
-    auto ES = std::make_unique<ExecutionSession>(std::move(*EPC));
+    auto SSP = std::make_shared<SymbolStringPool>();
+    auto ES =
+        std::make_unique<ExecutionSession>(std::move(*EPC), std::move(SSP));
 
     JITTargetMachineBuilder JTMB(
         ES->getExecutorProcessControl().getTargetTriple());
diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
index 79adda5b7bc034..e01607ea4879bb 100644
--- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
@@ -936,12 +936,14 @@ LLJIT::LLJIT(LLJITBuilderState &S, Error &Err)
   assert(!(S.EPC && S.ES) && "EPC and ES should not both be set");
 
   if (S.EPC) {
-    ES = std::make_unique<ExecutionSession>(std::move(S.EPC));
-  } else if (S.ES)
+    auto SSP = std::make_shared<SymbolStringPool>();
+    ES = std::make_unique<ExecutionSession>(std::move(S.EPC), std::move(SSP));
+  } else if (S.ES) {
     ES = std::move(S.ES);
-  else {
+  } else {
     if (auto EPC = SelfExecutorProcessControl::Create()) {
-      ES = std::make_unique<ExecutionSession>(std::move(*EPC));
+      auto SSP = std::make_shared<SymbolStringPool>();
+      ES = std::make_unique<ExecutionSession>(std::move(*EPC), std::move(SSP));
     } else {
       Err = EPC.takeError();
       return;
diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp
index 348caab9608ee4..aa993eaaecb616 100644
--- a/llvm/tools/lli/lli.cpp
+++ b/llvm/tools/lli/lli.cpp
@@ -964,7 +964,8 @@ int runOrcJIT(const char *ProgName) {
   // unsupported architectures).
   if (UseJITKind != JITKind::OrcLazy) {
     auto ES = std::make_unique<orc::ExecutionSession>(
-        ExitOnErr(orc::SelfExecutorProcessControl::Create()));
+        ExitOnErr(orc::SelfExecutorProcessControl::Create()),
+        std::make_shared<orc::SymbolStringPool>());
     Builder.setLazyCallthroughManager(
         std::make_unique<orc::LazyCallThroughManager>(*ES, orc::ExecutorAddr(),
                                                       nullptr));
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
index b6c0c319e4548c..05811e15a8f010 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
@@ -954,7 +954,7 @@ Session::~Session() {
 }
 
 Session::Session(std::unique_ptr<ExecutorProcessControl> EPC, Error &Err)
-    : ES(std::move(EPC)),
+    : ES(std::move(EPC), std::make_shared<SymbolStringPool>()),
       ObjLayer(ES, ES.getExecutorProcessControl().getMemMgr()) {
 
   /// Local ObjectLinkingLayer::Plugin class to forward modifyPassConfig to the
diff --git a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
index 28da8952e08069..9be44d8a1ac54a 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
@@ -1561,7 +1561,9 @@ TEST(JITDylibTest, GetDFSLinkOrderTree) {
   // Test that DFS ordering behaves as expected when the linkage relationships
   // form a tree.
 
-  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
+  auto SSP = std::make_shared<SymbolStringPool>();
+  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>(),
+                      SSP};
   auto _ = make_scope_exit([&]() { cantFail(ES.endSession()); });
 
   auto &LibA = ES.createBareJITDylib("A");
@@ -1603,7 +1605,9 @@ TEST(JITDylibTest, GetDFSLinkOrderDiamond) {
   // Test that DFS ordering behaves as expected when the linkage relationships
   // contain a diamond.
 
-  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
+  auto SSP = std::make_shared<SymbolStringPool>();
+  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>(),
+                      SSP};
   auto _ = make_scope_exit([&]() { cantFail(ES.endSession()); });
 
   auto &LibA = ES.createBareJITDylib("A");
@@ -1627,7 +1631,9 @@ TEST(JITDylibTest, GetDFSLinkOrderCycle) {
   // Test that DFS ordering behaves as expected when the linkage relationships
   // contain a cycle.
 
-  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
+  auto SSP = std::make_shared<SymbolStringPool>();
+  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>(),
+                      SSP};
   auto _ = make_scope_exit([&]() { cantFail(ES.endSession()); });
 
   auto &LibA = ES.createBareJITDylib("A");
@@ -1711,7 +1717,9 @@ TEST_F(CoreAPIsStandardTest, RemoveJITDylibs) {
 TEST(CoreAPIsExtraTest, SessionTeardownByFailedToMaterialize) {
 
   auto RunTestCase = []() -> Error {
-    ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
+    auto SSP = std::make_shared<SymbolStringPool>();
+    ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>(),
+                        SSP};
     auto Foo = ES.intern("foo");
     auto FooFlags = JITSymbolFlags::Exported;
 
diff --git a/llvm/unittests/ExecutionEngine/Orc/ExecutionSessionWrapperFunctionCallsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/ExecutionSessionWrapperFunctionCallsTest.cpp
index 1b79e12ee168c8..02113f304b1774 100644
--- a/llvm/unittests/ExecutionEngine/Orc/ExecutionSessionWrapperFunctionCallsTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/ExecutionSessionWrapperFunctionCallsTest.cpp
@@ -36,7 +36,8 @@ voidWrapper(const char *ArgData, size_t ArgSize) {
 }
 
 TEST(ExecutionSessionWrapperFunctionCalls, RunWrapperTemplate) {
-  ExecutionSession ES(cantFail(SelfExecutorProcessControl::Create()));
+  auto SSP = std::make_shared<SymbolStringPool>();
+  ExecutionSession ES(cantFail(SelfExecutorProcessControl::Create()), SSP);
 
   int32_t Result;
   EXPECT_THAT_ERROR(ES.callSPSWrapper<int32_t(int32_t, int32_t)>(
@@ -47,7 +48,8 @@ TEST(ExecutionSessionWrapperFunctionCalls, RunWrapperTemplate) {
 }
 
 TEST(ExecutionSessionWrapperFunctionCalls, RunVoidWrapperAsyncTemplate) {
-  ExecutionSession ES(cantFail(SelfExecutorProcessControl::Create()));
+  auto SSP = std::make_shared<SymbolStringPool>();
+  ExecutionSession ES(cantFail(SelfExecutorProcessControl::Create()), SSP);
 
   std::promise<MSVCPError> RP;
   ES.callSPSWrapperAsync<void()>(ExecutorAddr::fromPtr(voidWrapper),
@@ -60,7 +62,8 @@ TEST(ExecutionSessionWrapperFunctionCalls, RunVoidWrapperAsyncTemplate) {
 }
 
 TEST(ExecutionSessionWrapperFunctionCalls, RunNonVoidWrapperAsyncTemplate) {
-  ExecutionSession ES(cantFail(SelfExecutorProcessControl::Create()));
+  auto SSP = std::make_shared<SymbolStringPool>();
+  ExecutionSession ES(cantFail(SelfExecutorProcessControl::Create()), SSP);
 
   std::promise<MSVCPExpected<int32_t>> RP;
   ES.callSPSWrapperAsync<int32_t(int32_t, int32_t)>(
@@ -80,7 +83,8 @@ TEST(ExecutionSessionWrapperFunctionCalls, RegisterAsyncHandlerAndRun) {
 
   constexpr ExecutorAddr AddAsyncTagAddr(0x01);
 
-  ExecutionSession ES(cantFail(SelfExecutorProcessControl::Create()));
+  auto SSP = std::make_shared<SymbolStringPool>();
+  ExecutionSession ES(cantFail(SelfExecutorProcessControl::Create()), SSP);
   auto &JD = ES.createBareJITDylib("JD");
 
   auto AddAsyncTag = ES.intern("addAsync_tag");
diff --git a/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp
index 3b073b684687d7..7106d12012f3ff 100644
--- a/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/ObjectLinkingLayerTest.cpp
@@ -37,7 +37,8 @@ class ObjectLinkingLayerTest : public testing::Test {
   }
 
 protected:
-  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
+  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>(),
+                      std::make_shared<SymbolStringPool>()};
   JITDylib &JD = ES.createBareJITDylib("main");
   ObjectLinkingLayer ObjLinkingLayer{
       ES, std::make_unique<InProcessMemoryManager>(4096)};
@@ -208,7 +209,8 @@ TEST(ObjectLinkingLayerSearchGeneratorTest, AbsoluteSymbolsObjectLayer) {
     }
   };
 
-  ExecutionSession ES{std::make_unique<TestEPC>()};
+  auto SSP = std::make_shared<SymbolStringPool>();
+  ExecutionSession ES{std::make_unique<TestEPC>(), SSP};
   JITDylib &JD = ES.createBareJITDylib("main");
   ObjectLinkingLayer ObjLinkingLayer{
       ES, std::make_unique<InProcessMemoryManager>(4096)};
diff --git a/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h b/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
index 2e5ce50d2fea2a..cfcc01f88bab59 100644
--- a/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
+++ b/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
@@ -52,7 +52,9 @@ class CoreAPIsBasedStandardTest : public testing::Test {
   }
 
 protected:
-  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
+  std::shared_ptr<SymbolStringPool> SSP = std::make_shared<SymbolStringPool>();
+  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>(),
+                      SSP};
   JITDylib &JD = ES.createBareJITDylib("JD");
   SymbolStringPtr Foo = ES.intern("foo");
   SymbolStringPtr Bar = ES.intern("bar");
diff --git a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
index 82d6968ea9874e..124c59701ffb3b 100644
--- a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
@@ -46,7 +46,9 @@ static bool testSetProcessAllSections(std::unique_ptr<MemoryBuffer> Obj,
 
   bool NonAllocSectionSeen = false;
 
-  ExecutionSession ES(std::make_unique<UnsupportedExecutorProcessControl>());
+  std::shared_ptr<SymbolStringPool> SSP = std::make_shared<SymbolStringPool>();
+  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>(),
+                      SSP};
   auto &JD = ES.createBareJITDylib("main");
   auto Foo = ES.intern("foo");
 
@@ -153,7 +155,9 @@ TEST(RTDyldObjectLinkingLayerTest, TestOverrideObjectFlags) {
   }
 
   // Create a simple stack and set the override flags option.
-  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
+  std::shared_ptr<SymbolStringPool> SSP = std::make_shared<SymbolStringPool>();
+  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>(),
+                      SSP};
   auto &JD = ES.createBareJITDylib("main");
   auto Foo = ES.intern("foo");
   RTDyldObjectLinkingLayer ObjLayer(
@@ -223,7 +227,9 @@ TEST(RTDyldObjectLinkingLayerTest, TestAutoClaimResponsibilityForSymbols) {
   }
 
   // Create a simple stack and set the override flags option.
-  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
+  std::shared_ptr<SymbolStringPool> SSP = std::make_shared<SymbolStringPool>();
+  ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>(),
+                      SSP};
   auto &JD = ES.createBareJITDylib("main");
   auto Foo = ES.intern("foo");
   RTDyldObjectLinkingLayer ObjLayer(

>From e93e9a676858728626bd8951c6e6468e613d9022 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20Gr=C3=A4nitz?= <stefan.graenitz at gmail.com>
Date: Wed, 13 Mar 2024 11:39:58 +0100
Subject: [PATCH 3/4] fixup! [Orc] Move SymbolStringPool from EPC to
 ExecutionSession (NFC)

---
 .../llvm/ExecutionEngine/Orc/ExecutorProcessControl.h  | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
index 1673e3a0fe6b59..392ca7b20eaa91 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
@@ -457,11 +457,11 @@ class InProcessMemoryAccess : public ExecutorProcessControl::MemoryAccess {
 class UnsupportedExecutorProcessControl : public ExecutorProcessControl,
                                           private InProcessMemoryAccess {
 public:
-  UnsupportedExecutorProcessControl(
-      std::unique_ptr<TaskDispatcher> D = nullptr, const std::string &TT = "",
-      unsigned PageSize = 0)
-      : ExecutorProcessControl(
-            D ? std::move(D) : std::make_unique<InPlaceTaskDispatcher>()),
+  UnsupportedExecutorProcessControl(std::unique_ptr<TaskDispatcher> D = nullptr,
+                                    const std::string &TT = "",
+                                    unsigned PageSize = 0)
+      : ExecutorProcessControl(D ? std::move(D)
+                                 : std::make_unique<InPlaceTaskDispatcher>()),
         InProcessMemoryAccess(Triple(TT).isArch64Bit()) {
     this->TargetTriple = Triple(TT);
     this->PageSize = PageSize;

>From 2690c990a337a479ff26ba0dd67c9a72f62b7e63 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20Gr=C3=A4nitz?= <stefan.graenitz at gmail.com>
Date: Wed, 13 Mar 2024 12:01:31 +0100
Subject: [PATCH 4/4] fixup! Drop SSP default value (optional)

---
 llvm/include/llvm/ExecutionEngine/Orc/Core.h                   | 2 +-
 llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h | 2 --
 2 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Core.h b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
index e991f7e6cdb2cb..d33f16a11e7f93 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/Core.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
@@ -1454,7 +1454,7 @@ class ExecutionSession {
   /// Construct an ExecutionSession with the given ExecutorProcessControl
   /// object.
   ExecutionSession(std::unique_ptr<ExecutorProcessControl> EPC,
-                   std::shared_ptr<SymbolStringPool> SSP = nullptr);
+                   std::shared_ptr<SymbolStringPool> SSP);
 
   /// Destroy an ExecutionSession. Verifies that endSession was called prior to
   /// destruction.
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
index 392ca7b20eaa91..d504c71a53da83 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
@@ -413,8 +413,6 @@ class ExecutorProcessControl {
   virtual Error disconnect() = 0;
 
 protected:
-
-  std::shared_ptr<SymbolStringPool> SSP;
   std::unique_ptr<TaskDispatcher> D;
   ExecutionSession *ES = nullptr;
   Triple TargetTriple;



More information about the llvm-commits mailing list