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