From: Ruiling Song Date: Thu, 17 Dec 2020 00:03:20 +0000 (+0800) Subject: [Cloning] Copy metadata of global declarations X-Git-Tag: llvmorg-13-init~1770 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8dddcc762dd98d53b9406b36e92f62502834187c;p=platform%2Fupstream%2Fllvm.git [Cloning] Copy metadata of global declarations We have modules with metadata on declarations, and out-of-tree passes use that metadata, and we need to clone those modules. We really expect such metadata is kept during the clone operation. Reviewed by: arsenm, aprantl Differential Revision: https://reviews.llvm.org/D93451 --- diff --git a/llvm/lib/Transforms/Utils/CloneModule.cpp b/llvm/lib/Transforms/Utils/CloneModule.cpp index 2c8c3ab..a6327bb 100644 --- a/llvm/lib/Transforms/Utils/CloneModule.cpp +++ b/llvm/lib/Transforms/Utils/CloneModule.cpp @@ -117,10 +117,17 @@ std::unique_ptr llvm::CloneModule( // 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 @@ 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, RF_MoveDistinctMDs)); - copyComdat(GV, &*I); } diff --git a/llvm/test/Other/copy-metadata-of-declaration.ll b/llvm/test/Other/copy-metadata-of-declaration.ll new file mode 100644 index 0000000..aed8db7 --- /dev/null +++ b/llvm/test/Other/copy-metadata-of-declaration.ll @@ -0,0 +1,10 @@ +; RUN: opt -run-twice -verify -S -o - %s | FileCheck %s + +; This test is used to check metadata attached to global variable declarations +; are copied when CloneModule(). This is required by out-of-tree passes. + +; CHECK: @g = external addrspace(64) global i32, !spirv.InOut !0 + +@g = external addrspace(64) global i32, !spirv.InOut !0 + +!0 = !{i32 1}