aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/CloneModule.cpp
diff options
context:
space:
mode:
authorArthur Eubanks <aeubanks@google.com>2021-11-12 15:48:31 -0800
committerArthur Eubanks <aeubanks@google.com>2021-12-01 15:40:05 -0800
commit512534bc16d2bebb0fb02e92a5ebd35eff9fb220 (patch)
treecac7aeab898a1f264bfd8ff7bd00d40f6e3b87ff /llvm/lib/Transforms/Utils/CloneModule.cpp
parent1b7150c8f89a917094ddc8fe7a6304ae3464e8c4 (diff)
downloadllvm-512534bc16d2bebb0fb02e92a5ebd35eff9fb220.zip
llvm-512534bc16d2bebb0fb02e92a5ebd35eff9fb220.tar.gz
llvm-512534bc16d2bebb0fb02e92a5ebd35eff9fb220.tar.bz2
[Cloning] Clone metadata on function declarations
Previously we missed cloning metadata on function declarations because we don't call CloneFunctionInto() on declarations in CloneModule(). Reviewed By: dexonsmith Differential Revision: https://reviews.llvm.org/D113812
Diffstat (limited to 'llvm/lib/Transforms/Utils/CloneModule.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/CloneModule.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/CloneModule.cpp b/llvm/lib/Transforms/Utils/CloneModule.cpp
index 200deca..57c273a 100644
--- a/llvm/lib/Transforms/Utils/CloneModule.cpp
+++ b/llvm/lib/Transforms/Utils/CloneModule.cpp
@@ -135,10 +135,18 @@ std::unique_ptr<Module> llvm::CloneModule(
// Similarly, copy over function bodies now...
//
for (const Function &I : M) {
- if (I.isDeclaration())
+ Function *F = cast<Function>(VMap[&I]);
+
+ if (I.isDeclaration()) {
+ // Copy over metadata for declarations since we're not doing it below in
+ // CloneFunctionInto().
+ SmallVector<std::pair<unsigned, MDNode *>, 1> MDs;
+ I.getAllMetadata(MDs);
+ for (auto MD : MDs)
+ F->addMetadata(MD.first, *MapMetadata(MD.second, VMap));
continue;
+ }
- Function *F = cast<Function>(VMap[&I]);
if (!ShouldCloneDefinition(&I)) {
// Skip after setting the correct linkage for an external reference.
F->setLinkage(GlobalValue::ExternalLinkage);