[llvm] 060319a - [ORC] Add a generic bootstrap key-value store to SimpleRemoteEPC.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 2 10:27:13 PDT 2023


Author: Lang Hames
Date: 2023-04-02T10:27:06-07:00
New Revision: 060319a278202725687f0a74f3e0f0ab57df452c

URL: https://github.com/llvm/llvm-project/commit/060319a278202725687f0a74f3e0f0ab57df452c
DIFF: https://github.com/llvm/llvm-project/commit/060319a278202725687f0a74f3e0f0ab57df452c.diff

LOG: [ORC] Add a generic bootstrap key-value store to SimpleRemoteEPC.

SimpleRemoteEPC already included a "bootstrap symbols map" that could be used
to communicate the addresses of symbols needed for JIT bootstrap. The new
bootstrap map can be used to communicate arbitrary bootstrap values (encoded as
SPS buffers).

The bootstrap symbols map is kept as distinct becasue bootstrap symbols are
significant, and having a known value type for them allows for better debug
logging (we know how to render the values) and tooling (e.g. utils for adding
all bootstrap symbols to a JITDylib).

Added: 
    

Modified: 
    llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
    llvm/include/llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h
    llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h
    llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp
    llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
index cf11c35a12d37..49ae55bac1ab7 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/ExecutorProcessControl.h
@@ -218,6 +218,29 @@ class ExecutorProcessControl {
     return *MemMgr;
   }
 
+  /// Returns the bootstrap map.
+  const StringMap<std::vector<char>> &getBootstrapMap() const {
+    return BootstrapMap;
+  }
+
+  /// Look up and SPS-deserialize a bootstrap map value.
+  ///
+  ///
+  template <typename T, typename SPSTagT>
+  std::optional<Expected<T>> getBootstrapMapValue(StringRef Key) const {
+    auto I = BootstrapMap.find(Key);
+    if (I == BootstrapMap.end())
+      return std::nullopt;
+
+    T Val;
+    shared::SPSInputBuffer IB(I->second.data(), I->second.size());
+    if (!shared::SPSArgList<SPSTagT>::deserialize(IB, Val))
+      return make_error<StringError>("Could not deserialize value for key " +
+                                         Key,
+                                     inconvertibleErrorCode());
+    return Val;
+  }
+
   /// Returns the bootstrap symbol map.
   const StringMap<ExecutorAddr> &getBootstrapSymbolsMap() const {
     return BootstrapSymbols;
@@ -372,6 +395,7 @@ class ExecutorProcessControl {
   JITDispatchInfo JDI;
   MemoryAccess *MemAccess = nullptr;
   jitlink::JITLinkMemoryManager *MemMgr = nullptr;
+  StringMap<std::vector<char>> BootstrapMap;
   StringMap<ExecutorAddr> BootstrapSymbols;
 };
 

diff  --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h
index 9e074ed1f931e..ee3919c733409 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h
@@ -45,6 +45,7 @@ enum class SimpleRemoteEPCOpcode : uint8_t {
 struct SimpleRemoteEPCExecutorInfo {
   std::string TargetTriple;
   uint64_t PageSize;
+  StringMap<std::vector<char>> BootstrapMap;
   StringMap<ExecutorAddr> BootstrapSymbols;
 };
 
@@ -161,6 +162,7 @@ using SPSRemoteSymbolLookup = SPSTuple<uint64_t, SPSRemoteSymbolLookupSet>;
 /// Tuple containing target triple, page size, and bootstrap symbols.
 using SPSSimpleRemoteEPCExecutorInfo =
     SPSTuple<SPSString, uint64_t,
+             SPSSequence<SPSTuple<SPSString, SPSSequence<char>>>,
              SPSSequence<SPSTuple<SPSString, SPSExecutorAddr>>>;
 
 template <>
@@ -206,18 +208,18 @@ class SPSSerializationTraits<SPSSimpleRemoteEPCExecutorInfo,
 public:
   static size_t size(const SimpleRemoteEPCExecutorInfo &SI) {
     return SPSSimpleRemoteEPCExecutorInfo::AsArgList ::size(
-        SI.TargetTriple, SI.PageSize, SI.BootstrapSymbols);
+        SI.TargetTriple, SI.PageSize, SI.BootstrapMap, SI.BootstrapSymbols);
   }
 
   static bool serialize(SPSOutputBuffer &OB,
                         const SimpleRemoteEPCExecutorInfo &SI) {
     return SPSSimpleRemoteEPCExecutorInfo::AsArgList ::serialize(
-        OB, SI.TargetTriple, SI.PageSize, SI.BootstrapSymbols);
+        OB, SI.TargetTriple, SI.PageSize, SI.BootstrapMap, SI.BootstrapSymbols);
   }
 
   static bool deserialize(SPSInputBuffer &IB, SimpleRemoteEPCExecutorInfo &SI) {
     return SPSSimpleRemoteEPCExecutorInfo::AsArgList ::deserialize(
-        IB, SI.TargetTriple, SI.PageSize, SI.BootstrapSymbols);
+        IB, SI.TargetTriple, SI.PageSize, SI.BootstrapMap, SI.BootstrapSymbols);
   }
 };
 

diff  --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h
index afd3d39dbb53a..07f01ecb68a48 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.h
@@ -64,6 +64,17 @@ class SimpleRemoteEPCServer : public SimpleRemoteEPCTransportClient {
 
   public:
     SimpleRemoteEPCServer &server() { return S; }
+    StringMap<std::vector<char>> &bootstrapMap() { return BootstrapMap; }
+    template <typename T, typename SPSTagT>
+    void setBootstrapMapValue(std::string Key, const T &Value) {
+      std::vector<char> Buffer;
+      Buffer.resize(shared::SPSArgList<SPSTagT>::size(Value));
+      shared::SPSOutputBuffer OB(Buffer.data(), Buffer.size());
+      bool Success = shared::SPSArgList<SPSTagT>::serialize(OB, Value);
+      (void)Success;
+      assert(Success && "Bootstrap map value serialization failed");
+      BootstrapMap[std::move(Key)] = std::move(Buffer);
+    }
     StringMap<ExecutorAddr> &bootstrapSymbols() { return BootstrapSymbols; }
     std::vector<std::unique_ptr<ExecutorBootstrapService>> &services() {
       return Services;
@@ -76,6 +87,7 @@ class SimpleRemoteEPCServer : public SimpleRemoteEPCTransportClient {
   private:
     Setup(SimpleRemoteEPCServer &S) : S(S) {}
     SimpleRemoteEPCServer &S;
+    StringMap<std::vector<char>> BootstrapMap;
     StringMap<ExecutorAddr> BootstrapSymbols;
     std::vector<std::unique_ptr<ExecutorBootstrapService>> Services;
   };
@@ -114,7 +126,8 @@ class SimpleRemoteEPCServer : public SimpleRemoteEPCTransportClient {
     for (auto &Service : Server->Services)
       Service->addBootstrapSymbols(S.bootstrapSymbols());
 
-    if (auto Err = Server->sendSetupMessage(std::move(S.BootstrapSymbols)))
+    if (auto Err = Server->sendSetupMessage(std::move(S.BootstrapMap),
+                                            std::move(S.BootstrapSymbols)))
       return std::move(Err);
     return std::move(Server);
   }
@@ -141,7 +154,8 @@ class SimpleRemoteEPCServer : public SimpleRemoteEPCTransportClient {
   Error sendMessage(SimpleRemoteEPCOpcode OpC, uint64_t SeqNo,
                     ExecutorAddr TagAddr, ArrayRef<char> ArgBytes);
 
-  Error sendSetupMessage(StringMap<ExecutorAddr> BootstrapSymbols);
+  Error sendSetupMessage(StringMap<std::vector<char>> BootstrapMap,
+                         StringMap<ExecutorAddr> BootstrapSymbols);
 
   Error handleResult(uint64_t SeqNo, ExecutorAddr TagAddr,
                      SimpleRemoteEPCArgBytesVector ArgBytes);

diff  --git a/llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp b/llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp
index 3c1e53365f9bf..3d3ca891d8810 100644
--- a/llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/SimpleRemoteEPC.cpp
@@ -315,12 +315,19 @@ Error SimpleRemoteEPC::setup(Setup S) {
     dbgs() << "SimpleRemoteEPC received setup message:\n"
            << "  Triple: " << EI->TargetTriple << "\n"
            << "  Page size: " << EI->PageSize << "\n"
-           << "  Bootstrap symbols:\n";
+           << "  Bootstrap map" << (EI->BootstrapMap.empty() ? " empty" : ":")
+           << "\n";
+    for (const auto &KV : EI->BootstrapMap)
+      dbgs() << "    " << KV.first() << ": " << KV.second.size()
+             << "-byte SPS encoded buffer\n";
+    dbgs() << "  Bootstrap symbols"
+           << (EI->BootstrapSymbols.empty() ? " empty" : ":") << "\n";
     for (const auto &KV : EI->BootstrapSymbols)
       dbgs() << "    " << KV.first() << ": " << KV.second << "\n";
   });
   TargetTriple = Triple(EI->TargetTriple);
   PageSize = EI->PageSize;
+  BootstrapMap = std::move(EI->BootstrapMap);
   BootstrapSymbols = std::move(EI->BootstrapSymbols);
 
   if (auto Err = getBootstrapSymbols(

diff  --git a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp
index 230a7c0e791bd..67bc379f98211 100644
--- a/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/TargetProcess/SimpleRemoteEPCServer.cpp
@@ -185,6 +185,7 @@ Error SimpleRemoteEPCServer::sendMessage(SimpleRemoteEPCOpcode OpC,
 }
 
 Error SimpleRemoteEPCServer::sendSetupMessage(
+    StringMap<std::vector<char>> BootstrapMap,
     StringMap<ExecutorAddr> BootstrapSymbols) {
 
   using namespace SimpleRemoteEPCDefaultBootstrapSymbolNames;
@@ -196,6 +197,7 @@ Error SimpleRemoteEPCServer::sendSetupMessage(
     EI.PageSize = *PageSize;
   else
     return PageSize.takeError();
+  EI.BootstrapMap = std::move(BootstrapMap);
   EI.BootstrapSymbols = std::move(BootstrapSymbols);
 
   assert(!EI.BootstrapSymbols.count(ExecutorSessionObjectName) &&


        


More information about the llvm-commits mailing list