[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