summaryrefslogtreecommitdiffstats
path: root/unittests/Bitcode/BitReaderTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'unittests/Bitcode/BitReaderTest.cpp')
-rw-r--r--unittests/Bitcode/BitReaderTest.cpp49
1 files changed, 47 insertions, 2 deletions
diff --git a/unittests/Bitcode/BitReaderTest.cpp b/unittests/Bitcode/BitReaderTest.cpp
index 2e6dd0b..3c56ea0 100644
--- a/unittests/Bitcode/BitReaderTest.cpp
+++ b/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"
@@ -53,9 +55,52 @@ static std::unique_ptr<Module> getLazyModuleFromAssembly(LLVMContext &Context,
writeModuleToBuffer(parseAssembly(Assembly), Mem);
std::unique_ptr<MemoryBuffer> Buffer =
MemoryBuffer::getMemBuffer(Mem.str(), "test", false);
- ErrorOr<Module *> ModuleOrErr =
+ ErrorOr<std::unique_ptr<Module>> ModuleOrErr =
getLazyBitcodeModule(std::move(Buffer), Context);
- return std::unique_ptr<Module>(ModuleOrErr.get());
+ 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 = llvm::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) {
OpenPOWER on IntegriCloud