[llvm] r221794 - Return the number of read bytes in MemoryObject::readBytes.
David Blaikie
dblaikie at gmail.com
Wed Nov 12 11:41:32 PST 2014
On Wed, Nov 12, 2014 at 9:11 AM, Rafael Espindola <
rafael.espindola at gmail.com> wrote:
> Author: rafael
> Date: Wed Nov 12 11:11:16 2014
> New Revision: 221794
>
> URL: http://llvm.org/viewvc/llvm-project?rev=221794&view=rev
> Log:
> Return the number of read bytes in MemoryObject::readBytes.
>
> Returning more information will allow BitstreamReader to be simplified a
> bit
> and changed to read 64 bits at a time.
>
> Modified:
> llvm/trunk/include/llvm/Bitcode/BitstreamReader.h
> llvm/trunk/include/llvm/Support/MemoryObject.h
> llvm/trunk/include/llvm/Support/StreamingMemoryObject.h
> llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
> llvm/trunk/lib/Support/StreamingMemoryObject.cpp
>
> Modified: llvm/trunk/include/llvm/Bitcode/BitstreamReader.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/BitstreamReader.h?rev=221794&r1=221793&r2=221794&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Bitcode/BitstreamReader.h (original)
> +++ llvm/trunk/include/llvm/Bitcode/BitstreamReader.h Wed Nov 12 11:11:16
> 2014
> @@ -341,7 +341,7 @@ public:
> // Read the next word from the stream.
> uint8_t Array[sizeof(word_t)] = {0};
>
> - BitStream->getBitcodeBytes().readBytes(NextChar, sizeof(Array),
> Array);
> + BitStream->getBitcodeBytes().readBytes(Array, sizeof(Array),
> NextChar);
>
> // Handle big-endian byte-swapping if necessary.
> support::detail::packed_endian_specific_integral
>
> Modified: llvm/trunk/include/llvm/Support/MemoryObject.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/MemoryObject.h?rev=221794&r1=221793&r2=221794&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/MemoryObject.h (original)
> +++ llvm/trunk/include/llvm/Support/MemoryObject.h Wed Nov 12 11:11:16 2014
> @@ -36,18 +36,16 @@ public:
> virtual uint64_t getExtent() const = 0;
>
> /// 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.
> + /// of the region.
> ///
> /// @param address - The address of the first byte, in the same space
> as
> /// getBase().
> /// @param size - The 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 - 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) const = 0;
> + /// @result - The number of bytes read.
> + virtual uint64_t readBytes(uint8_t *Buf, uint64_t Size,
>
Should this instead be a MutableArrayRef<uint8_t> ?
> + uint64_t Address) 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
>
> Modified: llvm/trunk/include/llvm/Support/StreamingMemoryObject.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/StreamingMemoryObject.h?rev=221794&r1=221793&r2=221794&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/StreamingMemoryObject.h (original)
> +++ llvm/trunk/include/llvm/Support/StreamingMemoryObject.h Wed Nov 12
> 11:11:16 2014
> @@ -27,8 +27,8 @@ class StreamingMemoryObject : public Mem
> public:
> StreamingMemoryObject(DataStreamer *streamer);
> uint64_t getExtent() const override;
> - int readBytes(uint64_t address, uint64_t size,
> - uint8_t *buf) const override;
> + uint64_t readBytes(uint8_t *Buf, uint64_t Size,
> + uint64_t Address) const override;
> const uint8_t *getPointer(uint64_t address, uint64_t size) const
> override {
> // This could be fixed by ensuring the bytes are fetched and making a
> copy,
> // requiring that the bitcode size be known, or otherwise ensuring
> that
>
> Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=221794&r1=221793&r2=221794&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
> +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Wed Nov 12 11:11:16
> 2014
> @@ -3430,7 +3430,7 @@ std::error_code BitcodeReader::InitLazyS
> Stream.init(&*StreamFile);
>
> unsigned char buf[16];
> - if (Bytes->readBytes(0, 16, buf) == -1)
> + if (Bytes->readBytes(buf, 16, 0) != 16)
> return Error(BitcodeError::InvalidBitcodeSignature);
>
> if (!isBitcode(buf, buf + 16))
>
> Modified: llvm/trunk/lib/Support/StreamingMemoryObject.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/StreamingMemoryObject.cpp?rev=221794&r1=221793&r2=221794&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/StreamingMemoryObject.cpp (original)
> +++ llvm/trunk/lib/Support/StreamingMemoryObject.cpp Wed Nov 12 11:11:16
> 2014
> @@ -28,8 +28,8 @@ public:
> uint64_t getExtent() const override {
> return LastChar - FirstChar;
> }
> - int readBytes(uint64_t address, uint64_t size,
> - uint8_t *buf) const override;
> + uint64_t readBytes(uint8_t *Buf, uint64_t Size,
> + uint64_t Address) const override;
> const uint8_t *getPointer(uint64_t address, uint64_t size) const
> override;
> bool isValidAddress(uint64_t address) const override {
> return validAddress(address);
> @@ -55,12 +55,20 @@ private:
> void operator=(const RawMemoryObject&) LLVM_DELETED_FUNCTION;
> };
>
> -int RawMemoryObject::readBytes(uint64_t address,
> - uint64_t size,
> - uint8_t *buf) const {
> - if (!validAddress(address) || !validAddress(address + size - 1)) return
> -1;
> - memcpy(buf, (uint8_t *)(uintptr_t)(address + FirstChar), size);
> - return size;
> +uint64_t RawMemoryObject::readBytes(uint8_t *Buf, uint64_t Size,
> + uint64_t Address) const {
> + uint64_t BufferSize = LastChar - FirstChar;
> + if (Address >= BufferSize)
> + return 0;
> +
> + uint64_t End = Address + Size;
> + if (End > BufferSize)
> + End = BufferSize;
> +
> + Size = End - Address;
> + assert(Size >= 0);
> + memcpy(Buf, (uint8_t *)(Address + FirstChar), Size);
> + return Size;
> }
>
> const uint8_t *RawMemoryObject::getPointer(uint64_t address,
> @@ -91,12 +99,20 @@ uint64_t StreamingMemoryObject::getExten
> return ObjectSize;
> }
>
> -int StreamingMemoryObject::readBytes(uint64_t address,
> - uint64_t size,
> - uint8_t *buf) const {
> - if (!fetchToPos(address + size - 1)) return -1;
> - memcpy(buf, &Bytes[address + BytesSkipped], size);
> - return 0;
> +uint64_t StreamingMemoryObject::readBytes(uint8_t *Buf, uint64_t Size,
> + uint64_t Address) const {
> + fetchToPos(Address + Size - 1);
> + uint64_t BufferSize = Bytes.size() - BytesSkipped;
> + if (Address >= BufferSize)
> + return 0;
> +
> + uint64_t End = Address + Size;
> + if (End > BufferSize)
> + End = BufferSize;
> + Size = End - Address;
> + assert(Size >= 0);
> + memcpy(Buf, &Bytes[Address + BytesSkipped], Size);
> + return Size;
> }
>
> bool StreamingMemoryObject::dropLeadingBytes(size_t s) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141112/2bb1e9ef/attachment.html>
More information about the llvm-commits
mailing list