From 446d7cc0db2518fd409fea755d53ec4865e86b7d Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Wed, 26 Oct 2016 02:57:33 +0000 Subject: [PATCH] Cloning: Also clone global variable attached metadata. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285161 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/CloneModule.cpp | 5 +++++ unittests/Transforms/Utils/Cloning.cpp | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/lib/Transforms/Utils/CloneModule.cpp b/lib/Transforms/Utils/CloneModule.cpp index 17e34c4ffa0..7ebeb615d24 100644 --- a/lib/Transforms/Utils/CloneModule.cpp +++ b/lib/Transforms/Utils/CloneModule.cpp @@ -119,6 +119,11 @@ std::unique_ptr llvm::CloneModule( } if (I->hasInitializer()) GV->setInitializer(MapValue(I->getInitializer(), VMap)); + + SmallVector, 1> MDs; + I->getAllMetadata(MDs); + for (auto MD : MDs) + GV->addMetadata(MD.first, *MapMetadata(MD.second, VMap)); } // Similarly, copy over function bodies now... diff --git a/unittests/Transforms/Utils/Cloning.cpp b/unittests/Transforms/Utils/Cloning.cpp index 032dfa162a2..afb5452faeb 100644 --- a/unittests/Transforms/Utils/Cloning.cpp +++ b/unittests/Transforms/Utils/Cloning.cpp @@ -403,6 +403,11 @@ protected: void SetupModule() { OldM = new Module("", C); } void CreateOldModule() { + auto GV = new GlobalVariable( + *OldM, Type::getInt32Ty(C), false, GlobalValue::ExternalLinkage, + ConstantInt::get(Type::getInt32Ty(C), 1), "gv"); + GV->addMetadata(LLVMContext::MD_type, *MDNode::get(C, {})); + DIBuilder DBuilder(*OldM); IRBuilder<> IBuilder(C); @@ -459,4 +464,9 @@ TEST_F(CloneModule, Subprogram) { EXPECT_EQ(SP->getFile()->getFilename(), "filename.c"); EXPECT_EQ(SP->getLine(), (unsigned)4); } + +TEST_F(CloneModule, GlobalMetadata) { + GlobalVariable *NewGV = NewM->getGlobalVariable("gv"); + EXPECT_NE(nullptr, NewGV->getMetadata(LLVMContext::MD_type)); +} } -- 2.11.0