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