diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:17:04 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:17:04 +0000 |
commit | b915e9e0fc85ba6f398b3fab0db6a81a8913af94 (patch) | |
tree | 98b8f811c7aff2547cab8642daf372d6c59502fb /unittests/Bitcode/BitReaderTest.cpp | |
parent | 6421cca32f69ac849537a3cff78c352195e99f1b (diff) |
Notes
Diffstat (limited to 'unittests/Bitcode/BitReaderTest.cpp')
-rw-r--r-- | unittests/Bitcode/BitReaderTest.cpp | 103 |
1 files changed, 13 insertions, 90 deletions
diff --git a/unittests/Bitcode/BitReaderTest.cpp b/unittests/Bitcode/BitReaderTest.cpp index d0f33d12d5bc..0003a2b6fb8f 100644 --- a/unittests/Bitcode/BitReaderTest.cpp +++ b/unittests/Bitcode/BitReaderTest.cpp @@ -7,22 +7,22 @@ // //===----------------------------------------------------------------------===// -#include "llvm/ADT/SmallString.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SmallString.h" #include "llvm/AsmParser/Parser.h" +#include "llvm/Bitcode/BitcodeReader.h" +#include "llvm/Bitcode/BitcodeWriter.h" #include "llvm/Bitcode/BitstreamReader.h" #include "llvm/Bitcode/BitstreamWriter.h" -#include "llvm/Bitcode/ReaderWriter.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/Verifier.h" -#include "llvm/Support/DataStream.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/Error.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/SourceMgr.h" -#include "llvm/Support/StreamingMemoryObject.h" #include "gtest/gtest.h" using namespace llvm; @@ -55,91 +55,13 @@ static std::unique_ptr<Module> getLazyModuleFromAssembly(LLVMContext &Context, SmallString<1024> &Mem, const char *Assembly) { writeModuleToBuffer(parseAssembly(Context, Assembly), Mem); - std::unique_ptr<MemoryBuffer> Buffer = - MemoryBuffer::getMemBuffer(Mem.str(), "test", false); - ErrorOr<std::unique_ptr<Module>> ModuleOrErr = - getLazyBitcodeModule(std::move(Buffer), Context); + Expected<std::unique_ptr<Module>> ModuleOrErr = + getLazyBitcodeModule(MemoryBufferRef(Mem.str(), "test"), Context); + if (!ModuleOrErr) + report_fatal_error("Could not parse bitcode module"); return std::move(ModuleOrErr.get()); } -class BufferDataStreamer : public DataStreamer { - std::unique_ptr<MemoryBuffer> Buffer; - unsigned Pos = 0; - size_t GetBytes(unsigned char *Out, size_t Len) override { - StringRef Buf = Buffer->getBuffer(); - size_t Left = Buf.size() - Pos; - Len = std::min(Left, Len); - memcpy(Out, Buffer->getBuffer().substr(Pos).data(), Len); - Pos += Len; - return Len; - } - -public: - BufferDataStreamer(std::unique_ptr<MemoryBuffer> Buffer) - : Buffer(std::move(Buffer)) {} -}; - -static std::unique_ptr<Module> -getStreamedModuleFromAssembly(LLVMContext &Context, SmallString<1024> &Mem, - const char *Assembly) { - writeModuleToBuffer(parseAssembly(Context, Assembly), Mem); - std::unique_ptr<MemoryBuffer> Buffer = - MemoryBuffer::getMemBuffer(Mem.str(), "test", false); - auto Streamer = llvm::make_unique<BufferDataStreamer>(std::move(Buffer)); - ErrorOr<std::unique_ptr<Module>> ModuleOrErr = - getStreamedBitcodeModule("test", std::move(Streamer), Context); - return std::move(ModuleOrErr.get()); -} - -// Checks if we correctly detect eof if we try to read N bits when there are not -// enough bits left on the input stream to read N bits, and we are using a data -// streamer. In particular, it checks if we properly set the object size when -// the eof is reached under such conditions. -TEST(BitReaderTest, TestForEofAfterReadFailureOnDataStreamer) { - // Note: Because StreamingMemoryObject does a call to method GetBytes in it's - // constructor, using internal constant kChunkSize, we must fill the input - // with more characters than that amount. - static size_t InputSize = StreamingMemoryObject::kChunkSize + 5; - char *Text = new char[InputSize]; - std::memset(Text, 'a', InputSize); - Text[InputSize - 1] = '\0'; - StringRef Input(Text); - - // Build bitsteam reader using data streamer. - auto MemoryBuf = MemoryBuffer::getMemBuffer(Input); - std::unique_ptr<DataStreamer> Streamer( - new BufferDataStreamer(std::move(MemoryBuf))); - auto OwnedBytes = - llvm::make_unique<StreamingMemoryObject>(std::move(Streamer)); - auto Reader = llvm::make_unique<BitstreamReader>(std::move(OwnedBytes)); - BitstreamCursor Cursor; - Cursor.init(Reader.get()); - - // Jump to two bytes before end of stream. - Cursor.JumpToBit((InputSize - 4) * CHAR_BIT); - // Try to read 4 bytes when only 2 are present, resulting in error value 0. - const size_t ReadErrorValue = 0; - EXPECT_EQ(ReadErrorValue, Cursor.Read(32)); - // Should be at eof now. - EXPECT_TRUE(Cursor.AtEndOfStream()); - - delete[] Text; -} - -TEST(BitReaderTest, MateralizeForwardRefWithStream) { - SmallString<1024> Mem; - - LLVMContext Context; - std::unique_ptr<Module> M = getStreamedModuleFromAssembly( - Context, Mem, "@table = constant i8* blockaddress(@func, %bb)\n" - "define void @func() {\n" - " unreachable\n" - "bb:\n" - " unreachable\n" - "}\n"); - EXPECT_FALSE(M->getFunction("func")->empty()); -} - // Tests that lazy evaluation can parse functions out of order. TEST(BitReaderTest, MaterializeFunctionsOutOfOrder) { SmallString<1024> Mem; @@ -172,7 +94,7 @@ TEST(BitReaderTest, MaterializeFunctionsOutOfOrder) { EXPECT_FALSE(verifyModule(*M, &dbgs())); // Materialize h. - H->materialize(); + ASSERT_FALSE(H->materialize()); EXPECT_TRUE(F->empty()); EXPECT_TRUE(G->empty()); EXPECT_FALSE(H->empty()); @@ -180,7 +102,7 @@ TEST(BitReaderTest, MaterializeFunctionsOutOfOrder) { EXPECT_FALSE(verifyModule(*M, &dbgs())); // Materialize g. - G->materialize(); + ASSERT_FALSE(G->materialize()); EXPECT_TRUE(F->empty()); EXPECT_FALSE(G->empty()); EXPECT_FALSE(H->empty()); @@ -188,7 +110,7 @@ TEST(BitReaderTest, MaterializeFunctionsOutOfOrder) { EXPECT_FALSE(verifyModule(*M, &dbgs())); // Materialize j. - J->materialize(); + ASSERT_FALSE(J->materialize()); EXPECT_TRUE(F->empty()); EXPECT_FALSE(G->empty()); EXPECT_FALSE(H->empty()); @@ -196,7 +118,7 @@ TEST(BitReaderTest, MaterializeFunctionsOutOfOrder) { EXPECT_FALSE(verifyModule(*M, &dbgs())); // Materialize f. - F->materialize(); + ASSERT_FALSE(F->materialize()); EXPECT_FALSE(F->empty()); EXPECT_FALSE(G->empty()); EXPECT_FALSE(H->empty()); @@ -216,6 +138,7 @@ TEST(BitReaderTest, MaterializeFunctionsForBlockAddr) { // PR11677 " unreachable\n" "}\n"); EXPECT_FALSE(verifyModule(*M, &dbgs())); + EXPECT_FALSE(M->getFunction("func")->empty()); } TEST(BitReaderTest, MaterializeFunctionsForBlockAddrInFunctionBefore) { |