================
@@ -82,76 +116,79 @@ class OffloadBinary : public Binary {
   LLVM_ABI static Expected<std::unique_ptr<OffloadBinary>>
       create(MemoryBufferRef);
 
-  /// Serialize the contents of \p File to a binary buffer to be read later.
-  LLVM_ABI static SmallString<0> write(const OffloadingImage &);
+  /// Serialize the contents of \p OffloadingData to a binary buffer to be read
+  /// later.
+  LLVM_ABI static SmallString<0>
+  write(ArrayRef<OffloadingImage> OffloadingData);
 
   static uint64_t getAlignment() { return 8; }
 
-  ImageKind getImageKind() const { return TheEntry->TheImageKind; }
-  OffloadKind getOffloadKind() const { return TheEntry->TheOffloadKind; }
+  ImageKind getOnlyImageKind() const {
+    assert(getEntriesCount() == 1 && "Expected exactly one entry.");
+    return Entries[0].first->TheImageKind;
+  }
+
+  OffloadKind getOffloadKind() const { return 
Entries[0].first->TheOffloadKind; }
   uint32_t getVersion() const { return TheHeader->Version; }
-  uint32_t getFlags() const { return TheEntry->Flags; }
+  uint32_t getFlags() const { return Entries[0].first->Flags; }
   uint64_t getSize() const { return TheHeader->Size; }
+  uint64_t getEntriesCount() const { return TheHeader->EntriesCount; }
 
   StringRef getTriple() const { return getString("triple"); }
   StringRef getArch() const { return getString("arch"); }
   StringRef getImage() const {
-    return StringRef(&Buffer[TheEntry->ImageOffset], TheEntry->ImageSize);
+    return StringRef(&Buffer[Entries[0].first->ImageOffset], 
Entries[0].first->ImageSize);
   }
 
-  // Iterator over all the key and value pairs in the binary.
-  string_iterator_range strings() const { return StringData; }
+  // Iterator access to all entries in the binary
+  entry_iterator_range entries() const {
+    return make_range(Entries.begin(), Entries.end());
+  }
+  entry_iterator entries_begin() const { return Entries.begin(); }
+  entry_iterator entries_end() const { return Entries.end(); }
 
-  StringRef getString(StringRef Key) const { return StringData.lookup(Key); }
+  // Access specific entry by index.
+  const std::pair<const Entry *, StringMap> &getEntry(size_t Index) const {
+    assert(Index < Entries.size() && "Entry index out of bounds");
+    return Entries[Index];
+  }
 
-  static bool classof(const Binary *V) { return V->isOffloadFile(); }
+  // Iterator over all the key and value pairs in the binary.
+  string_iterator_range strings() const { return Entries[0].second; }
 
-  struct Header {
-    uint8_t Magic[4] = {0x10, 0xFF, 0x10, 0xAD}; // 0x10FF10AD magic bytes.
-    uint32_t Version = OffloadBinary::Version;   // Version identifier.
-    uint64_t Size;        // Size in bytes of this entire binary.
-    uint64_t EntryOffset; // Offset of the metadata entry in bytes.
-    uint64_t EntrySize;   // Size of the metadata entry in bytes.
-  };
+  StringRef getString(StringRef Key) const { return 
Entries[0].second.lookup(Key); }
 
-  struct Entry {
-    ImageKind TheImageKind;     // The kind of the image stored.
-    OffloadKind TheOffloadKind; // The producer of this image.
-    uint32_t Flags;             // Additional flags associated with the image.
-    uint64_t StringOffset;      // Offset in bytes to the string map.
-    uint64_t NumStrings;        // Number of entries in the string map.
-    uint64_t ImageOffset;       // Offset in bytes of the actual binary image.
-    uint64_t ImageSize;         // Size in bytes of the binary image.
-  };
-
-  struct StringEntry {
-    uint64_t KeyOffset;
-    uint64_t ValueOffset;
-  };
+  static bool classof(const Binary *V) { return V->isOffloadFile(); }
 
 private:
   OffloadBinary(MemoryBufferRef Source, const Header *TheHeader,
-                const Entry *TheEntry)
+                const Entry *EntriesBegin)
       : Binary(Binary::ID_Offload, Source), Buffer(Source.getBufferStart()),
-        TheHeader(TheHeader), TheEntry(TheEntry) {
-    const StringEntry *StringMapBegin =
-        reinterpret_cast<const StringEntry *>(&Buffer[TheEntry->StringOffset]);
-    for (uint64_t I = 0, E = TheEntry->NumStrings; I != E; ++I) {
-      StringRef Key = &Buffer[StringMapBegin[I].KeyOffset];
-      StringData[Key] = &Buffer[StringMapBegin[I].ValueOffset];
+        TheHeader(TheHeader) {
+    for (uint64_t EI = 0, EE = TheHeader->EntriesCount; EI != EE; ++EI) {
+      const Entry *TheEntry = &EntriesBegin[EI];
+      const StringEntry *StringMapBegin = reinterpret_cast<const StringEntry 
*>(
+          &Buffer[TheEntry->StringOffset]);
+      StringMap Strings;
+      for (uint64_t SI = 0, SE = TheEntry->NumStrings; SI != SE; ++SI) {
+        StringRef Key = &Buffer[StringMapBegin[SI].KeyOffset];
+        StringRef Value = StringRef(
+            &Buffer[StringMapBegin[SI].ValueOffset], 
StringMapBegin[SI].ValueSize);
+        Strings.insert({Key, Value});
+      }
+      Entries.push_back(std::make_pair(TheEntry, std::move(Strings)));
     }
   }
 
   OffloadBinary(const OffloadBinary &Other) = delete;
 
-  /// Map from keys to offsets in the binary.
-  MapVector<StringRef, StringRef> StringData;
+  /// Location of the metadata entries within the binary mapped to
+  /// the key-value string data.
+  SmallVector<std::pair<const Entry *, StringMap>, 1> Entries;
----------------
jhuber6 wrote:

Can't decide if this should be two vectors that take the same index

https://github.com/llvm/llvm-project/pull/169425
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to