diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2017-01-18 20:02:31 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2017-01-18 20:02:31 +0000 |
commit | 10e3b12c7a41e05bc5611acb02e44d3c2c9e098a (patch) | |
tree | 78640c8623cf6e12859f9c3a1009638f78220c79 /llvm/lib/Transforms/Utils/CloneModule.cpp | |
parent | 44a87c9f1b330d243eae87c60151711c5b0b486a (diff) | |
download | llvm-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.cpp | 13 |
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 |