1f22ef01cSRoman Divacky //===- CloneModule.cpp - Clone an entire module ---------------------------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // This file implements the CloneModule interface which makes a copy of an
11f22ef01cSRoman Divacky // entire module.
12f22ef01cSRoman Divacky //
13f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
14f22ef01cSRoman Divacky
15139f7f9bSDimitry Andric #include "llvm/IR/Constant.h"
16139f7f9bSDimitry Andric #include "llvm/IR/DerivedTypes.h"
17139f7f9bSDimitry Andric #include "llvm/IR/Module.h"
18db17bf38SDimitry Andric #include "llvm/Transforms/Utils/Cloning.h"
19e580952dSDimitry Andric #include "llvm/Transforms/Utils/ValueMapper.h"
20f22ef01cSRoman Divacky using namespace llvm;
21f22ef01cSRoman Divacky
copyComdat(GlobalObject * Dst,const GlobalObject * Src)227a7e6055SDimitry Andric static void copyComdat(GlobalObject *Dst, const GlobalObject *Src) {
237a7e6055SDimitry Andric const Comdat *SC = Src->getComdat();
247a7e6055SDimitry Andric if (!SC)
257a7e6055SDimitry Andric return;
267a7e6055SDimitry Andric Comdat *DC = Dst->getParent()->getOrInsertComdat(SC->getName());
277a7e6055SDimitry Andric DC->setSelectionKind(SC->getSelectionKind());
287a7e6055SDimitry Andric Dst->setComdat(DC);
297a7e6055SDimitry Andric }
307a7e6055SDimitry Andric
317d523365SDimitry Andric /// This is not as easy as it might seem because we have to worry about making
327d523365SDimitry Andric /// copies of global variables and functions, and making their (initializers and
337d523365SDimitry Andric /// references, respectively) refer to the right globals.
34f22ef01cSRoman Divacky ///
CloneModule(const Module & M)354ba319b5SDimitry Andric std::unique_ptr<Module> llvm::CloneModule(const Module &M) {
36f22ef01cSRoman Divacky // Create the value map that maps things from the old module over to the new
37f22ef01cSRoman Divacky // module.
38ffd1746dSEd Schouten ValueToValueMapTy VMap;
39ffd1746dSEd Schouten return CloneModule(M, VMap);
40f22ef01cSRoman Divacky }
41f22ef01cSRoman Divacky
CloneModule(const Module & M,ValueToValueMapTy & VMap)424ba319b5SDimitry Andric std::unique_ptr<Module> llvm::CloneModule(const Module &M,
437d523365SDimitry Andric ValueToValueMapTy &VMap) {
447d523365SDimitry Andric return CloneModule(M, VMap, [](const GlobalValue *GV) { return true; });
457d523365SDimitry Andric }
467d523365SDimitry Andric
CloneModule(const Module & M,ValueToValueMapTy & VMap,function_ref<bool (const GlobalValue *)> ShouldCloneDefinition)477d523365SDimitry Andric std::unique_ptr<Module> llvm::CloneModule(
484ba319b5SDimitry Andric const Module &M, ValueToValueMapTy &VMap,
493ca95b02SDimitry Andric function_ref<bool(const GlobalValue *)> ShouldCloneDefinition) {
5017a519f9SDimitry Andric // First off, we need to create the new module.
517d523365SDimitry Andric std::unique_ptr<Module> New =
524ba319b5SDimitry Andric llvm::make_unique<Module>(M.getModuleIdentifier(), M.getContext());
534ba319b5SDimitry Andric New->setSourceFileName(M.getSourceFileName());
544ba319b5SDimitry Andric New->setDataLayout(M.getDataLayout());
554ba319b5SDimitry Andric New->setTargetTriple(M.getTargetTriple());
564ba319b5SDimitry Andric New->setModuleInlineAsm(M.getModuleInlineAsm());
57f22ef01cSRoman Divacky
58f22ef01cSRoman Divacky // Loop over all of the global variables, making corresponding globals in the
59ffd1746dSEd Schouten // new module. Here we add them to the VMap and to the new Module. We
60f22ef01cSRoman Divacky // don't worry about attributes or initializers, they will come later.
61f22ef01cSRoman Divacky //
624ba319b5SDimitry Andric for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
63f22ef01cSRoman Divacky I != E; ++I) {
64f22ef01cSRoman Divacky GlobalVariable *GV = new GlobalVariable(*New,
653ca95b02SDimitry Andric I->getValueType(),
666122f3e6SDimitry Andric I->isConstant(), I->getLinkage(),
6791bc56edSDimitry Andric (Constant*) nullptr, I->getName(),
6891bc56edSDimitry Andric (GlobalVariable*) nullptr,
697ae0e2c9SDimitry Andric I->getThreadLocalMode(),
706122f3e6SDimitry Andric I->getType()->getAddressSpace());
717d523365SDimitry Andric GV->copyAttributesFrom(&*I);
727d523365SDimitry Andric VMap[&*I] = GV;
73f22ef01cSRoman Divacky }
74f22ef01cSRoman Divacky
75f22ef01cSRoman Divacky // Loop over the functions in the module, making external functions as before
764ba319b5SDimitry Andric for (const Function &I : M) {
77*b5893f02SDimitry Andric Function *NF =
78*b5893f02SDimitry Andric Function::Create(cast<FunctionType>(I.getValueType()), I.getLinkage(),
79*b5893f02SDimitry Andric I.getAddressSpace(), I.getName(), New.get());
803ca95b02SDimitry Andric NF->copyAttributesFrom(&I);
813ca95b02SDimitry Andric VMap[&I] = NF;
82f22ef01cSRoman Divacky }
83f22ef01cSRoman Divacky
84f22ef01cSRoman Divacky // Loop over the aliases in the module
854ba319b5SDimitry Andric for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end();
866122f3e6SDimitry Andric I != E; ++I) {
877d523365SDimitry Andric if (!ShouldCloneDefinition(&*I)) {
887d523365SDimitry Andric // An alias cannot act as an external reference, so we need to create
897d523365SDimitry Andric // either a function or a global variable depending on the value type.
907d523365SDimitry Andric // FIXME: Once pointee types are gone we can probably pick one or the
917d523365SDimitry Andric // other.
927d523365SDimitry Andric GlobalValue *GV;
937d523365SDimitry Andric if (I->getValueType()->isFunctionTy())
947d523365SDimitry Andric GV = Function::Create(cast<FunctionType>(I->getValueType()),
95*b5893f02SDimitry Andric GlobalValue::ExternalLinkage,
96*b5893f02SDimitry Andric I->getAddressSpace(), I->getName(), New.get());
977d523365SDimitry Andric else
987d523365SDimitry Andric GV = new GlobalVariable(
997d523365SDimitry Andric *New, I->getValueType(), false, GlobalValue::ExternalLinkage,
1005517e702SDimitry Andric nullptr, I->getName(), nullptr,
1017d523365SDimitry Andric I->getThreadLocalMode(), I->getType()->getAddressSpace());
1027d523365SDimitry Andric VMap[&*I] = GV;
1037d523365SDimitry Andric // We do not copy attributes (mainly because copying between different
1047d523365SDimitry Andric // kinds of globals is forbidden), but this is generally not required for
1057d523365SDimitry Andric // correctness.
1067d523365SDimitry Andric continue;
1077d523365SDimitry Andric }
1087d523365SDimitry Andric auto *GA = GlobalAlias::create(I->getValueType(),
1097d523365SDimitry Andric I->getType()->getPointerAddressSpace(),
1107d523365SDimitry Andric I->getLinkage(), I->getName(), New.get());
1117d523365SDimitry Andric GA->copyAttributesFrom(&*I);
1127d523365SDimitry Andric VMap[&*I] = GA;
1136122f3e6SDimitry Andric }
114f22ef01cSRoman Divacky
115f22ef01cSRoman Divacky // Now that all of the things that global variable initializer can refer to
116f22ef01cSRoman Divacky // have been created, loop through and copy the global variable referrers
117f22ef01cSRoman Divacky // over... We also set the attributes on the global now.
118f22ef01cSRoman Divacky //
1194ba319b5SDimitry Andric for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
120f22ef01cSRoman Divacky I != E; ++I) {
1213ca95b02SDimitry Andric if (I->isDeclaration())
1223ca95b02SDimitry Andric continue;
1233ca95b02SDimitry Andric
1247d523365SDimitry Andric GlobalVariable *GV = cast<GlobalVariable>(VMap[&*I]);
1257d523365SDimitry Andric if (!ShouldCloneDefinition(&*I)) {
1267d523365SDimitry Andric // Skip after setting the correct linkage for an external reference.
1277d523365SDimitry Andric GV->setLinkage(GlobalValue::ExternalLinkage);
1287d523365SDimitry Andric continue;
1297d523365SDimitry Andric }
130f22ef01cSRoman Divacky if (I->hasInitializer())
13117a519f9SDimitry Andric GV->setInitializer(MapValue(I->getInitializer(), VMap));
132d88c1a5aSDimitry Andric
133d88c1a5aSDimitry Andric SmallVector<std::pair<unsigned, MDNode *>, 1> MDs;
134d88c1a5aSDimitry Andric I->getAllMetadata(MDs);
135d88c1a5aSDimitry Andric for (auto MD : MDs)
1369dc417c3SDimitry Andric GV->addMetadata(MD.first,
1379dc417c3SDimitry Andric *MapMetadata(MD.second, VMap, RF_MoveDistinctMDs));
1387a7e6055SDimitry Andric
1397a7e6055SDimitry Andric copyComdat(GV, &*I);
140f22ef01cSRoman Divacky }
141f22ef01cSRoman Divacky
142f22ef01cSRoman Divacky // Similarly, copy over function bodies now...
143f22ef01cSRoman Divacky //
1444ba319b5SDimitry Andric for (const Function &I : M) {
1453ca95b02SDimitry Andric if (I.isDeclaration())
1463ca95b02SDimitry Andric continue;
1473ca95b02SDimitry Andric
1483ca95b02SDimitry Andric Function *F = cast<Function>(VMap[&I]);
1493ca95b02SDimitry Andric if (!ShouldCloneDefinition(&I)) {
1507d523365SDimitry Andric // Skip after setting the correct linkage for an external reference.
1517d523365SDimitry Andric F->setLinkage(GlobalValue::ExternalLinkage);
1523ca95b02SDimitry Andric // Personality function is not valid on a declaration.
1533ca95b02SDimitry Andric F->setPersonalityFn(nullptr);
1547d523365SDimitry Andric continue;
1557d523365SDimitry Andric }
1563ca95b02SDimitry Andric
157f22ef01cSRoman Divacky Function::arg_iterator DestI = F->arg_begin();
1583ca95b02SDimitry Andric for (Function::const_arg_iterator J = I.arg_begin(); J != I.arg_end();
159f22ef01cSRoman Divacky ++J) {
160f22ef01cSRoman Divacky DestI->setName(J->getName());
1617d523365SDimitry Andric VMap[&*J] = &*DestI++;
162f22ef01cSRoman Divacky }
163f22ef01cSRoman Divacky
164f22ef01cSRoman Divacky SmallVector<ReturnInst *, 8> Returns; // Ignore returns cloned.
1653ca95b02SDimitry Andric CloneFunctionInto(F, &I, VMap, /*ModuleLevelChanges=*/true, Returns);
1663dac3a9bSDimitry Andric
1673ca95b02SDimitry Andric if (I.hasPersonalityFn())
1683ca95b02SDimitry Andric F->setPersonalityFn(MapValue(I.getPersonalityFn(), VMap));
1697a7e6055SDimitry Andric
1707a7e6055SDimitry Andric copyComdat(F, &I);
171f22ef01cSRoman Divacky }
172f22ef01cSRoman Divacky
173f22ef01cSRoman Divacky // And aliases
1744ba319b5SDimitry Andric for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end();
175f22ef01cSRoman Divacky I != E; ++I) {
1767d523365SDimitry Andric // We already dealt with undefined aliases above.
1777d523365SDimitry Andric if (!ShouldCloneDefinition(&*I))
1787d523365SDimitry Andric continue;
1797d523365SDimitry Andric GlobalAlias *GA = cast<GlobalAlias>(VMap[&*I]);
180f22ef01cSRoman Divacky if (const Constant *C = I->getAliasee())
18139d628a0SDimitry Andric GA->setAliasee(MapValue(C, VMap));
182f22ef01cSRoman Divacky }
183f22ef01cSRoman Divacky
184ffd1746dSEd Schouten // And named metadata....
1854ba319b5SDimitry Andric for (Module::const_named_metadata_iterator I = M.named_metadata_begin(),
1864ba319b5SDimitry Andric E = M.named_metadata_end();
1874ba319b5SDimitry Andric I != E; ++I) {
188ffd1746dSEd Schouten const NamedMDNode &NMD = *I;
189e580952dSDimitry Andric NamedMDNode *NewNMD = New->getOrInsertNamedMetadata(NMD.getName());
190ffd1746dSEd Schouten for (unsigned i = 0, e = NMD.getNumOperands(); i != e; ++i)
19139d628a0SDimitry Andric NewNMD->addOperand(MapMetadata(NMD.getOperand(i), VMap));
192ffd1746dSEd Schouten }
193ffd1746dSEd Schouten
194f22ef01cSRoman Divacky return New;
195f22ef01cSRoman Divacky }
19639d628a0SDimitry Andric
19739d628a0SDimitry Andric extern "C" {
19839d628a0SDimitry Andric
LLVMCloneModule(LLVMModuleRef M)19939d628a0SDimitry Andric LLVMModuleRef LLVMCloneModule(LLVMModuleRef M) {
2004ba319b5SDimitry Andric return wrap(CloneModule(*unwrap(M)).release());
20139d628a0SDimitry Andric }
20239d628a0SDimitry Andric
20339d628a0SDimitry Andric }
204