1e517273eSChandler Carruth //===- llvm/unittest/Bitcode/BitReaderTest.cpp - Tests for BitReader ------===//
2e517273eSChandler Carruth //
3e517273eSChandler Carruth //                     The LLVM Compiler Infrastructure
4e517273eSChandler Carruth //
5e517273eSChandler Carruth // This file is distributed under the University of Illinois Open Source
6e517273eSChandler Carruth // License. See LICENSE.TXT for details.
7e517273eSChandler Carruth //
8e517273eSChandler Carruth //===----------------------------------------------------------------------===//
9e517273eSChandler Carruth 
10*5fa5ecf8SDaniel Dunbar #include "llvm/ADT/SmallString.h"
11e517273eSChandler Carruth #include "llvm/Analysis/Verifier.h"
12e517273eSChandler Carruth #include "llvm/Bitcode/BitstreamWriter.h"
13e517273eSChandler Carruth #include "llvm/Bitcode/ReaderWriter.h"
14e517273eSChandler Carruth #include "llvm/Constants.h"
15e517273eSChandler Carruth #include "llvm/Instructions.h"
16e517273eSChandler Carruth #include "llvm/LLVMContext.h"
17e517273eSChandler Carruth #include "llvm/Module.h"
18e517273eSChandler Carruth #include "llvm/PassManager.h"
19e517273eSChandler Carruth #include "llvm/Support/MemoryBuffer.h"
20e517273eSChandler Carruth #include "gtest/gtest.h"
21e517273eSChandler Carruth 
22e517273eSChandler Carruth namespace llvm {
23e517273eSChandler Carruth namespace {
24e517273eSChandler Carruth 
25e517273eSChandler Carruth static Module *makeLLVMModule() {
26e517273eSChandler Carruth   Module* Mod = new Module("test-mem", getGlobalContext());
27e517273eSChandler Carruth 
28e517273eSChandler Carruth   FunctionType* FuncTy =
29e517273eSChandler Carruth     FunctionType::get(Type::getVoidTy(Mod->getContext()), false);
30e517273eSChandler Carruth   Function* Func = Function::Create(FuncTy,GlobalValue::ExternalLinkage,
31e517273eSChandler Carruth                                     "func", Mod);
32e517273eSChandler Carruth 
33e517273eSChandler Carruth   BasicBlock* Entry = BasicBlock::Create(Mod->getContext(), "entry", Func);
34e517273eSChandler Carruth   new UnreachableInst(Mod->getContext(), Entry);
35e517273eSChandler Carruth 
36e517273eSChandler Carruth   BasicBlock* BB = BasicBlock::Create(Mod->getContext(), "bb", Func);
37e517273eSChandler Carruth   new UnreachableInst(Mod->getContext(), BB);
38e517273eSChandler Carruth 
39e517273eSChandler Carruth   PointerType* Int8Ptr = Type::getInt8PtrTy(Mod->getContext());
40e517273eSChandler Carruth   new GlobalVariable(*Mod, Int8Ptr, /*isConstant=*/true,
41e517273eSChandler Carruth                      GlobalValue::ExternalLinkage,
42e517273eSChandler Carruth                      BlockAddress::get(BB), "table");
43e517273eSChandler Carruth 
44e517273eSChandler Carruth   return Mod;
45e517273eSChandler Carruth }
46e517273eSChandler Carruth 
47*5fa5ecf8SDaniel Dunbar static void writeModuleToBuffer(SmallVectorImpl<char> &Buffer) {
48e517273eSChandler Carruth   Module *Mod = makeLLVMModule();
49*5fa5ecf8SDaniel Dunbar   raw_svector_ostream OS(Buffer);
50*5fa5ecf8SDaniel Dunbar   WriteBitcodeToFile(Mod, OS);
51e517273eSChandler Carruth }
52e517273eSChandler Carruth 
53e517273eSChandler Carruth TEST(BitReaderTest, MaterializeFunctionsForBlockAddr) { // PR11677
54*5fa5ecf8SDaniel Dunbar   SmallString<1024> Mem;
55e517273eSChandler Carruth   writeModuleToBuffer(Mem);
56*5fa5ecf8SDaniel Dunbar   MemoryBuffer *Buffer = MemoryBuffer::getMemBuffer(Mem.str(), "test", false);
57e517273eSChandler Carruth   std::string errMsg;
58e517273eSChandler Carruth   Module *m = getLazyBitcodeModule(Buffer, getGlobalContext(), &errMsg);
59e517273eSChandler Carruth   PassManager passes;
60e517273eSChandler Carruth   passes.add(createVerifierPass());
61e517273eSChandler Carruth   passes.run(*m);
62e517273eSChandler Carruth }
63e517273eSChandler Carruth 
64e517273eSChandler Carruth }
65e517273eSChandler Carruth }
66