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