[Lldb-commits] [lldb] [llvm] [Obj2Yaml] Add support for minidump generation with 64b memory ranges. (PR #101272)

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Wed Aug 7 01:13:46 PDT 2024


================
@@ -132,6 +140,95 @@ class MinidumpFile : public Binary {
     size_t Stride;
   };
 
+  /// Class the provides an iterator over the memory64 memory ranges. Only the
+  /// the first descriptor is validated as readable beforehand.
+  class Memory64Iterator {
+  public:
+    static Memory64Iterator
+    begin(ArrayRef<uint8_t> Storage,
+          ArrayRef<minidump::MemoryDescriptor_64> Descriptors,
+          uint64_t BaseRVA) {
+      return Memory64Iterator(Storage, Descriptors, BaseRVA);
+    }
+
+    static Memory64Iterator end() { return Memory64Iterator(); }
+
+    std::pair<minidump::MemoryDescriptor_64, ArrayRef<uint8_t>> Current;
+
+    bool operator==(const Memory64Iterator &R) const {
+      return IsEnd == R.IsEnd;
+    }
+
+    bool operator!=(const Memory64Iterator &R) const { return !(*this == R); }
+
+    const std::pair<minidump::MemoryDescriptor_64, ArrayRef<uint8_t>> &
+    operator*() {
+      return Current;
+    }
+
+    const std::pair<minidump::MemoryDescriptor_64, ArrayRef<uint8_t>> *
+    operator&() {
+      return &Current;
+    }
+
+    Error inc() {
+      if (Storage.size() == 0 || Descriptors.size() == 0)
+        return make_error<GenericBinaryError>("No Memory64List Stream",
+                                              object_error::parse_failed);
+
+      if (Index >= Descriptors.size())
+        return createError("Can't read past of Memory64List Stream");
+
+      const minidump::MemoryDescriptor_64 &Descriptor = Descriptors[Index];
+      if (RVA + Descriptor.DataSize > Storage.size())
+        return make_error<GenericBinaryError>(
+            "Memory64 Descriptor exceeds end of file.",
+            object_error::unexpected_eof);
+
+      ArrayRef<uint8_t> Content = Storage.slice(RVA, Descriptor.DataSize);
+      Current = std::make_pair(Descriptor, Content);
+      Index++;
+      RVA += Descriptor.DataSize;
----------------
labath wrote:

Just an idea that I think could make this slightly neater: Instead of incrementing the RVA, just drop the relevant portion of the data. I.e. something like
```
Content = Storage.slice(Descriptor.DataSize);
Storage = Storage.drop_front(Descriptor.Datasize);
```
And then (I think) you don't need the RVA member.

https://github.com/llvm/llvm-project/pull/101272


More information about the lldb-commits mailing list