1 //===- CloneModule.cpp - Clone an entire module ---------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements the CloneModule interface which makes a copy of an
12 //===----------------------------------------------------------------------===//
14 #include "llvm/IR/DerivedTypes.h"
15 #include "llvm/IR/Module.h"
16 #include "llvm/Transforms/Utils/Cloning.h"
17 #include "llvm/Transforms/Utils/ValueMapper.h"
24 static void copyComdat(GlobalObject
*Dst
, const GlobalObject
*Src
) {
25 const Comdat
*SC
= Src
->getComdat();
28 Comdat
*DC
= Dst
->getParent()->getOrInsertComdat(SC
->getName());
29 DC
->setSelectionKind(SC
->getSelectionKind());
33 /// This is not as easy as it might seem because we have to worry about making
34 /// copies of global variables and functions, and making their (initializers and
35 /// references, respectively) refer to the right globals.
37 /// Cloning un-materialized modules is not currently supported, so any
38 /// modules initialized via lazy loading should be materialized before cloning
39 std::unique_ptr
<Module
> llvm::CloneModule(const Module
&M
) {
40 // Create the value map that maps things from the old module over to the new
42 ValueToValueMapTy VMap
;
43 return CloneModule(M
, VMap
);
46 std::unique_ptr
<Module
> llvm::CloneModule(const Module
&M
,
47 ValueToValueMapTy
&VMap
) {
48 return CloneModule(M
, VMap
, [](const GlobalValue
*GV
) { return true; });
51 std::unique_ptr
<Module
> llvm::CloneModule(
52 const Module
&M
, ValueToValueMapTy
&VMap
,
53 function_ref
<bool(const GlobalValue
*)> ShouldCloneDefinition
) {
55 assert(M
.isMaterialized() && "Module must be materialized before cloning!");
57 // First off, we need to create the new module.
58 std::unique_ptr
<Module
> New
=
59 std::make_unique
<Module
>(M
.getModuleIdentifier(), M
.getContext());
60 New
->setSourceFileName(M
.getSourceFileName());
61 New
->setDataLayout(M
.getDataLayout());
62 New
->setTargetTriple(M
.getTargetTriple());
63 New
->setModuleInlineAsm(M
.getModuleInlineAsm());
64 New
->IsNewDbgInfoFormat
= M
.IsNewDbgInfoFormat
;
66 // Loop over all of the global variables, making corresponding globals in the
67 // new module. Here we add them to the VMap and to the new Module. We
68 // don't worry about attributes or initializers, they will come later.
70 for (const GlobalVariable
&I
: M
.globals()) {
71 GlobalVariable
*NewGV
= new GlobalVariable(
72 *New
, I
.getValueType(), I
.isConstant(), I
.getLinkage(),
73 (Constant
*)nullptr, I
.getName(), (GlobalVariable
*)nullptr,
74 I
.getThreadLocalMode(), I
.getType()->getAddressSpace());
75 NewGV
->copyAttributesFrom(&I
);
79 // Loop over the functions in the module, making external functions as before
80 for (const Function
&I
: M
) {
82 Function::Create(cast
<FunctionType
>(I
.getValueType()), I
.getLinkage(),
83 I
.getAddressSpace(), I
.getName(), New
.get());
84 NF
->copyAttributesFrom(&I
);
88 // Loop over the aliases in the module
89 for (const GlobalAlias
&I
: M
.aliases()) {
90 if (!ShouldCloneDefinition(&I
)) {
91 // An alias cannot act as an external reference, so we need to create
92 // either a function or a global variable depending on the value type.
93 // FIXME: Once pointee types are gone we can probably pick one or the
96 if (I
.getValueType()->isFunctionTy())
97 GV
= Function::Create(cast
<FunctionType
>(I
.getValueType()),
98 GlobalValue::ExternalLinkage
, I
.getAddressSpace(),
99 I
.getName(), New
.get());
101 GV
= new GlobalVariable(*New
, I
.getValueType(), false,
102 GlobalValue::ExternalLinkage
, nullptr,
103 I
.getName(), nullptr, I
.getThreadLocalMode(),
104 I
.getType()->getAddressSpace());
106 // We do not copy attributes (mainly because copying between different
107 // kinds of globals is forbidden), but this is generally not required for
111 auto *GA
= GlobalAlias::create(I
.getValueType(),
112 I
.getType()->getPointerAddressSpace(),
113 I
.getLinkage(), I
.getName(), New
.get());
114 GA
->copyAttributesFrom(&I
);
118 for (const GlobalIFunc
&I
: M
.ifuncs()) {
119 // Defer setting the resolver function until after functions are cloned.
121 GlobalIFunc::create(I
.getValueType(), I
.getAddressSpace(),
122 I
.getLinkage(), I
.getName(), nullptr, New
.get());
123 GI
->copyAttributesFrom(&I
);
127 // Now that all of the things that global variable initializer can refer to
128 // have been created, loop through and copy the global variable referrers
129 // over... We also set the attributes on the global now.
131 for (const GlobalVariable
&G
: M
.globals()) {
132 GlobalVariable
*GV
= cast
<GlobalVariable
>(VMap
[&G
]);
134 SmallVector
<std::pair
<unsigned, MDNode
*>, 1> MDs
;
135 G
.getAllMetadata(MDs
);
137 GV
->addMetadata(MD
.first
, *MapMetadata(MD
.second
, VMap
));
139 if (G
.isDeclaration())
142 if (!ShouldCloneDefinition(&G
)) {
143 // Skip after setting the correct linkage for an external reference.
144 GV
->setLinkage(GlobalValue::ExternalLinkage
);
147 if (G
.hasInitializer())
148 GV
->setInitializer(MapValue(G
.getInitializer(), VMap
));
153 // Similarly, copy over function bodies now...
155 for (const Function
&I
: M
) {
156 Function
*F
= cast
<Function
>(VMap
[&I
]);
158 if (I
.isDeclaration()) {
159 // Copy over metadata for declarations since we're not doing it below in
160 // CloneFunctionInto().
161 SmallVector
<std::pair
<unsigned, MDNode
*>, 1> MDs
;
162 I
.getAllMetadata(MDs
);
164 F
->addMetadata(MD
.first
, *MapMetadata(MD
.second
, VMap
));
168 if (!ShouldCloneDefinition(&I
)) {
169 // Skip after setting the correct linkage for an external reference.
170 F
->setLinkage(GlobalValue::ExternalLinkage
);
171 // Personality function is not valid on a declaration.
172 F
->setPersonalityFn(nullptr);
176 Function::arg_iterator DestI
= F
->arg_begin();
177 for (const Argument
&J
: I
.args()) {
178 DestI
->setName(J
.getName());
179 VMap
[&J
] = &*DestI
++;
182 SmallVector
<ReturnInst
*, 8> Returns
; // Ignore returns cloned.
183 CloneFunctionInto(F
, &I
, VMap
, CloneFunctionChangeType::ClonedModule
,
186 if (I
.hasPersonalityFn())
187 F
->setPersonalityFn(MapValue(I
.getPersonalityFn(), VMap
));
193 for (const GlobalAlias
&I
: M
.aliases()) {
194 // We already dealt with undefined aliases above.
195 if (!ShouldCloneDefinition(&I
))
197 GlobalAlias
*GA
= cast
<GlobalAlias
>(VMap
[&I
]);
198 if (const Constant
*C
= I
.getAliasee())
199 GA
->setAliasee(MapValue(C
, VMap
));
202 for (const GlobalIFunc
&I
: M
.ifuncs()) {
203 GlobalIFunc
*GI
= cast
<GlobalIFunc
>(VMap
[&I
]);
204 if (const Constant
*Resolver
= I
.getResolver())
205 GI
->setResolver(MapValue(Resolver
, VMap
));
208 // And named metadata....
209 for (const NamedMDNode
&NMD
: M
.named_metadata()) {
210 NamedMDNode
*NewNMD
= New
->getOrInsertNamedMetadata(NMD
.getName());
211 for (unsigned i
= 0, e
= NMD
.getNumOperands(); i
!= e
; ++i
)
212 NewNMD
->addOperand(MapMetadata(NMD
.getOperand(i
), VMap
));
220 LLVMModuleRef
LLVMCloneModule(LLVMModuleRef M
) {
221 return wrap(CloneModule(*unwrap(M
)).release());