mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-21 18:29:46 +00:00
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. The primary use for this is the llvm-mc disassemblers, so that they can be targeted at arbitrary objects, not just in-process memory. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77023 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b2fa93dc1c
commit
4711326d60
81
include/llvm/Support/MemoryObject.h
Normal file
81
include/llvm/Support/MemoryObject.h
Normal file
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user