1 //===- CloneModule.cpp - Clone an entire module ---------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the CloneModule interface which makes a copy of an
13 //===----------------------------------------------------------------------===//
15 #include "llvm/Transforms/Utils/Cloning.h"
16 #include "llvm/Module.h"
17 #include "llvm/DerivedTypes.h"
18 #include "llvm/Constant.h"
19 #include "llvm/Transforms/Utils/ValueMapper.h"
22 /// CloneModule - Return an exact copy of the specified module. This is not as
23 /// easy as it might seem because we have to worry about making copies of global
24 /// variables and functions, and making their (initializers and references,
25 /// respectively) refer to the right globals.
27 Module
*llvm::CloneModule(const Module
*M
) {
28 // Create the value map that maps things from the old module over to the new
30 ValueToValueMapTy VMap
;
31 return CloneModule(M
, VMap
);
34 Module
*llvm::CloneModule(const Module
*M
, ValueToValueMapTy
&VMap
) {
35 // First off, we need to create the new module.
36 Module
*New
= new Module(M
->getModuleIdentifier(), M
->getContext());
37 New
->setDataLayout(M
->getDataLayout());
38 New
->setTargetTriple(M
->getTargetTriple());
39 New
->setModuleInlineAsm(M
->getModuleInlineAsm());
41 // Copy all of the dependent libraries over.
42 for (Module::lib_iterator I
= M
->lib_begin(), E
= M
->lib_end(); I
!= E
; ++I
)
45 // Loop over all of the global variables, making corresponding globals in the
46 // new module. Here we add them to the VMap and to the new Module. We
47 // don't worry about attributes or initializers, they will come later.
49 for (Module::const_global_iterator I
= M
->global_begin(), E
= M
->global_end();
51 GlobalVariable
*GV
= new GlobalVariable(*New
,
52 I
->getType()->getElementType(),
54 GlobalValue::ExternalLinkage
, 0,
56 GV
->setAlignment(I
->getAlignment());
60 // Loop over the functions in the module, making external functions as before
61 for (Module::const_iterator I
= M
->begin(), E
= M
->end(); I
!= E
; ++I
) {
63 Function::Create(cast
<FunctionType
>(I
->getType()->getElementType()),
64 GlobalValue::ExternalLinkage
, I
->getName(), New
);
65 NF
->copyAttributesFrom(I
);
69 // Loop over the aliases in the module
70 for (Module::const_alias_iterator I
= M
->alias_begin(), E
= M
->alias_end();
72 VMap
[I
] = new GlobalAlias(I
->getType(), GlobalAlias::ExternalLinkage
,
73 I
->getName(), NULL
, New
);
75 // Now that all of the things that global variable initializer can refer to
76 // have been created, loop through and copy the global variable referrers
77 // over... We also set the attributes on the global now.
79 for (Module::const_global_iterator I
= M
->global_begin(), E
= M
->global_end();
81 GlobalVariable
*GV
= cast
<GlobalVariable
>(VMap
[I
]);
82 if (I
->hasInitializer())
83 GV
->setInitializer(MapValue(I
->getInitializer(), VMap
));
84 GV
->setLinkage(I
->getLinkage());
85 GV
->setThreadLocal(I
->isThreadLocal());
86 GV
->setConstant(I
->isConstant());
89 // Similarly, copy over function bodies now...
91 for (Module::const_iterator I
= M
->begin(), E
= M
->end(); I
!= E
; ++I
) {
92 Function
*F
= cast
<Function
>(VMap
[I
]);
93 if (!I
->isDeclaration()) {
94 Function::arg_iterator DestI
= F
->arg_begin();
95 for (Function::const_arg_iterator J
= I
->arg_begin(); J
!= I
->arg_end();
97 DestI
->setName(J
->getName());
101 SmallVector
<ReturnInst
*, 8> Returns
; // Ignore returns cloned.
102 CloneFunctionInto(F
, I
, VMap
, /*ModuleLevelChanges=*/true, Returns
);
105 F
->setLinkage(I
->getLinkage());
109 for (Module::const_alias_iterator I
= M
->alias_begin(), E
= M
->alias_end();
111 GlobalAlias
*GA
= cast
<GlobalAlias
>(VMap
[I
]);
112 GA
->setLinkage(I
->getLinkage());
113 if (const Constant
*C
= I
->getAliasee())
114 GA
->setAliasee(MapValue(C
, VMap
));
117 // And named metadata....
118 for (Module::const_named_metadata_iterator I
= M
->named_metadata_begin(),
119 E
= M
->named_metadata_end(); I
!= E
; ++I
) {
120 const NamedMDNode
&NMD
= *I
;
121 NamedMDNode
*NewNMD
= New
->getOrInsertNamedMetadata(NMD
.getName());
122 for (unsigned i
= 0, e
= NMD
.getNumOperands(); i
!= e
; ++i
)
123 NewNMD
->addOperand(MapValue(NMD
.getOperand(i
), VMap
));