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