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
This commit is contained in:
Duncan P. N. Exon Smith 2014-08-01 21:01:04 +00:00
parent ab418066a2
commit 2e9b60aea8
2 changed files with 40 additions and 32 deletions

View File

@ -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 {
using namespace llvm;
namespace {
static Module *makeLLVMModule() {
Module* Mod = new Module("test-mem", getGlobalContext());
std::unique_ptr<Module> parseAssembly(const char *Assembly) {
auto M = make_unique<Module>("Module", getGlobalContext());
FunctionType* FuncTy =
FunctionType::get(Type::getVoidTy(Mod->getContext()), false);
Function* Func = Function::Create(FuncTy,GlobalValue::ExternalLinkage,
"func", Mod);
SMDiagnostic Error;
bool Parsed =
ParseAssemblyString(Assembly, M.get(), Error, M->getContext()) == M.get();
BasicBlock* Entry = BasicBlock::Create(Mod->getContext(), "entry", Func);
new UnreachableInst(Mod->getContext(), Entry);
std::string ErrMsg;
raw_string_ostream OS(ErrMsg);
Error.print("", OS);
BasicBlock* BB = BasicBlock::Create(Mod->getContext(), "bb", Func);
new UnreachableInst(Mod->getContext(), BB);
// A failure here means that the test itself is buggy.
if (!Parsed)
report_fatal_error(OS.str().c_str());
PointerType* Int8Ptr = Type::getInt8PtrTy(Mod->getContext());
new GlobalVariable(*Mod, Int8Ptr, /*isConstant=*/true,
GlobalValue::ExternalLinkage,
BlockAddress::get(BB), "table");
return Mod;
return M;
}
static void writeModuleToBuffer(SmallVectorImpl<char> &Buffer) {
std::unique_ptr<Module> Mod(makeLLVMModule());
static void writeModuleToBuffer(std::unique_ptr<Module> Mod,
SmallVectorImpl<char> &Buffer) {
raw_svector_ostream OS(Buffer);
WriteBitcodeToFile(Mod.get(), OS);
}
TEST(BitReaderTest, MaterializeFunctionsForBlockAddr) { // PR11677
SmallString<1024> Mem;
writeModuleToBuffer(Mem);
static std::unique_ptr<Module> getLazyModuleFromAssembly(LLVMContext &Context,
SmallString<1024> &Mem,
const char *Assembly) {
writeModuleToBuffer(parseAssembly(Assembly), Mem);
MemoryBuffer *Buffer = MemoryBuffer::getMemBuffer(Mem.str(), "test", false);
ErrorOr<Module *> ModuleOrErr =
getLazyBitcodeModule(Buffer, getGlobalContext());
std::unique_ptr<Module> m(ModuleOrErr.get());
PassManager passes;
passes.add(createVerifierPass());
passes.add(createDebugInfoVerifierPass());
passes.run(*m);
ErrorOr<Module *> ModuleOrErr = getLazyBitcodeModule(Buffer, Context);
return std::unique_ptr<Module>(ModuleOrErr.get());
}
TEST(BitReaderTest, MaterializeFunctionsForBlockAddr) { // PR11677
SmallString<1024> Mem;
LLVMContext Context;
std::unique_ptr<Module> 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

View File

@ -1,5 +1,5 @@
set(LLVM_LINK_COMPONENTS
BitReader
IRReader
BitWriter
Core
Support