summaryrefslogtreecommitdiff
path: root/include/llvm/Support/MemoryObject.h
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2009-09-09 22:49:13 +0000
committerSean Callanan <scallanan@apple.com>2009-09-09 22:49:13 +0000
commit251ef612a812ac99edeab6c08a752bf8ca220921 (patch)
tree8ae01f418b733eccd6557bef5d58131981e5cb2f /include/llvm/Support/MemoryObject.h
parent0734d35044c304dd072f20e49840bcbea427db9c (diff)
downloadllvm-251ef612a812ac99edeab6c08a752bf8ca220921.tar.gz
llvm-251ef612a812ac99edeab6c08a752bf8ca220921.tar.bz2
llvm-251ef612a812ac99edeab6c08a752bf8ca220921.tar.xz
Added an abstract superclass, MCDisassembler, for
all disassemblers. Modified the MemoryObject to support 64-bit address spaces, regardless of the LLVM process's address width. Modified the Target class to allow extraction of a MCDisassembler. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81392 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Support/MemoryObject.h')
-rw-r--r--include/llvm/Support/MemoryObject.h40
1 files changed, 15 insertions, 25 deletions
diff --git a/include/llvm/Support/MemoryObject.h b/include/llvm/Support/MemoryObject.h
index fd0e966bc9..dec0f134b3 100644
--- a/include/llvm/Support/MemoryObject.h
+++ b/include/llvm/Support/MemoryObject.h
@@ -17,23 +17,24 @@ 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.
+/// All size and offset parameters are uint64_ts, to allow 32-bit processes
+/// access to 64-bit address spaces.
class MemoryObject {
public:
/// Destructor - Override as necessary.
- virtual ~MemoryObject() {
- }
+ virtual ~MemoryObject();
/// getBase - Returns the lowest valid address in the region.
///
/// @result - The lowest valid address.
- virtual uintptr_t getBase() const = 0;
+ 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 uintptr_t getExtent() const = 0;
+ virtual uint64_t getExtent() const = 0;
/// readByte - Tries to read a single byte from the region.
///
@@ -41,9 +42,9 @@ public:
/// @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(uintptr_t address, uint8_t* ptr) const = 0;
+ virtual int readByte(uint64_t address, uint8_t* ptr) const = 0;
- /// readByte - Tries to read a contiguous range of bytes from the
+ /// readBytes - 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.
@@ -53,25 +54,14 @@ public:
/// @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; (uintptr_t)-1
- /// if not.
- /// Failure may be due to a bounds violation or an
- /// implementation-specific error.
- virtual uintptr_t readBytes(uintptr_t address,
- uintptr_t size,
- uint8_t* buf) const {
- uintptr_t current = address;
- uintptr_t limit = getBase() + getExtent();
-
- while(current - address < size && current < limit) {
- if(readByte(current, &buf[(current - address)]))
- return (uintptr_t)-1;
-
- current++;
- }
-
- return current - address;
- }
+ /// @param copied - A pointer to a nunber that is filled in with the number
+ /// of bytes actually read. May be NULL.
+ /// @result - 0 if successful; -1 if not. Failure may be due to a
+ /// bounds violation or an implementation-specific error.
+ virtual int readBytes(uint64_t address,
+ uint64_t size,
+ uint8_t* buf,
+ uint64_t* copied) const;
};
}