From: Rafael Espindola Date: Fri, 21 Nov 2014 05:15:41 +0000 (+0000) Subject: Fix a silly bug in StreamingMemoryObject.cpp. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=ed46a2c2aabed268d487e5130a6a3730e912b35d;p=oota-llvm.git Fix a silly bug in StreamingMemoryObject.cpp. The logic for detecting EOF was wrong and would fail if we ever requested more than 16k past the last read position. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222505 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/StreamingMemoryObject.h b/include/llvm/Support/StreamingMemoryObject.h index 6957c6e41ac..66ed521a411 100644 --- a/include/llvm/Support/StreamingMemoryObject.h +++ b/include/llvm/Support/StreamingMemoryObject.h @@ -65,19 +65,20 @@ private: // Most of the requests will be small, but we fetch at kChunkSize bytes // at a time to avoid making too many potentially expensive GetBytes calls bool fetchToPos(size_t Pos) const { - if (EOFReached) return Pos < ObjectSize; + if (EOFReached) + return Pos < ObjectSize; while (Pos >= BytesRead) { Bytes.resize(BytesRead + BytesSkipped + kChunkSize); size_t bytes = Streamer->GetBytes(&Bytes[BytesRead + BytesSkipped], kChunkSize); BytesRead += bytes; - if (BytesRead <= Pos) { // reached EOF/ran out of bytes + if (bytes != kChunkSize) { // reached EOF/ran out of bytes ObjectSize = BytesRead; EOFReached = true; - return false; + break; } } - return true; + return Pos < BytesRead; } StreamingMemoryObject(const StreamingMemoryObject&) LLVM_DELETED_FUNCTION; diff --git a/unittests/Support/CMakeLists.txt b/unittests/Support/CMakeLists.txt index 7abdd8ab82b..dd270ccea42 100644 --- a/unittests/Support/CMakeLists.txt +++ b/unittests/Support/CMakeLists.txt @@ -32,6 +32,7 @@ add_llvm_unittest(SupportTests ScaledNumberTest.cpp SourceMgrTest.cpp SpecialCaseListTest.cpp + StreamingMemoryObject.cpp StringPool.cpp SwapByteOrderTest.cpp ThreadLocalTest.cpp diff --git a/unittests/Support/StreamingMemoryObject.cpp b/unittests/Support/StreamingMemoryObject.cpp new file mode 100644 index 00000000000..399501ed35c --- /dev/null +++ b/unittests/Support/StreamingMemoryObject.cpp @@ -0,0 +1,30 @@ +//===- llvm/unittest/Support/StreamingMemoryObject.cpp - unit tests -------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Support/StreamingMemoryObject.h" +#include "gtest/gtest.h" + +#include + +using namespace llvm; + +namespace { +class NullDataStreamer : public DataStreamer { + size_t GetBytes(unsigned char *buf, size_t len) override { + memset(buf, 0, len); + return len; + } +}; +} + +TEST(StreamingMemoryObject, Test) { + auto *DS = new NullDataStreamer(); + StreamingMemoryObject O(DS); + EXPECT_TRUE(O.isValidAddress(32 * 1024)); +}