From 2e9b60aea8c9a6a46cc35bf4c3b82d875ef2c750 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Fri, 1 Aug 2014 21:01:04 +0000 Subject: [PATCH] Rewrite BitReaderTest, NFC Rewrite the single unit test in `BitReaderTest` so that it's easier to add more tests. - Parse from an assembly string rather than using API. - Use more helper functions. - Use a separate context for the module on the other side. Aside from relying on the assembly parser, there's no functionality change intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214556 91177308-0d34-0410-b5e6-96231b3b80d8 --- unittests/Bitcode/BitReaderTest.cpp | 70 ++++++++++++++++------------- unittests/Bitcode/CMakeLists.txt | 2 +- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/unittests/Bitcode/BitReaderTest.cpp b/unittests/Bitcode/BitReaderTest.cpp index b6a3e9a7b75..144853d4d78 100644 --- a/unittests/Bitcode/BitReaderTest.cpp +++ b/unittests/Bitcode/BitReaderTest.cpp @@ -10,58 +10,66 @@ #include "llvm/ADT/SmallString.h" #include "llvm/Bitcode/BitstreamWriter.h" #include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/AsmParser/Parser.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/Verifier.h" -#include "llvm/PassManager.h" +#include "llvm/Support/Debug.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/SourceMgr.h" #include "gtest/gtest.h" -namespace llvm { -namespace { +using namespace llvm; -static Module *makeLLVMModule() { - Module* Mod = new Module("test-mem", getGlobalContext()); +namespace { - FunctionType* FuncTy = - FunctionType::get(Type::getVoidTy(Mod->getContext()), false); - Function* Func = Function::Create(FuncTy,GlobalValue::ExternalLinkage, - "func", Mod); +std::unique_ptr parseAssembly(const char *Assembly) { + auto M = make_unique("Module", getGlobalContext()); - BasicBlock* Entry = BasicBlock::Create(Mod->getContext(), "entry", Func); - new UnreachableInst(Mod->getContext(), Entry); + SMDiagnostic Error; + bool Parsed = + ParseAssemblyString(Assembly, M.get(), Error, M->getContext()) == M.get(); - BasicBlock* BB = BasicBlock::Create(Mod->getContext(), "bb", Func); - new UnreachableInst(Mod->getContext(), BB); + std::string ErrMsg; + raw_string_ostream OS(ErrMsg); + Error.print("", OS); - PointerType* Int8Ptr = Type::getInt8PtrTy(Mod->getContext()); - new GlobalVariable(*Mod, Int8Ptr, /*isConstant=*/true, - GlobalValue::ExternalLinkage, - BlockAddress::get(BB), "table"); + // A failure here means that the test itself is buggy. + if (!Parsed) + report_fatal_error(OS.str().c_str()); - return Mod; + return M; } -static void writeModuleToBuffer(SmallVectorImpl &Buffer) { - std::unique_ptr Mod(makeLLVMModule()); +static void writeModuleToBuffer(std::unique_ptr Mod, + SmallVectorImpl &Buffer) { raw_svector_ostream OS(Buffer); WriteBitcodeToFile(Mod.get(), OS); } -TEST(BitReaderTest, MaterializeFunctionsForBlockAddr) { // PR11677 - SmallString<1024> Mem; - writeModuleToBuffer(Mem); +static std::unique_ptr getLazyModuleFromAssembly(LLVMContext &Context, + SmallString<1024> &Mem, + const char *Assembly) { + writeModuleToBuffer(parseAssembly(Assembly), Mem); MemoryBuffer *Buffer = MemoryBuffer::getMemBuffer(Mem.str(), "test", false); - ErrorOr ModuleOrErr = - getLazyBitcodeModule(Buffer, getGlobalContext()); - std::unique_ptr m(ModuleOrErr.get()); - PassManager passes; - passes.add(createVerifierPass()); - passes.add(createDebugInfoVerifierPass()); - passes.run(*m); + ErrorOr ModuleOrErr = getLazyBitcodeModule(Buffer, Context); + return std::unique_ptr(ModuleOrErr.get()); } +TEST(BitReaderTest, MaterializeFunctionsForBlockAddr) { // PR11677 + SmallString<1024> Mem; + + LLVMContext Context; + std::unique_ptr M = getLazyModuleFromAssembly( + Context, Mem, "@table = constant i8* blockaddress(@func, %bb)\n" + "define void @func() {\n" + " unreachable\n" + "bb:\n" + " unreachable\n" + "}\n"); + EXPECT_FALSE(verifyModule(*M, &dbgs())); } -} + +} // end namespace diff --git a/unittests/Bitcode/CMakeLists.txt b/unittests/Bitcode/CMakeLists.txt index 743ab18ad2c..c559377ed9d 100644 --- a/unittests/Bitcode/CMakeLists.txt +++ b/unittests/Bitcode/CMakeLists.txt @@ -1,5 +1,5 @@ set(LLVM_LINK_COMPONENTS - BitReader + IRReader BitWriter Core Support -- 2.34.1