MemoryObject - Abstract base class for contiguous addressable memory.
authorSean Callanan <scallanan@apple.com>
Sat, 25 Jul 2009 00:30:51 +0000 (00:30 +0000)
committerSean Callanan <scallanan@apple.com>
Sat, 25 Jul 2009 00:30:51 +0000 (00:30 +0000)
  Necessary for cases in which the memory is in another process, in a
  file, or on a remote machine.

The primary use for this is the llvm-mc disassemblers, so that they
can be targeted at arbitrary objects, not just in-process memory.

llvm-svn: 77023

llvm/include/llvm/Support/MemoryObject.h [new file with mode: 0644]

diff --git a/llvm/include/llvm/Support/MemoryObject.h b/llvm/include/llvm/Support/MemoryObject.h
new file mode 100644 (file)
index 0000000..f8f29be
--- /dev/null
@@ -0,0 +1,81 @@
+//===- MemoryObject.h - Abstract memory interface ---------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MEMORYOBJECT_H
+#define MEMORYOBJECT_H
+
+#include "llvm/Support/DataTypes.h"
+
+namespace llvm {
+
+/// MemoryObject - Abstract base class for contiguous addressable memory.
+///   Necessary for cases in which the memory is in another process, in a
+///   file, or on a remote machine.
+class MemoryObject {
+public:
+  /// Constructor     - Override as necessary.
+  MemoryObject() {
+  }
+  
+  /// getBase         - Returns the lowest valid address in the region.
+  ///
+  /// @result         - The lowest valid address.
+  virtual uint64_t getBase() const = 0;
+  
+  /// getExtent       - Returns the size of the region in bytes.  (The region is
+  ///                   contiguous, so the highest valid address of the region 
+  ///                   is getBase() + getExtent() - 1).
+  ///
+  /// @result         - The size of the region.
+  virtual uint64_t getExtent() const = 0;
+  
+  /// readByte        - Tries to read a single byte from the region.
+  ///
+  /// @param address  - The address of the byte, in the same space as getBase().
+  /// @param ptr      - A pointer to a byte to be filled in.  Must be non-NULL.
+  /// @result         - 0 if successful; -1 if not.  Failure may be due to a
+  ///                   bounds violation or an implementation-specific error.
+  virtual int readByte(uint64_t address, uint8_t* ptr) const = 0;
+  
+  /// readByte        - Tries to read a contiguous range of bytes from the
+  ///                   region, up to the end of the region.
+  ///                   You should override this function if there is a quicker
+  ///                   way than going back and forth with individual bytes.
+  ///
+  /// @param address  - The address of the first byte, in the same space as 
+  ///                   getBase().
+  /// @param size     - The maximum number of bytes to copy.
+  /// @param buf      - A pointer to a buffer to be filled in.  Must be non-NULL
+  ///                   and large enough to hold size bytes.
+  /// @result         - The number of bytes copied if successful; (uint64_t)-1
+  ///                   if not.
+  ///                   Failure may be due to a bounds violation or an
+  ///                   implementation-specific error.
+  virtual uint64_t readBytes(uint64_t address,
+                             uint64_t size,
+                             uint8_t* buf) const {
+    uint64_t current = address;
+    uint64_t limit = getBase() + getExtent();
+    uint64_t ret = 0;
+    
+    while(current - address < size && current < limit) {
+      if(readByte(current, &buf[(current - address)]))
+        return (uint64_t)-1;
+      
+      ret++;
+    }
+    
+    return ret;
+  }
+};
+
+}
+
+#endif
+