diff options
Diffstat (limited to 'lib/Support/StreamingMemoryObject.cpp')
| -rw-r--r-- | lib/Support/StreamingMemoryObject.cpp | 24 | 
1 files changed, 14 insertions, 10 deletions
| diff --git a/lib/Support/StreamingMemoryObject.cpp b/lib/Support/StreamingMemoryObject.cpp index 68beeef4dc7f1..6c5652af04c2f 100644 --- a/lib/Support/StreamingMemoryObject.cpp +++ b/lib/Support/StreamingMemoryObject.cpp @@ -8,12 +8,9 @@  //===----------------------------------------------------------------------===//  #include "llvm/Support/StreamingMemoryObject.h" -#include "llvm/Support/Compiler.h"  #include <cassert>  #include <cstddef>  #include <cstring> - -  using namespace llvm;  namespace { @@ -45,8 +42,8 @@ private:      return static_cast<std::ptrdiff_t>(address) < LastChar - FirstChar;    } -  RawMemoryObject(const RawMemoryObject&) LLVM_DELETED_FUNCTION; -  void operator=(const RawMemoryObject&) LLVM_DELETED_FUNCTION; +  RawMemoryObject(const RawMemoryObject&) = delete; +  void operator=(const RawMemoryObject&) = delete;  };  uint64_t RawMemoryObject::readBytes(uint8_t *Buf, uint64_t Size, @@ -76,7 +73,7 @@ namespace llvm {  // block until we actually want to read it.  bool StreamingMemoryObject::isValidAddress(uint64_t address) const {    if (ObjectSize && address < ObjectSize) return true; -    return fetchToPos(address); +  return fetchToPos(address);  }  uint64_t StreamingMemoryObject::getExtent() const { @@ -90,13 +87,18 @@ uint64_t StreamingMemoryObject::getExtent() const {  uint64_t StreamingMemoryObject::readBytes(uint8_t *Buf, uint64_t Size,                                            uint64_t Address) const {    fetchToPos(Address + Size - 1); -  if (Address >= BytesRead) +  // Note: For wrapped bitcode files will set ObjectSize after the +  // first call to fetchToPos. In such cases, ObjectSize can be +  // smaller than BytesRead. +  size_t MaxAddress = +      (ObjectSize && ObjectSize < BytesRead) ? ObjectSize : BytesRead; +  if (Address >= MaxAddress)      return 0;    uint64_t End = Address + Size; -  if (End > BytesRead) -    End = BytesRead; -  assert(static_cast<int64_t>(End - Address) >= 0); +  if (End > MaxAddress) +    End = MaxAddress; +  assert(End >= Address);    Size = End - Address;    memcpy(Buf, &Bytes[Address + BytesSkipped], Size);    return Size; @@ -112,6 +114,8 @@ bool StreamingMemoryObject::dropLeadingBytes(size_t s) {  void StreamingMemoryObject::setKnownObjectSize(size_t size) {    ObjectSize = size;    Bytes.reserve(size); +  if (ObjectSize <= BytesRead) +    EOFReached = true;  }  MemoryObject *getNonStreamedMemoryObject(const unsigned char *Start, | 
