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/TypeSymbolTable.h"
19 #include "llvm/Constant.h"
20 #include "llvm/Transforms/Utils/ValueMapper.h"
23 /// CloneModule - Return an exact copy of the specified module. This is not as
24 /// easy as it might seem because we have to worry about making copies of global
25 /// variables and functions, and making their (initializers and references,
26 /// respectively) refer to the right globals.
28 Module
*llvm::CloneModule(const Module
*M
) {
29 // Create the value map that maps things from the old module over to the new
31 DenseMap
<const Value
*, Value
*> ValueMap
;
32 return CloneModule(M
, ValueMap
);
35 Module
*llvm::CloneModule(const Module
*M
,
36 DenseMap
<const Value
*, Value
*> &ValueMap
) {
37 // First off, we need to create the new module...
38 Module
*New
= new Module(M
->getModuleIdentifier(), M
->getContext());
39 New
->setDataLayout(M
->getDataLayout());
40 New
->setTargetTriple(M
->getTargetTriple());
41 New
->setModuleInlineAsm(M
->getModuleInlineAsm());
43 // Copy all of the type symbol table entries over.
44 const TypeSymbolTable
&TST
= M
->getTypeSymbolTable();
45 for (TypeSymbolTable::const_iterator TI
= TST
.begin(), TE
= TST
.end();
47 New
->addTypeName(TI
->first
, TI
->second
);
49 // Copy all of the dependent libraries over.
50 for (Module::lib_iterator I
= M
->lib_begin(), E
= M
->lib_end(); I
!= E
; ++I
)
53 // Loop over all of the global variables, making corresponding globals in the
54 // new module. Here we add them to the ValueMap and to the new Module. We
55 // don't worry about attributes or initializers, they will come later.
57 for (Module::const_global_iterator I
= M
->global_begin(), E
= M
->global_end();
59 GlobalVariable
*GV
= new GlobalVariable(*New
,
60 I
->getType()->getElementType(),
62 GlobalValue::ExternalLinkage
, 0,
64 GV
->setAlignment(I
->getAlignment());
68 // Loop over the functions in the module, making external functions as before
69 for (Module::const_iterator I
= M
->begin(), E
= M
->end(); I
!= E
; ++I
) {
71 Function::Create(cast
<FunctionType
>(I
->getType()->getElementType()),
72 GlobalValue::ExternalLinkage
, I
->getName(), New
);
73 NF
->copyAttributesFrom(I
);
77 // Loop over the aliases in the module
78 for (Module::const_alias_iterator I
= M
->alias_begin(), E
= M
->alias_end();
80 ValueMap
[I
] = new GlobalAlias(I
->getType(), GlobalAlias::ExternalLinkage
,
81 I
->getName(), NULL
, New
);
83 // Now that all of the things that global variable initializer can refer to
84 // have been created, loop through and copy the global variable referrers
85 // over... We also set the attributes on the global now.
87 for (Module::const_global_iterator I
= M
->global_begin(), E
= M
->global_end();
89 GlobalVariable
*GV
= cast
<GlobalVariable
>(ValueMap
[I
]);
90 if (I
->hasInitializer())
91 GV
->setInitializer(cast
<Constant
>(MapValue(I
->getInitializer(),
94 GV
->setLinkage(I
->getLinkage());
95 GV
->setThreadLocal(I
->isThreadLocal());
96 GV
->setConstant(I
->isConstant());
99 // Similarly, copy over function bodies now...
101 for (Module::const_iterator I
= M
->begin(), E
= M
->end(); I
!= E
; ++I
) {
102 Function
*F
= cast
<Function
>(ValueMap
[I
]);
103 if (!I
->isDeclaration()) {
104 Function::arg_iterator DestI
= F
->arg_begin();
105 for (Function::const_arg_iterator J
= I
->arg_begin(); J
!= I
->arg_end();
107 DestI
->setName(J
->getName());
108 ValueMap
[J
] = DestI
++;
111 SmallVector
<ReturnInst
*, 8> Returns
; // Ignore returns cloned.
112 CloneFunctionInto(F
, I
, ValueMap
, Returns
);
115 F
->setLinkage(I
->getLinkage());
119 for (Module::const_alias_iterator I
= M
->alias_begin(), E
= M
->alias_end();
121 GlobalAlias
*GA
= cast
<GlobalAlias
>(ValueMap
[I
]);
122 GA
->setLinkage(I
->getLinkage());
123 if (const Constant
* C
= I
->getAliasee())
124 GA
->setAliasee(cast
<Constant
>(MapValue(C
, ValueMap
, M
->getContext())));