diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-06-17 01:15:47 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-06-17 01:15:47 +0000 |
| commit | 456baad24d620e2e1feb39436ef861491cca2736 (patch) | |
| tree | 89be0a4437add772be61b0111210147c8776f0cc /llvm/unittests/Bitcode/BitReaderTest.cpp | |
| parent | 728074b73cee01d1b237c27c457b79668df0888e (diff) | |
| download | llvm-456baad24d620e2e1feb39436ef861491cca2736.zip llvm-456baad24d620e2e1feb39436ef861491cca2736.tar.gz llvm-456baad24d620e2e1feb39436ef861491cca2736.tar.bz2 | |
Handle forward referenced function when streaming bitcode.
Without this the included unit test would assert in
assert(BasicBlockFwdRefs.empty() && "Unresolved blockaddress fwd references");
llvm-svn: 239871
Diffstat (limited to 'llvm/unittests/Bitcode/BitReaderTest.cpp')
| -rw-r--r-- | llvm/unittests/Bitcode/BitReaderTest.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/llvm/unittests/Bitcode/BitReaderTest.cpp b/llvm/unittests/Bitcode/BitReaderTest.cpp index 691a217..81d3a28 100644 --- a/llvm/unittests/Bitcode/BitReaderTest.cpp +++ b/llvm/unittests/Bitcode/BitReaderTest.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/AsmParser/Parser.h" #include "llvm/Bitcode/BitstreamWriter.h" #include "llvm/Bitcode/ReaderWriter.h" @@ -16,6 +17,7 @@ #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/MemoryBuffer.h" #include "llvm/Support/SourceMgr.h" @@ -58,6 +60,49 @@ static std::unique_ptr<Module> getLazyModuleFromAssembly(LLVMContext &Context, 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(Assembly), Mem); + std::unique_ptr<MemoryBuffer> Buffer = + MemoryBuffer::getMemBuffer(Mem.str(), "test", false); + auto Streamer = make_unique<BufferDataStreamer>(std::move(Buffer)); + ErrorOr<std::unique_ptr<Module>> ModuleOrErr = + getStreamedBitcodeModule("test", std::move(Streamer), Context); + return std::move(ModuleOrErr.get()); +} + +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()); +} + TEST(BitReaderTest, DematerializeFunctionPreservesLinkageType) { SmallString<1024> Mem; |
