From 999ffb6085a6e24261680b41d4f43ad4ba8fd250 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Sat, 9 Nov 2013 00:43:18 +0000 Subject: Revert "Move copying of global initializers below the cloning of functions." This would cause internal symbols that are only referenced by global initializers to be removed. This reverts commit 194219. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194304 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Linker/LinkModules.cpp | 8 +-- unittests/Linker/CMakeLists.txt | 12 ---- unittests/Linker/LinkModulesTest.cpp | 131 ----------------------------------- unittests/Linker/Makefile | 15 ---- unittests/Makefile | 2 +- 5 files changed, 5 insertions(+), 163 deletions(-) delete mode 100644 unittests/Linker/CMakeLists.txt delete mode 100644 unittests/Linker/LinkModulesTest.cpp delete mode 100644 unittests/Linker/Makefile diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 00c2ed144d..8f2200e4ea 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -1251,6 +1251,10 @@ bool ModuleLinker::run() { for (unsigned i = 0, e = AppendingVars.size(); i != e; ++i) linkAppendingVarInit(AppendingVars[i]); + // Update the initializers in the DstM module now that all globals that may + // be referenced are in DstM. + linkGlobalInits(); + // Link in the function bodies that are defined in the source module into // DstM. for (Module::iterator SF = SrcM->begin(), E = SrcM->end(); SF != E; ++SF) { @@ -1332,10 +1336,6 @@ bool ModuleLinker::run() { } } while (LinkedInAnyFunctions); - // Update the initializers in the DstM module now that all globals that may - // be referenced are in DstM. - linkGlobalInits(); - // Now that all of the types from the source are used, resolve any structs // copied over to the dest that didn't exist there. TypeMap.linkDefinedTypeBodies(); diff --git a/unittests/Linker/CMakeLists.txt b/unittests/Linker/CMakeLists.txt deleted file mode 100644 index c3dccb6c7b..0000000000 --- a/unittests/Linker/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -set(LLVM_LINK_COMPONENTS - core - linker - ) - -set(LinkerSources - LinkModulesTest.cpp - ) - -add_llvm_unittest(LinkerTests - ${LinkerSources} - ) diff --git a/unittests/Linker/LinkModulesTest.cpp b/unittests/Linker/LinkModulesTest.cpp deleted file mode 100644 index 9d2d84d193..0000000000 --- a/unittests/Linker/LinkModulesTest.cpp +++ /dev/null @@ -1,131 +0,0 @@ -//===- llvm/unittest/Linker/LinkModulesTest.cpp - IRBuilder tests ---------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Linker.h" -#include "llvm/IR/IRBuilder.h" -#include "llvm/IR/BasicBlock.h" -#include "llvm/IR/DataLayout.h" -#include "llvm/IR/Function.h" -#include "llvm/IR/Module.h" -#include "gtest/gtest.h" - -using namespace llvm; - -namespace { - -class LinkModuleTest : public testing::Test { -protected: - virtual void SetUp() { - LLVMContext &Ctx = getGlobalContext(); - M.reset(new Module("MyModule", Ctx)); - FunctionType *FTy = FunctionType::get(Type::getInt8PtrTy(Ctx), - Type::getInt32Ty(Ctx), - false /*=isVarArg*/); - F = Function::Create(FTy, Function::ExternalLinkage, "ba_func", M.get()); - F->setCallingConv(CallingConv::C); - - EntryBB = BasicBlock::Create(Ctx, "entry", F); - SwitchCase1BB = BasicBlock::Create(Ctx, "switch.case.1", F); - SwitchCase2BB = BasicBlock::Create(Ctx, "switch.case.2", F); - ExitBB = BasicBlock::Create(Ctx, "exit", F); - - ArrayType *AT = ArrayType::get(Type::getInt8PtrTy(Ctx), 3); - - GV = new GlobalVariable(*M.get(), AT, false /*=isConstant*/, - GlobalValue::InternalLinkage, - 0, "switch.bas"); - - - // Global Initializer - std::vector Init; - Constant *SwitchCase1BA = BlockAddress::get(SwitchCase1BB); - Init.push_back(SwitchCase1BA); - - Constant *SwitchCase2BA = BlockAddress::get(SwitchCase2BB); - Init.push_back(SwitchCase2BA); - - ConstantInt *One = ConstantInt::get(Type::getInt32Ty(Ctx), 1); - Constant *OnePtr = ConstantExpr::getCast(Instruction::IntToPtr, - One, Type::getInt8PtrTy(Ctx)); - Init.push_back(OnePtr); - - GV->setInitializer(ConstantArray::get(AT, Init)); - } - - virtual void TearDown() { - M.reset(); - } - - OwningPtr M; - Function *F; - GlobalVariable *GV; - BasicBlock *EntryBB; - BasicBlock *SwitchCase1BB; - BasicBlock *SwitchCase2BB; - BasicBlock *ExitBB; -}; - -TEST_F(LinkModuleTest, BlockAddress) { - LLVMContext &Ctx = getGlobalContext(); - IRBuilder<> Builder(EntryBB); - - std::vector GEPIndices; - GEPIndices.push_back(ConstantInt::get(Type::getInt32Ty(Ctx), 0)); - GEPIndices.push_back(F->arg_begin()); - - Value *GEP = Builder.CreateGEP(GV, GEPIndices, "switch.gep"); - Value *Load = Builder.CreateLoad(GEP, "switch.load"); - - Builder.CreateRet(Load); - - Builder.SetInsertPoint(SwitchCase1BB); - Builder.CreateBr(ExitBB); - - Builder.SetInsertPoint(SwitchCase2BB); - Builder.CreateBr(ExitBB); - - Builder.SetInsertPoint(ExitBB); - Builder.CreateRet(ConstantPointerNull::get(Type::getInt8PtrTy(Ctx))); - - Module *LinkedModule = new Module("MyModuleLinked", getGlobalContext()); - Linker::LinkModules(LinkedModule, M.get(), Linker::PreserveSource, 0); - - // Delete the original module. - M.reset(); - - // Check that the global "@switch.bas" is well-formed. - const GlobalVariable *LinkedGV = LinkedModule->getNamedGlobal("switch.bas"); - const Constant *Init = LinkedGV->getInitializer(); - - // @switch.bas = internal global [3 x i8*] - // [i8* blockaddress(@ba_func, %switch.case.1), - // i8* blockaddress(@ba_func, %switch.case.2), - // i8* inttoptr (i32 1 to i8*)] - - ArrayType *AT = ArrayType::get(Type::getInt8PtrTy(Ctx), 3); - EXPECT_EQ(AT, Init->getType()); - - Value *Elem = Init->getOperand(0); - ASSERT_TRUE(isa(Elem)); - EXPECT_EQ(cast(Elem)->getFunction(), - LinkedModule->getFunction("ba_func")); - EXPECT_EQ(cast(Elem)->getBasicBlock()->getParent(), - LinkedModule->getFunction("ba_func")); - - Elem = Init->getOperand(1); - ASSERT_TRUE(isa(Elem)); - EXPECT_EQ(cast(Elem)->getFunction(), - LinkedModule->getFunction("ba_func")); - EXPECT_EQ(cast(Elem)->getBasicBlock()->getParent(), - LinkedModule->getFunction("ba_func")); - - delete LinkedModule; -} - -} // end anonymous namespace diff --git a/unittests/Linker/Makefile b/unittests/Linker/Makefile deleted file mode 100644 index c6058c4d60..0000000000 --- a/unittests/Linker/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -##===- unittests/Linker/Makefile ---------------------------*- Makefile -*-===## -# -# The LLVM Compiler Infrastructure -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -##===----------------------------------------------------------------------===## - -LEVEL = ../.. -TESTNAME = Linker -LINK_COMPONENTS := core linker - -include $(LEVEL)/Makefile.config -include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest diff --git a/unittests/Makefile b/unittests/Makefile index fc7e780df3..06ba93243e 100644 --- a/unittests/Makefile +++ b/unittests/Makefile @@ -10,7 +10,7 @@ LEVEL = .. PARALLEL_DIRS = ADT Analysis Bitcode CodeGen DebugInfo ExecutionEngine IR \ - Linker MC Object Option Support Transforms + MC Object Option Support Transforms include $(LEVEL)/Makefile.common -- cgit v1.2.3