[llvm] 5471766 - [ORC] Replace MachOJITDylibInitializers::SectionExtent with ExecutorAddressRange

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 7 21:29:52 PDT 2021


Author: Lang Hames
Date: 2021-07-08T14:15:44+10:00
New Revision: 5471766f9d16fbc5a82dd9503729747d901242a1

URL: https://github.com/llvm/llvm-project/commit/5471766f9d16fbc5a82dd9503729747d901242a1
DIFF: https://github.com/llvm/llvm-project/commit/5471766f9d16fbc5a82dd9503729747d901242a1.diff

LOG: [ORC] Replace MachOJITDylibInitializers::SectionExtent with ExecutorAddressRange

MachOJITDylibInitializers::SectionExtent represented the address range of a
section as an (address, size) pair. The new ExecutorAddressRange type
generalizes this to an address range (for any object, not necessarily a section)
represented as a (start-address, end-address) pair.

The aim is to express more of ORC (and the ORC runtime) in terms of simple types
that can be serialized/deserialized via SPS. This will simplify SPS-based RPC
involving arguments/return-values of these types.

Added: 
    llvm/include/llvm/ExecutionEngine/Orc/Shared/CommonOrcRuntimeTypes.h

Modified: 
    llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h
    llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h b/llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h
index f04bef161ea7..f9d0b587a1be 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h
@@ -17,6 +17,7 @@
 #include "llvm/ExecutionEngine/Orc/Core.h"
 #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
 #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
+#include "llvm/ExecutionEngine/Orc/Shared/CommonOrcRuntimeTypes.h"
 
 #include <future>
 #include <thread>
@@ -31,21 +32,13 @@ bool objCRegistrationEnabled();
 
 class MachOJITDylibInitializers {
 public:
-  struct SectionExtent {
-    SectionExtent() = default;
-    SectionExtent(JITTargetAddress Address, uint64_t NumPtrs)
-        : Address(Address), NumPtrs(NumPtrs) {}
-    JITTargetAddress Address = 0;
-    uint64_t NumPtrs = 0;
-  };
-
-  using RawPointerSectionList = std::vector<SectionExtent>;
+  using RawPointerSectionList = std::vector<shared::ExecutorAddressRange>;
 
   void setObjCImageInfoAddr(JITTargetAddress ObjCImageInfoAddr) {
     this->ObjCImageInfoAddr = ObjCImageInfoAddr;
   }
 
-  void addModInitsSection(SectionExtent ModInit) {
+  void addModInitsSection(shared::ExecutorAddressRange ModInit) {
     ModInitSections.push_back(std::move(ModInit));
   }
 
@@ -53,7 +46,7 @@ class MachOJITDylibInitializers {
     return ModInitSections;
   }
 
-  void addObjCSelRefsSection(SectionExtent ObjCSelRefs) {
+  void addObjCSelRefsSection(shared::ExecutorAddressRange ObjCSelRefs) {
     ObjCSelRefsSections.push_back(std::move(ObjCSelRefs));
   }
 
@@ -61,7 +54,7 @@ class MachOJITDylibInitializers {
     return ObjCSelRefsSections;
   }
 
-  void addObjCClassListSection(SectionExtent ObjCClassList) {
+  void addObjCClassListSection(shared::ExecutorAddressRange ObjCClassList) {
     ObjCClassListSections.push_back(std::move(ObjCClassList));
   }
 
@@ -152,9 +145,9 @@ class MachOPlatform : public Platform {
   };
 
   void registerInitInfo(JITDylib &JD, JITTargetAddress ObjCImageInfoAddr,
-                        MachOJITDylibInitializers::SectionExtent ModInits,
-                        MachOJITDylibInitializers::SectionExtent ObjCSelRefs,
-                        MachOJITDylibInitializers::SectionExtent ObjCClassList);
+                        shared::ExecutorAddressRange ModInits,
+                        shared::ExecutorAddressRange ObjCSelRefs,
+                        shared::ExecutorAddressRange ObjCClassList);
 
   ExecutionSession &ES;
   ObjectLinkingLayer &ObjLinkingLayer;

diff  --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/CommonOrcRuntimeTypes.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/CommonOrcRuntimeTypes.h
new file mode 100644
index 000000000000..8b0e6272a555
--- /dev/null
+++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/CommonOrcRuntimeTypes.h
@@ -0,0 +1,66 @@
+//===------------------- CommonOrcRuntimeTypes.h ----------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Generic types usable with SPS and the ORC runtime.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_EXECUTIONENGINE_ORC_SHARED_COMMONORCRUNTIMETYPES_H
+#define LLVM_EXECUTIONENGINE_ORC_SHARED_COMMONORCRUNTIMETYPES_H
+
+#include "llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h"
+
+namespace llvm {
+namespace orc {
+namespace shared {
+
+/// Represents an address range in the exceutor process.
+struct ExecutorAddressRange {
+  ExecutorAddressRange() = default;
+  ExecutorAddressRange(JITTargetAddress StartAddress,
+                       JITTargetAddress EndAddress)
+      : StartAddress(StartAddress), EndAddress(EndAddress) {}
+
+  bool empty() const { return StartAddress == EndAddress; }
+  size_t size() const { return EndAddress - StartAddress; }
+
+  JITTargetAddress StartAddress = 0;
+  JITTargetAddress EndAddress = 0;
+};
+
+using SPSExecutorAddressRange =
+    SPSTuple<SPSExecutorAddress, SPSExecutorAddress>;
+
+/// Serialization traits for address ranges.
+template <>
+class SPSSerializationTraits<SPSExecutorAddressRange, ExecutorAddressRange> {
+public:
+  static size_t size(const ExecutorAddressRange &Value) {
+    return SPSArgList<SPSExecutorAddress, SPSExecutorAddress>::size(
+        Value.StartAddress, Value.EndAddress);
+  }
+
+  static bool serialize(SPSOutputBuffer &BOB,
+                        const ExecutorAddressRange &Value) {
+    return SPSArgList<SPSExecutorAddress, SPSExecutorAddress>::serialize(
+        BOB, Value.StartAddress, Value.EndAddress);
+  }
+
+  static bool deserialize(SPSInputBuffer &BIB, ExecutorAddressRange &Value) {
+    return SPSArgList<SPSExecutorAddress, SPSExecutorAddress>::deserialize(
+        BIB, Value.StartAddress, Value.EndAddress);
+  }
+};
+
+using SPSExecutorAddressRangeSequence = SPSSequence<SPSExecutorAddressRange>;
+
+} // End namespace shared.
+} // End namespace orc.
+} // End namespace llvm.
+
+#endif // LLVM_EXECUTIONENGINE_ORC_SHARED_COMMONORCRUNTIMETYPES_H

diff  --git a/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp b/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
index 80df097a0741..74c88b0c1c85 100644
--- a/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
@@ -88,11 +88,15 @@ bool objCRegistrationEnabled() {
 
 void MachOJITDylibInitializers::runModInits() const {
   for (const auto &ModInit : ModInitSections) {
-    for (uint64_t I = 0; I != ModInit.NumPtrs; ++I) {
-      auto *InitializerAddr = jitTargetAddressToPointer<uintptr_t *>(
-          ModInit.Address + (I * sizeof(uintptr_t)));
-      auto *Initializer =
-          jitTargetAddressToFunction<void (*)()>(*InitializerAddr);
+    assert(ModInit.size() % sizeof(uintptr_t) == 0 &&
+           "ModInit section size is not a pointer multiple?");
+    for (uintptr_t *
+             InitPtr =
+                jitTargetAddressToPointer<uintptr_t *>(ModInit.StartAddress),
+            *InitEnd =
+                jitTargetAddressToPointer<uintptr_t *>(ModInit.EndAddress);
+         InitPtr != InitEnd; ++InitPtr) {
+      auto *Initializer = reinterpret_cast<void (*)()>(*InitPtr);
       Initializer();
     }
   }
@@ -102,8 +106,11 @@ void MachOJITDylibInitializers::registerObjCSelectors() const {
   assert(objCRegistrationEnabled() && "ObjC registration not enabled.");
 
   for (const auto &ObjCSelRefs : ObjCSelRefsSections) {
-    for (uint64_t I = 0; I != ObjCSelRefs.NumPtrs; ++I) {
-      auto SelEntryAddr = ObjCSelRefs.Address + (I * sizeof(uintptr_t));
+    assert(ObjCSelRefs.size() % sizeof(uintptr_t) == 0 &&
+           "ObjCSelRefs section size is not a pointer multiple?");
+    for (JITTargetAddress SelEntryAddr = ObjCSelRefs.StartAddress;
+         SelEntryAddr != ObjCSelRefs.EndAddress;
+         SelEntryAddr += sizeof(uintptr_t)) {
       const auto *SelName =
           *jitTargetAddressToPointer<const char **>(SelEntryAddr);
       auto Sel = sel_registerName(SelName);
@@ -128,8 +135,11 @@ Error MachOJITDylibInitializers::registerObjCClasses() const {
   auto ClassSelector = sel_registerName("class");
 
   for (const auto &ObjCClassList : ObjCClassListSections) {
-    for (uint64_t I = 0; I != ObjCClassList.NumPtrs; ++I) {
-      auto ClassPtrAddr = ObjCClassList.Address + (I * sizeof(uintptr_t));
+    assert(ObjCClassList.size() % sizeof(uintptr_t) == 0 &&
+           "ObjCClassList section size is not a pointer multiple?");
+    for (JITTargetAddress ClassPtrAddr = ObjCClassList.StartAddress;
+         ClassPtrAddr != ObjCClassList.EndAddress;
+         ClassPtrAddr += sizeof(uintptr_t)) {
       auto Cls = *jitTargetAddressToPointer<Class *>(ClassPtrAddr);
       auto *ClassCompiled =
           *jitTargetAddressToPointer<ObjCClassCompiled **>(ClassPtrAddr);
@@ -264,37 +274,36 @@ MachOPlatform::getDeinitializerSequence(JITDylib &JD) {
 
 void MachOPlatform::registerInitInfo(
     JITDylib &JD, JITTargetAddress ObjCImageInfoAddr,
-    MachOJITDylibInitializers::SectionExtent ModInits,
-    MachOJITDylibInitializers::SectionExtent ObjCSelRefs,
-    MachOJITDylibInitializers::SectionExtent ObjCClassList) {
+    shared::ExecutorAddressRange ModInits,
+    shared::ExecutorAddressRange ObjCSelRefs,
+    shared::ExecutorAddressRange ObjCClassList) {
   std::lock_guard<std::mutex> Lock(InitSeqsMutex);
 
   auto &InitSeq = InitSeqs[&JD];
 
   InitSeq.setObjCImageInfoAddr(ObjCImageInfoAddr);
 
-  if (ModInits.Address)
+  if (ModInits.StartAddress)
     InitSeq.addModInitsSection(std::move(ModInits));
 
-  if (ObjCSelRefs.Address)
+  if (ObjCSelRefs.StartAddress)
     InitSeq.addObjCSelRefsSection(std::move(ObjCSelRefs));
 
-  if (ObjCClassList.Address)
+  if (ObjCClassList.StartAddress)
     InitSeq.addObjCClassListSection(std::move(ObjCClassList));
 }
 
-static Expected<MachOJITDylibInitializers::SectionExtent>
+static Expected<shared::ExecutorAddressRange>
 getSectionExtent(jitlink::LinkGraph &G, StringRef SectionName) {
   auto *Sec = G.findSectionByName(SectionName);
   if (!Sec)
-    return MachOJITDylibInitializers::SectionExtent();
+    return shared::ExecutorAddressRange();
   jitlink::SectionRange R(*Sec);
   if (R.getSize() % G.getPointerSize() != 0)
     return make_error<StringError>(SectionName + " section size is not a "
                                                  "multiple of the pointer size",
                                    inconvertibleErrorCode());
-  return MachOJITDylibInitializers::SectionExtent(
-      R.getStart(), R.getSize() / G.getPointerSize());
+  return shared::ExecutorAddressRange{R.getStart(), R.getEnd()};
 }
 
 void MachOPlatform::InitScraperPlugin::modifyPassConfig(
@@ -326,8 +335,7 @@ void MachOPlatform::InitScraperPlugin::modifyPassConfig(
 
   Config.PostFixupPasses.push_back([this, &JD = MR.getTargetJITDylib()](
                                        jitlink::LinkGraph &G) -> Error {
-    MachOJITDylibInitializers::SectionExtent ModInits, ObjCSelRefs,
-        ObjCClassList;
+    shared::ExecutorAddressRange ModInits, ObjCSelRefs, ObjCClassList;
 
     JITTargetAddress ObjCImageInfoAddr = 0;
     if (auto *ObjCImageInfoSec =
@@ -359,23 +367,26 @@ void MachOPlatform::InitScraperPlugin::modifyPassConfig(
     LLVM_DEBUG({
       dbgs() << "MachOPlatform: Scraped " << G.getName() << " init sections:\n";
       dbgs() << "  __objc_selrefs: ";
-      if (ObjCSelRefs.NumPtrs)
-        dbgs() << ObjCSelRefs.NumPtrs << " pointer(s) at "
-               << formatv("{0:x16}", ObjCSelRefs.Address) << "\n";
+      auto NumObjCSelRefs = ObjCSelRefs.size() / sizeof(uintptr_t);
+      if (NumObjCSelRefs)
+        dbgs() << NumObjCSelRefs << " pointer(s) at "
+               << formatv("{0:x16}", ObjCSelRefs.StartAddress) << "\n";
       else
         dbgs() << "none\n";
 
       dbgs() << "  __objc_classlist: ";
-      if (ObjCClassList.NumPtrs)
-        dbgs() << ObjCClassList.NumPtrs << " pointer(s) at "
-               << formatv("{0:x16}", ObjCClassList.Address) << "\n";
+      auto NumObjCClasses = ObjCClassList.size() / sizeof(uintptr_t);
+      if (NumObjCClasses)
+        dbgs() << NumObjCClasses << " pointer(s) at "
+               << formatv("{0:x16}", ObjCClassList.StartAddress) << "\n";
       else
         dbgs() << "none\n";
 
       dbgs() << "  __mod_init_func: ";
-      if (ModInits.NumPtrs)
-        dbgs() << ModInits.NumPtrs << " pointer(s) at "
-               << formatv("{0:x16}", ModInits.Address) << "\n";
+      auto NumModInits = ModInits.size() / sizeof(uintptr_t);
+      if (NumModInits)
+        dbgs() << NumModInits << " pointer(s) at "
+               << formatv("{0:x16}", ModInits.StartAddress) << "\n";
       else
         dbgs() << "none\n";
     });


        


More information about the llvm-commits mailing list