mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
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. llvm-svn: 214556
This commit is contained in:
parent
bfbea18b59
commit
2f470a350f
@ -10,58 +10,66 @@
|
|||||||
#include "llvm/ADT/SmallString.h"
|
#include "llvm/ADT/SmallString.h"
|
||||||
#include "llvm/Bitcode/BitstreamWriter.h"
|
#include "llvm/Bitcode/BitstreamWriter.h"
|
||||||
#include "llvm/Bitcode/ReaderWriter.h"
|
#include "llvm/Bitcode/ReaderWriter.h"
|
||||||
|
#include "llvm/AsmParser/Parser.h"
|
||||||
#include "llvm/IR/Constants.h"
|
#include "llvm/IR/Constants.h"
|
||||||
#include "llvm/IR/Instructions.h"
|
#include "llvm/IR/Instructions.h"
|
||||||
#include "llvm/IR/LLVMContext.h"
|
#include "llvm/IR/LLVMContext.h"
|
||||||
#include "llvm/IR/Module.h"
|
#include "llvm/IR/Module.h"
|
||||||
#include "llvm/IR/Verifier.h"
|
#include "llvm/IR/Verifier.h"
|
||||||
#include "llvm/PassManager.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Support/MemoryBuffer.h"
|
#include "llvm/Support/MemoryBuffer.h"
|
||||||
|
#include "llvm/Support/SourceMgr.h"
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
namespace llvm {
|
using namespace llvm;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
static Module *makeLLVMModule() {
|
std::unique_ptr<Module> parseAssembly(const char *Assembly) {
|
||||||
Module* Mod = new Module("test-mem", getGlobalContext());
|
auto M = make_unique<Module>("Module", getGlobalContext());
|
||||||
|
|
||||||
FunctionType* FuncTy =
|
SMDiagnostic Error;
|
||||||
FunctionType::get(Type::getVoidTy(Mod->getContext()), false);
|
bool Parsed =
|
||||||
Function* Func = Function::Create(FuncTy,GlobalValue::ExternalLinkage,
|
ParseAssemblyString(Assembly, M.get(), Error, M->getContext()) == M.get();
|
||||||
"func", Mod);
|
|
||||||
|
|
||||||
BasicBlock* Entry = BasicBlock::Create(Mod->getContext(), "entry", Func);
|
std::string ErrMsg;
|
||||||
new UnreachableInst(Mod->getContext(), Entry);
|
raw_string_ostream OS(ErrMsg);
|
||||||
|
Error.print("", OS);
|
||||||
|
|
||||||
BasicBlock* BB = BasicBlock::Create(Mod->getContext(), "bb", Func);
|
// A failure here means that the test itself is buggy.
|
||||||
new UnreachableInst(Mod->getContext(), BB);
|
if (!Parsed)
|
||||||
|
report_fatal_error(OS.str().c_str());
|
||||||
|
|
||||||
PointerType* Int8Ptr = Type::getInt8PtrTy(Mod->getContext());
|
return M;
|
||||||
new GlobalVariable(*Mod, Int8Ptr, /*isConstant=*/true,
|
|
||||||
GlobalValue::ExternalLinkage,
|
|
||||||
BlockAddress::get(BB), "table");
|
|
||||||
|
|
||||||
return Mod;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writeModuleToBuffer(SmallVectorImpl<char> &Buffer) {
|
static void writeModuleToBuffer(std::unique_ptr<Module> Mod,
|
||||||
std::unique_ptr<Module> Mod(makeLLVMModule());
|
SmallVectorImpl<char> &Buffer) {
|
||||||
raw_svector_ostream OS(Buffer);
|
raw_svector_ostream OS(Buffer);
|
||||||
WriteBitcodeToFile(Mod.get(), OS);
|
WriteBitcodeToFile(Mod.get(), OS);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(BitReaderTest, MaterializeFunctionsForBlockAddr) { // PR11677
|
static std::unique_ptr<Module> getLazyModuleFromAssembly(LLVMContext &Context,
|
||||||
SmallString<1024> Mem;
|
SmallString<1024> &Mem,
|
||||||
writeModuleToBuffer(Mem);
|
const char *Assembly) {
|
||||||
|
writeModuleToBuffer(parseAssembly(Assembly), Mem);
|
||||||
MemoryBuffer *Buffer = MemoryBuffer::getMemBuffer(Mem.str(), "test", false);
|
MemoryBuffer *Buffer = MemoryBuffer::getMemBuffer(Mem.str(), "test", false);
|
||||||
ErrorOr<Module *> ModuleOrErr =
|
ErrorOr<Module *> ModuleOrErr = getLazyBitcodeModule(Buffer, Context);
|
||||||
getLazyBitcodeModule(Buffer, getGlobalContext());
|
return std::unique_ptr<Module>(ModuleOrErr.get());
|
||||||
std::unique_ptr<Module> m(ModuleOrErr.get());
|
|
||||||
PassManager passes;
|
|
||||||
passes.add(createVerifierPass());
|
|
||||||
passes.add(createDebugInfoVerifierPass());
|
|
||||||
passes.run(*m);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
set(LLVM_LINK_COMPONENTS
|
set(LLVM_LINK_COMPONENTS
|
||||||
BitReader
|
IRReader
|
||||||
BitWriter
|
BitWriter
|
||||||
Core
|
Core
|
||||||
Support
|
Support
|
||||||
|
Loading…
Reference in New Issue
Block a user