diff --git a/include/llvm/Bitcode/BitstreamReader.h b/include/llvm/Bitcode/BitstreamReader.h index b42f559e13b..6965da36ee2 100644 --- a/include/llvm/Bitcode/BitstreamReader.h +++ b/include/llvm/Bitcode/BitstreamReader.h @@ -17,7 +17,7 @@ #include "llvm/Bitcode/BitCodes.h" #include "llvm/Support/Endian.h" -#include "llvm/Support/StreamableMemoryObject.h" +#include "llvm/Support/StreamingMemoryObject.h" #include #include #include @@ -42,7 +42,7 @@ public: std::vector > RecordNames; }; private: - std::unique_ptr BitcodeBytes; + std::unique_ptr BitcodeBytes; std::vector BlockInfoRecords; @@ -61,7 +61,7 @@ public: init(Start, End); } - BitstreamReader(StreamableMemoryObject *bytes) : IgnoreBlockInfoNames(true) { + BitstreamReader(MemoryObject *bytes) : IgnoreBlockInfoNames(true) { BitcodeBytes.reset(bytes); } @@ -82,7 +82,7 @@ public: BitcodeBytes.reset(getNonStreamedMemoryObject(Start, End)); } - StreamableMemoryObject &getBitcodeBytes() { return *BitcodeBytes; } + MemoryObject &getBitcodeBytes() { return *BitcodeBytes; } /// This is called by clients that want block/record name information. void CollectBlockInfoNames() { IgnoreBlockInfoNames = false; } diff --git a/include/llvm/Support/MemoryObject.h b/include/llvm/Support/MemoryObject.h index 6208772532c..584a2c55c04 100644 --- a/include/llvm/Support/MemoryObject.h +++ b/include/llvm/Support/MemoryObject.h @@ -14,10 +14,17 @@ namespace llvm { -/// 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. +/// Interface to data which might be streamed. Streamability has 2 important +/// implications/restrictions. First, the data might not yet exist in memory +/// when the request is made. This just means that readByte/readBytes might have +/// to block or do some work to get it. More significantly, the exact size of +/// the object might not be known until it has all been fetched. This means that +/// to return the right result, getExtent must also wait for all the data to +/// arrive; therefore it should not be called on objects which are actually +/// streamed (this would defeat the purpose of streaming). Instead, +/// isValidAddress and isObjectEnd can be used to test addresses without knowing +/// the exact size of the stream. Finally, getPointer can be used instead of +/// readBytes to avoid extra copying. class MemoryObject { public: virtual ~MemoryObject(); @@ -41,6 +48,28 @@ public: /// bounds violation or an implementation-specific error. virtual int readBytes(uint64_t address, uint64_t size, uint8_t *buf) const = 0; + + /// Ensures that the requested data is in memory, and returns a pointer to it. + /// More efficient than using readBytes if the data is already in memory. May + /// block until (address - base + size) bytes have been read + /// @param address - address of the byte, in the same space as getBase() + /// @param size - amount of data that must be available on return + /// @result - valid pointer to the requested data + virtual const uint8_t *getPointer(uint64_t address, uint64_t size) const = 0; + + /// Returns true if the address is within the object (i.e. between base and + /// base + extent - 1 inclusive). May block until (address - base) bytes have + /// been read + /// @param address - address of the byte, in the same space as getBase() + /// @result - true if the address may be read with readByte() + virtual bool isValidAddress(uint64_t address) const = 0; + + /// Returns true if the address is one past the end of the object (i.e. if it + /// is equal to base + extent). May block until (address - base) bytes have + /// been read + /// @param address - address of the byte, in the same space as getBase() + /// @result - true if the address is equal to base + extent + virtual bool isObjectEnd(uint64_t address) const = 0; }; } diff --git a/include/llvm/Support/StreamableMemoryObject.h b/include/llvm/Support/StreamingMemoryObject.h similarity index 59% rename from include/llvm/Support/StreamableMemoryObject.h rename to include/llvm/Support/StreamingMemoryObject.h index 618610d084c..da1b88738d0 100644 --- a/include/llvm/Support/StreamableMemoryObject.h +++ b/include/llvm/Support/StreamingMemoryObject.h @@ -1,4 +1,4 @@ -//===- StreamableMemoryObject.h - Streamable data interface -----*- C++ -*-===// +//===- StreamingMemoryObject.h - Streamable data interface -----*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,9 +7,8 @@ // //===----------------------------------------------------------------------===// - -#ifndef LLVM_SUPPORT_STREAMABLEMEMORYOBJECT_H -#define LLVM_SUPPORT_STREAMABLEMEMORYOBJECT_H +#ifndef LLVM_SUPPORT_STREAMINGMEMORYOBJECT_H +#define LLVM_SUPPORT_STREAMINGMEMORYOBJECT_H #include "llvm/Support/Compiler.h" #include "llvm/Support/DataStream.h" @@ -21,48 +20,10 @@ namespace llvm { -/// Interface to data which might be streamed. Streamability has 2 important -/// implications/restrictions. First, the data might not yet exist in memory -/// when the request is made. This just means that readByte/readBytes might have -/// to block or do some work to get it. More significantly, the exact size of -/// the object might not be known until it has all been fetched. This means that -/// to return the right result, getExtent must also wait for all the data to -/// arrive; therefore it should not be called on objects which are actually -/// streamed (this would defeat the purpose of streaming). Instead, -/// isValidAddress and isObjectEnd can be used to test addresses without knowing -/// the exact size of the stream. Finally, getPointer can be used instead of -/// readBytes to avoid extra copying. -class StreamableMemoryObject : public MemoryObject { - public: - virtual ~StreamableMemoryObject(); - - /// Ensures that the requested data is in memory, and returns a pointer to it. - /// More efficient than using readBytes if the data is already in memory. May - /// block until (address - base + size) bytes have been read - /// @param address - address of the byte, in the same space as getBase() - /// @param size - amount of data that must be available on return - /// @result - valid pointer to the requested data - virtual const uint8_t *getPointer(uint64_t address, uint64_t size) const = 0; - - /// Returns true if the address is within the object (i.e. between base and - /// base + extent - 1 inclusive). May block until (address - base) bytes have - /// been read - /// @param address - address of the byte, in the same space as getBase() - /// @result - true if the address may be read with readByte() - virtual bool isValidAddress(uint64_t address) const = 0; - - /// Returns true if the address is one past the end of the object (i.e. if it - /// is equal to base + extent). May block until (address - base) bytes have - /// been read - /// @param address - address of the byte, in the same space as getBase() - /// @result - true if the address is equal to base + extent - virtual bool isObjectEnd(uint64_t address) const = 0; -}; - /// Interface to data which is actually streamed from a DataStreamer. In /// addition to inherited members, it has the dropLeadingBytes and /// setKnownObjectSize methods which are not applicable to non-streamed objects. -class StreamingMemoryObject : public StreamableMemoryObject { +class StreamingMemoryObject : public MemoryObject { public: StreamingMemoryObject(DataStreamer *streamer); uint64_t getExtent() const override; @@ -128,8 +89,8 @@ private: void operator=(const StreamingMemoryObject&) LLVM_DELETED_FUNCTION; }; -StreamableMemoryObject *getNonStreamedMemoryObject( +MemoryObject *getNonStreamedMemoryObject( const unsigned char *Start, const unsigned char *End); } -#endif // STREAMABLEMEMORYOBJECT_H_ +#endif // STREAMINGMEMORYOBJECT_H_ diff --git a/lib/Support/CMakeLists.txt b/lib/Support/CMakeLists.txt index 794372d172c..fa62591191d 100644 --- a/lib/Support/CMakeLists.txt +++ b/lib/Support/CMakeLists.txt @@ -80,7 +80,7 @@ add_llvm_library(LLVMSupport SourceMgr.cpp SpecialCaseList.cpp Statistic.cpp - StreamableMemoryObject.cpp + StreamingMemoryObject.cpp StringExtras.cpp StringMap.cpp StringPool.cpp diff --git a/lib/Support/DataStream.cpp b/lib/Support/DataStream.cpp index 32653de5194..dbf6465189d 100644 --- a/lib/Support/DataStream.cpp +++ b/lib/Support/DataStream.cpp @@ -32,12 +32,12 @@ using namespace llvm; #define DEBUG_TYPE "Data-stream" // Interface goals: -// * StreamableMemoryObject doesn't care about complexities like using +// * StreamingMemoryObject doesn't care about complexities like using // threads/async callbacks to actually overlap download+compile // * Don't want to duplicate Data in memory // * Don't need to know total Data len in advance // Non-goals: -// StreamableMemoryObject already has random access so this interface only does +// StreamingMemoryObject already has random access so this interface only does // in-order streaming (no arbitrary seeking, else we'd have to buffer all the // Data here in addition to MemoryObject). This also means that if we want // to be able to to free Data, BitstreamBytes/BitcodeReader will implement it diff --git a/lib/Support/StreamableMemoryObject.cpp b/lib/Support/StreamingMemoryObject.cpp similarity index 91% rename from lib/Support/StreamableMemoryObject.cpp rename to lib/Support/StreamingMemoryObject.cpp index 1a11f5b0cde..7187ce013fa 100644 --- a/lib/Support/StreamableMemoryObject.cpp +++ b/lib/Support/StreamingMemoryObject.cpp @@ -1,4 +1,4 @@ -//===- StreamableMemoryObject.cpp - Streamable data interface -------------===// +//===- StreamingMemoryObject.cpp - Streamable data interface -------------===// // // The LLVM Compiler Infrastructure // @@ -7,7 +7,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/Support/StreamableMemoryObject.h" +#include "llvm/Support/StreamingMemoryObject.h" #include "llvm/Support/Compiler.h" #include #include @@ -18,7 +18,7 @@ using namespace llvm; namespace { -class RawMemoryObject : public StreamableMemoryObject { +class RawMemoryObject : public MemoryObject { public: RawMemoryObject(const unsigned char *Start, const unsigned char *End) : FirstChar(Start), LastChar(End) { @@ -111,13 +111,11 @@ void StreamingMemoryObject::setKnownObjectSize(size_t size) { Bytes.reserve(size); } -StreamableMemoryObject *getNonStreamedMemoryObject( - const unsigned char *Start, const unsigned char *End) { +MemoryObject *getNonStreamedMemoryObject(const unsigned char *Start, + const unsigned char *End) { return new RawMemoryObject(Start, End); } -StreamableMemoryObject::~StreamableMemoryObject() { } - StreamingMemoryObject::StreamingMemoryObject(DataStreamer *streamer) : Bytes(kChunkSize), Streamer(streamer), BytesRead(0), BytesSkipped(0), ObjectSize(0), EOFReached(false) {