diff options
Diffstat (limited to 'unittests/Linker')
-rw-r--r-- | unittests/Linker/CMakeLists.txt | 1 | ||||
-rw-r--r-- | unittests/Linker/LinkModulesTest.cpp | 44 | ||||
-rw-r--r-- | unittests/Linker/Makefile | 2 |
3 files changed, 36 insertions, 11 deletions
diff --git a/unittests/Linker/CMakeLists.txt b/unittests/Linker/CMakeLists.txt index c3dccb6c7b..05f45c0a8c 100644 --- a/unittests/Linker/CMakeLists.txt +++ b/unittests/Linker/CMakeLists.txt @@ -1,4 +1,5 @@ set(LLVM_LINK_COMPONENTS + AsmParser core linker ) diff --git a/unittests/Linker/LinkModulesTest.cpp b/unittests/Linker/LinkModulesTest.cpp index 4ccced195d..b15d1804e8 100644 --- a/unittests/Linker/LinkModulesTest.cpp +++ b/unittests/Linker/LinkModulesTest.cpp @@ -7,12 +7,14 @@ // //===----------------------------------------------------------------------===// +#include "llvm/AsmParser/Parser.h" #include "llvm/Linker/Linker.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/Function.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/Module.h" +#include "llvm/Support/SourceMgr.h" #include "gtest/gtest.h" using namespace llvm; @@ -88,7 +90,7 @@ TEST_F(LinkModuleTest, BlockAddress) { Builder.CreateRet(ConstantPointerNull::get(Type::getInt8PtrTy(Ctx))); Module *LinkedModule = new Module("MyModuleLinked", Ctx); - Linker::LinkModules(LinkedModule, M.get(), Linker::PreserveSource, nullptr); + Linker::LinkModules(LinkedModule, M.get()); // Delete the original module. M.reset(); @@ -122,12 +124,13 @@ TEST_F(LinkModuleTest, BlockAddress) { delete LinkedModule; } -TEST_F(LinkModuleTest, EmptyModule) { +static Module *getInternal(LLVMContext &Ctx) { Module *InternalM = new Module("InternalModule", Ctx); FunctionType *FTy = FunctionType::get( Type::getVoidTy(Ctx), Type::getInt8PtrTy(Ctx), false /*=isVarArgs*/); - F = Function::Create(FTy, Function::InternalLinkage, "bar", InternalM); + Function *F = + Function::Create(FTy, Function::InternalLinkage, "bar", InternalM); F->setCallingConv(CallingConv::C); BasicBlock *BB = BasicBlock::Create(Ctx, "", F); @@ -141,16 +144,37 @@ TEST_F(LinkModuleTest, EmptyModule) { GlobalValue::InternalLinkage, nullptr, "g"); GV->setInitializer(ConstantStruct::get(STy, F)); + return InternalM; +} + +TEST_F(LinkModuleTest, EmptyModule) { + std::unique_ptr<Module> InternalM(getInternal(Ctx)); + std::unique_ptr<Module> EmptyM(new Module("EmptyModule1", Ctx)); + Linker::LinkModules(EmptyM.get(), InternalM.get()); +} + +TEST_F(LinkModuleTest, EmptyModule2) { + std::unique_ptr<Module> InternalM(getInternal(Ctx)); + std::unique_ptr<Module> EmptyM(new Module("EmptyModule1", Ctx)); + Linker::LinkModules(InternalM.get(), EmptyM.get()); +} + +TEST_F(LinkModuleTest, TypeMerge) { + LLVMContext C; + SMDiagnostic Err; + + const char *M1Str = "%t = type {i32}\n" + "@t1 = weak global %t zeroinitializer\n"; + std::unique_ptr<Module> M1 = parseAssemblyString(M1Str, Err, C); - Module *EmptyM = new Module("EmptyModule1", Ctx); - Linker::LinkModules(EmptyM, InternalM, Linker::PreserveSource, nullptr); + const char *M2Str = "%t = type {i32}\n" + "@t2 = weak global %t zeroinitializer\n"; + std::unique_ptr<Module> M2 = parseAssemblyString(M2Str, Err, C); - delete EmptyM; - EmptyM = new Module("EmptyModule2", Ctx); - Linker::LinkModules(InternalM, EmptyM, Linker::PreserveSource, nullptr); + Linker::LinkModules(M1.get(), M2.get(), [](const llvm::DiagnosticInfo &){}); - delete EmptyM; - delete InternalM; + EXPECT_EQ(M1->getNamedGlobal("t1")->getType(), + M1->getNamedGlobal("t2")->getType()); } } // end anonymous namespace diff --git a/unittests/Linker/Makefile b/unittests/Linker/Makefile index c6058c4d60..ddbce07d4a 100644 --- a/unittests/Linker/Makefile +++ b/unittests/Linker/Makefile @@ -9,7 +9,7 @@ LEVEL = ../.. TESTNAME = Linker -LINK_COMPONENTS := core linker +LINK_COMPONENTS := core linker asmparser include $(LEVEL)/Makefile.config include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest |