aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/CloneModule.cpp
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2017-01-18 20:02:31 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2017-01-18 20:02:31 +0000
commit10e3b12c7a41e05bc5611acb02e44d3c2c9e098a (patch)
tree78640c8623cf6e12859f9c3a1009638f78220c79 /llvm/lib/Transforms/Utils/CloneModule.cpp
parent44a87c9f1b330d243eae87c60151711c5b0b486a (diff)
downloadllvm-10e3b12c7a41e05bc5611acb02e44d3c2c9e098a.zip
llvm-10e3b12c7a41e05bc5611acb02e44d3c2c9e098a.tar.gz
llvm-10e3b12c7a41e05bc5611acb02e44d3c2c9e098a.tar.bz2
Cloning: Copy comdats when cloning globals.
Differential Revision: https://reviews.llvm.org/D28838 llvm-svn: 292430
Diffstat (limited to 'llvm/lib/Transforms/Utils/CloneModule.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/CloneModule.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/CloneModule.cpp b/llvm/lib/Transforms/Utils/CloneModule.cpp
index 7ebeb61..4e9d672 100644
--- a/llvm/lib/Transforms/Utils/CloneModule.cpp
+++ b/llvm/lib/Transforms/Utils/CloneModule.cpp
@@ -20,6 +20,15 @@
#include "llvm-c/Core.h"
using namespace llvm;
+static void copyComdat(GlobalObject *Dst, const GlobalObject *Src) {
+ const Comdat *SC = Src->getComdat();
+ if (!SC)
+ return;
+ Comdat *DC = Dst->getParent()->getOrInsertComdat(SC->getName());
+ DC->setSelectionKind(SC->getSelectionKind());
+ Dst->setComdat(DC);
+}
+
/// This is not as easy as it might seem because we have to worry about making
/// copies of global variables and functions, and making their (initializers and
/// references, respectively) refer to the right globals.
@@ -124,6 +133,8 @@ std::unique_ptr<Module> llvm::CloneModule(
I->getAllMetadata(MDs);
for (auto MD : MDs)
GV->addMetadata(MD.first, *MapMetadata(MD.second, VMap));
+
+ copyComdat(GV, &*I);
}
// Similarly, copy over function bodies now...
@@ -153,6 +164,8 @@ std::unique_ptr<Module> llvm::CloneModule(
if (I.hasPersonalityFn())
F->setPersonalityFn(MapValue(I.getPersonalityFn(), VMap));
+
+ copyComdat(F, &I);
}
// And aliases