diff --git a/llvm/lib/Transforms/Utils/CloneModule.cpp b/llvm/lib/Transforms/Utils/CloneModule.cpp --- a/llvm/lib/Transforms/Utils/CloneModule.cpp +++ b/llvm/lib/Transforms/Utils/CloneModule.cpp @@ -117,10 +117,17 @@ // for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) { + GlobalVariable *GV = cast(VMap[&*I]); + + SmallVector, 1> MDs; + I->getAllMetadata(MDs); + for (auto MD : MDs) + GV->addMetadata(MD.first, + *MapMetadata(MD.second, VMap, RF_MoveDistinctMDs)); + if (I->isDeclaration()) continue; - GlobalVariable *GV = cast(VMap[&*I]); if (!ShouldCloneDefinition(&*I)) { // Skip after setting the correct linkage for an external reference. GV->setLinkage(GlobalValue::ExternalLinkage); @@ -129,12 +136,6 @@ 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, RF_MoveDistinctMDs)); - copyComdat(GV, &*I); } diff --git a/llvm/unittests/Transforms/Utils/CloningTest.cpp b/llvm/unittests/Transforms/Utils/CloningTest.cpp --- a/llvm/unittests/Transforms/Utils/CloningTest.cpp +++ b/llvm/unittests/Transforms/Utils/CloningTest.cpp @@ -840,6 +840,11 @@ GV->addMetadata(LLVMContext::MD_type, *MDNode::get(C, {})); GV->setComdat(CD); + // global declare + auto GVD = new GlobalVariable(*OldM, Type::getInt32Ty(C), false, + GlobalValue::ExternalLinkage, nullptr, "gvd"); + GVD->addMetadata(LLVMContext::MD_type, *MDNode::get(C, {})); + DIBuilder DBuilder(*OldM); IRBuilder<> IBuilder(C); @@ -915,6 +920,9 @@ TEST_F(CloneModule, GlobalMetadata) { GlobalVariable *NewGV = NewM->getGlobalVariable("gv"); EXPECT_NE(nullptr, NewGV->getMetadata(LLVMContext::MD_type)); + // copy metadata for global declare + GlobalVariable *NewGVD = NewM->getGlobalVariable("gvd"); + EXPECT_NE(nullptr, NewGVD->getMetadata(LLVMContext::MD_type)); } TEST_F(CloneModule, GlobalDebugInfo) {