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/Constant.h"
15 #include "llvm/IR/DerivedTypes.h"
16 #include "llvm/IR/Module.h"
17 #include "llvm/Transforms/Utils/Cloning.h"
18 #include "llvm/Transforms/Utils/ValueMapper.h"
21 static void copyComdat(GlobalObject
*Dst
, const GlobalObject
*Src
) {
22 const Comdat
*SC
= Src
->getComdat();
25 Comdat
*DC
= Dst
->getParent()->getOrInsertComdat(SC
->getName());
26 DC
->setSelectionKind(SC
->getSelectionKind());
30 /// This is not as easy as it might seem because we have to worry about making
31 /// copies of global variables and functions, and making their (initializers and
32 /// references, respectively) refer to the right globals.
34 std::unique_ptr
<Module
> llvm::CloneModule(const Module
&M
) {
35 // Create the value map that maps things from the old module over to the new
37 ValueToValueMapTy VMap
;
38 return CloneModule(M
, VMap
);
41 std::unique_ptr
<Module
> llvm::CloneModule(const Module
&M
,
42 ValueToValueMapTy
&VMap
) {
43 return CloneModule(M
, VMap
, [](const GlobalValue
*GV
) { return true; });
46 std::unique_ptr
<Module
> llvm::CloneModule(
47 const Module
&M
, ValueToValueMapTy
&VMap
,
48 function_ref
<bool(const GlobalValue
*)> ShouldCloneDefinition
) {
49 // First off, we need to create the new module.
50 std::unique_ptr
<Module
> New
=
51 std::make_unique
<Module
>(M
.getModuleIdentifier(), M
.getContext());
52 New
->setSourceFileName(M
.getSourceFileName());
53 New
->setDataLayout(M
.getDataLayout());
54 New
->setTargetTriple(M
.getTargetTriple());
55 New
->setModuleInlineAsm(M
.getModuleInlineAsm());
57 // Loop over all of the global variables, making corresponding globals in the
58 // new module. Here we add them to the VMap and to the new Module. We
59 // don't worry about attributes or initializers, they will come later.
61 for (Module::const_global_iterator I
= M
.global_begin(), E
= M
.global_end();
63 GlobalVariable
*GV
= new GlobalVariable(*New
,
65 I
->isConstant(), I
->getLinkage(),
66 (Constant
*) nullptr, I
->getName(),
67 (GlobalVariable
*) nullptr,
68 I
->getThreadLocalMode(),
69 I
->getType()->getAddressSpace());
70 GV
->copyAttributesFrom(&*I
);
74 // Loop over the functions in the module, making external functions as before
75 for (const Function
&I
: M
) {
77 Function::Create(cast
<FunctionType
>(I
.getValueType()), I
.getLinkage(),
78 I
.getAddressSpace(), I
.getName(), New
.get());
79 NF
->copyAttributesFrom(&I
);
83 // Loop over the aliases in the module
84 for (Module::const_alias_iterator I
= M
.alias_begin(), E
= M
.alias_end();
86 if (!ShouldCloneDefinition(&*I
)) {
87 // An alias cannot act as an external reference, so we need to create
88 // either a function or a global variable depending on the value type.
89 // FIXME: Once pointee types are gone we can probably pick one or the
92 if (I
->getValueType()->isFunctionTy())
93 GV
= Function::Create(cast
<FunctionType
>(I
->getValueType()),
94 GlobalValue::ExternalLinkage
,
95 I
->getAddressSpace(), I
->getName(), New
.get());
97 GV
= new GlobalVariable(
98 *New
, I
->getValueType(), false, GlobalValue::ExternalLinkage
,
99 nullptr, I
->getName(), nullptr,
100 I
->getThreadLocalMode(), I
->getType()->getAddressSpace());
102 // We do not copy attributes (mainly because copying between different
103 // kinds of globals is forbidden), but this is generally not required for
107 auto *GA
= GlobalAlias::create(I
->getValueType(),
108 I
->getType()->getPointerAddressSpace(),
109 I
->getLinkage(), I
->getName(), New
.get());
110 GA
->copyAttributesFrom(&*I
);
114 // Now that all of the things that global variable initializer can refer to
115 // have been created, loop through and copy the global variable referrers
116 // over... We also set the attributes on the global now.
118 for (Module::const_global_iterator I
= M
.global_begin(), E
= M
.global_end();
120 if (I
->isDeclaration())
123 GlobalVariable
*GV
= cast
<GlobalVariable
>(VMap
[&*I
]);
124 if (!ShouldCloneDefinition(&*I
)) {
125 // Skip after setting the correct linkage for an external reference.
126 GV
->setLinkage(GlobalValue::ExternalLinkage
);
129 if (I
->hasInitializer())
130 GV
->setInitializer(MapValue(I
->getInitializer(), VMap
));
132 SmallVector
<std::pair
<unsigned, MDNode
*>, 1> MDs
;
133 I
->getAllMetadata(MDs
);
135 GV
->addMetadata(MD
.first
,
136 *MapMetadata(MD
.second
, VMap
, RF_MoveDistinctMDs
));
141 // Similarly, copy over function bodies now...
143 for (const Function
&I
: M
) {
144 if (I
.isDeclaration())
147 Function
*F
= cast
<Function
>(VMap
[&I
]);
148 if (!ShouldCloneDefinition(&I
)) {
149 // Skip after setting the correct linkage for an external reference.
150 F
->setLinkage(GlobalValue::ExternalLinkage
);
151 // Personality function is not valid on a declaration.
152 F
->setPersonalityFn(nullptr);
156 Function::arg_iterator DestI
= F
->arg_begin();
157 for (Function::const_arg_iterator J
= I
.arg_begin(); J
!= I
.arg_end();
159 DestI
->setName(J
->getName());
160 VMap
[&*J
] = &*DestI
++;
163 SmallVector
<ReturnInst
*, 8> Returns
; // Ignore returns cloned.
164 CloneFunctionInto(F
, &I
, VMap
, /*ModuleLevelChanges=*/true, Returns
);
166 if (I
.hasPersonalityFn())
167 F
->setPersonalityFn(MapValue(I
.getPersonalityFn(), VMap
));
173 for (Module::const_alias_iterator I
= M
.alias_begin(), E
= M
.alias_end();
175 // We already dealt with undefined aliases above.
176 if (!ShouldCloneDefinition(&*I
))
178 GlobalAlias
*GA
= cast
<GlobalAlias
>(VMap
[&*I
]);
179 if (const Constant
*C
= I
->getAliasee())
180 GA
->setAliasee(MapValue(C
, VMap
));
183 // And named metadata....
184 for (Module::const_named_metadata_iterator I
= M
.named_metadata_begin(),
185 E
= M
.named_metadata_end();
187 const NamedMDNode
&NMD
= *I
;
188 NamedMDNode
*NewNMD
= New
->getOrInsertNamedMetadata(NMD
.getName());
189 for (unsigned i
= 0, e
= NMD
.getNumOperands(); i
!= e
; ++i
)
190 NewNMD
->addOperand(MapMetadata(NMD
.getOperand(i
), VMap
));
198 LLVMModuleRef
LLVMCloneModule(LLVMModuleRef M
) {
199 return wrap(CloneModule(*unwrap(M
)).release());