22 RawMemoryObject(
const unsigned char *Start,
const unsigned char *End) :
23 FirstChar(Start), LastChar(End) {
24 assert(LastChar >= FirstChar &&
"Invalid start/end range");
29 return LastChar - FirstChar;
31 virtual int readByte(uint64_t address, uint8_t* ptr)
const LLVM_OVERRIDE;
32 virtual int readBytes(uint64_t address,
35 virtual const uint8_t *getPointer(uint64_t address,
37 virtual bool isValidAddress(uint64_t address)
const LLVM_OVERRIDE {
38 return validAddress(address);
40 virtual bool isObjectEnd(uint64_t address)
const LLVM_OVERRIDE {
41 return objectEnd(address);
45 const uint8_t*
const FirstChar;
46 const uint8_t*
const LastChar;
50 bool validAddress(uint64_t address)
const {
51 return static_cast<ptrdiff_t
>(address) < LastChar - FirstChar;
53 bool objectEnd(uint64_t address)
const {
54 return static_cast<ptrdiff_t
>(address) == LastChar - FirstChar;
58 void operator=(const RawMemoryObject&) LLVM_DELETED_FUNCTION;
61 int RawMemoryObject::readByte(uint64_t address, uint8_t* ptr)
const {
62 if (!validAddress(address))
return -1;
63 *ptr = *((uint8_t *)(uintptr_t)(address + FirstChar));
67 int RawMemoryObject::readBytes(uint64_t address,
70 if (!validAddress(address) || !validAddress(address + size - 1))
return -1;
71 memcpy(buf, (uint8_t *)(uintptr_t)(address + FirstChar), size);
75 const uint8_t *RawMemoryObject::getPointer(uint64_t address,
76 uint64_t size)
const {
77 return FirstChar + address;
85 if (ObjectSize && address < ObjectSize)
return true;
86 return fetchToPos(address);
90 if (ObjectSize)
return address == ObjectSize;
92 return address == ObjectSize && address != 0;
96 if (ObjectSize)
return ObjectSize;
97 size_t pos = BytesRead + kChunkSize;
99 while (fetchToPos(pos)) pos += kChunkSize;
104 if (!fetchToPos(address))
return -1;
105 *ptr = Bytes[address + BytesSkipped];
111 uint8_t *buf)
const {
112 if (!fetchToPos(address + size - 1))
return -1;
113 memcpy(buf, &Bytes[address + BytesSkipped], size);
118 if (BytesRead < s)
return true;
130 const unsigned char *Start,
const unsigned char *End) {
131 return new RawMemoryObject(Start, End);
137 Bytes(kChunkSize), Streamer(streamer), BytesRead(0), BytesSkipped(0),
138 ObjectSize(0), EOFReached(
false) {
139 BytesRead = streamer->
GetBytes(&Bytes[0], kChunkSize);
virtual bool isValidAddress(uint64_t address) const LLVM_OVERRIDE
virtual int readByte(uint64_t address, uint8_t *ptr) const LLVM_OVERRIDE
StreamingMemoryObject(DataStreamer *streamer)
void setKnownObjectSize(size_t size)
virtual ~StreamableMemoryObject()
Destructor - Override as necessary.
virtual size_t GetBytes(unsigned char *buf, size_t len)=0
StreamableMemoryObject * getNonStreamedMemoryObject(const unsigned char *Start, const unsigned char *End)
virtual uint64_t getExtent() const LLVM_OVERRIDE
#define LLVM_DELETED_FUNCTION
virtual int readBytes(uint64_t address, uint64_t size, uint8_t *buf) const LLVM_OVERRIDE
virtual bool isObjectEnd(uint64_t address) const LLVM_OVERRIDE
bool dropLeadingBytes(size_t s)