CloneModule.cpp revision 774cca70b10bc679daff8203d639d9004a2eb194
151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner//===- CloneModule.cpp - Clone an entire module ---------------------------===//
2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner//
1051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner// This file implements the CloneModule interface which makes a copy of an
1151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner// entire module.
1251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner//
1351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner//===----------------------------------------------------------------------===//
1451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner
1551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "llvm/Transforms/Utils/Cloning.h"
1651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "llvm/Module.h"
1751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "llvm/DerivedTypes.h"
1878d033e086e19e016273de014f9214aa6f3f844bReid Spencer#include "llvm/TypeSymbolTable.h"
1951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "llvm/Constant.h"
20cd9b49245115f13e2e190fedfdbbbfc19a49b78fDevang Patel#include "ValueMapper.h"
21f7703df4968084c18c248c1feea9961c19a32e6aChris Lattnerusing namespace llvm;
22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
2351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner/// CloneModule - Return an exact copy of the specified module.  This is not as
2451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner/// easy as it might seem because we have to worry about making copies of global
25cf00c4ab3ba308d45d98c5ccab87362cf802facbMisha Brukman/// variables and functions, and making their (initializers and references,
2651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner/// respectively) refer to the right globals.
2751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner///
28f7703df4968084c18c248c1feea9961c19a32e6aChris LattnerModule *llvm::CloneModule(const Module *M) {
29782e60150eb9370a60fa51ed49bd23036588756aChris Lattner  // Create the value map that maps things from the old module over to the new
30782e60150eb9370a60fa51ed49bd23036588756aChris Lattner  // module.
31774cca70b10bc679daff8203d639d9004a2eb194Devang Patel  ValueToValueMapTy VMap;
3229d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel  return CloneModule(M, VMap);
33782e60150eb9370a60fa51ed49bd23036588756aChris Lattner}
34782e60150eb9370a60fa51ed49bd23036588756aChris Lattner
355e665f559419c7f58a4fd9360cd488f065505c44Chris LattnerModule *llvm::CloneModule(const Module *M,
36774cca70b10bc679daff8203d639d9004a2eb194Devang Patel                          ValueToValueMapTy &VMap) {
3751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  // First off, we need to create the new module...
388b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson  Module *New = new Module(M->getModuleIdentifier(), M->getContext());
3926f238589f9bb372d24b6fb2bc32edbf046fd9eeReid Spencer  New->setDataLayout(M->getDataLayout());
40c4e8c9f318a4cb9ff75d8955482a8ca6412803cdChris Lattner  New->setTargetTriple(M->getTargetTriple());
413e2fa7a746270452316523f27b9055b007feba32Chris Lattner  New->setModuleInlineAsm(M->getModuleInlineAsm());
4251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner
43c4e8c9f318a4cb9ff75d8955482a8ca6412803cdChris Lattner  // Copy all of the type symbol table entries over.
4478d033e086e19e016273de014f9214aa6f3f844bReid Spencer  const TypeSymbolTable &TST = M->getTypeSymbolTable();
4578d033e086e19e016273de014f9214aa6f3f844bReid Spencer  for (TypeSymbolTable::const_iterator TI = TST.begin(), TE = TST.end();
4678d033e086e19e016273de014f9214aa6f3f844bReid Spencer       TI != TE; ++TI)
4778d033e086e19e016273de014f9214aa6f3f844bReid Spencer    New->addTypeName(TI->first, TI->second);
48c4e8c9f318a4cb9ff75d8955482a8ca6412803cdChris Lattner
49c4e8c9f318a4cb9ff75d8955482a8ca6412803cdChris Lattner  // Copy all of the dependent libraries over.
50c4e8c9f318a4cb9ff75d8955482a8ca6412803cdChris Lattner  for (Module::lib_iterator I = M->lib_begin(), E = M->lib_end(); I != E; ++I)
51c4e8c9f318a4cb9ff75d8955482a8ca6412803cdChris Lattner    New->addLibrary(*I);
52892310eaff9eb8439029755ddf84c2f22f0b7dd7Chris Lattner
5351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  // Loop over all of the global variables, making corresponding globals in the
5429d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel  // new module.  Here we add them to the VMap and to the new Module.  We
5551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  // don't worry about attributes or initializers, they will come later.
5651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  //
57c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner  for (Module::const_global_iterator I = M->global_begin(), E = M->global_end();
58a6bf66d0d6c1ed9bb657f72bc89c432c4ee96f63Nick Lewycky       I != E; ++I) {
59e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson    GlobalVariable *GV = new GlobalVariable(*New,
603d29df3e8a203b167d8071ea6f805b21db18a5afOwen Anderson                                            I->getType()->getElementType(),
61a6bf66d0d6c1ed9bb657f72bc89c432c4ee96f63Nick Lewycky                                            false,
62a6bf66d0d6c1ed9bb657f72bc89c432c4ee96f63Nick Lewycky                                            GlobalValue::ExternalLinkage, 0,
63e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson                                            I->getName());
64a6bf66d0d6c1ed9bb657f72bc89c432c4ee96f63Nick Lewycky    GV->setAlignment(I->getAlignment());
6529d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel    VMap[I] = GV;
66a6bf66d0d6c1ed9bb657f72bc89c432c4ee96f63Nick Lewycky  }
6751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner
6851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  // Loop over the functions in the module, making external functions as before
69c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner  for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) {
7000b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen    Function *NF =
71051a950000e21935165db56695e35bade668193bGabor Greif      Function::Create(cast<FunctionType>(I->getType()->getElementType()),
72051a950000e21935165db56695e35bade668193bGabor Greif                       GlobalValue::ExternalLinkage, I->getName(), New);
7328c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands    NF->copyAttributesFrom(I);
7429d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel    VMap[I] = NF;
75c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner  }
7651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner
77a289511090b2b48e0824349865e5bc9cb4b7d33cAnton Korobeynikov  // Loop over the aliases in the module
78a289511090b2b48e0824349865e5bc9cb4b7d33cAnton Korobeynikov  for (Module::const_alias_iterator I = M->alias_begin(), E = M->alias_end();
79a289511090b2b48e0824349865e5bc9cb4b7d33cAnton Korobeynikov       I != E; ++I)
8029d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel    VMap[I] = new GlobalAlias(I->getType(), GlobalAlias::ExternalLinkage,
81a289511090b2b48e0824349865e5bc9cb4b7d33cAnton Korobeynikov                                  I->getName(), NULL, New);
82a289511090b2b48e0824349865e5bc9cb4b7d33cAnton Korobeynikov
8351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  // Now that all of the things that global variable initializer can refer to
8451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  // have been created, loop through and copy the global variable referrers
8551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  // over...  We also set the attributes on the global now.
8651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  //
87c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner  for (Module::const_global_iterator I = M->global_begin(), E = M->global_end();
88c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner       I != E; ++I) {
8929d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel    GlobalVariable *GV = cast<GlobalVariable>(VMap[I]);
9051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner    if (I->hasInitializer())
9151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner      GV->setInitializer(cast<Constant>(MapValue(I->getInitializer(),
9229d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel                                                 VMap)));
934ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner    GV->setLinkage(I->getLinkage());
94c763552299165b88d34a7d4f2d76ff413cbc7f67Lauro Ramos Venancio    GV->setThreadLocal(I->isThreadLocal());
95c763552299165b88d34a7d4f2d76ff413cbc7f67Lauro Ramos Venancio    GV->setConstant(I->isConstant());
9651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  }
9751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner
9851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  // Similarly, copy over function bodies now...
9951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  //
10051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) {
10129d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel    Function *F = cast<Function>(VMap[I]);
1025cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer    if (!I->isDeclaration()) {
103e4d5c441e04bdc00ccf1804744af670655123b07Chris Lattner      Function::arg_iterator DestI = F->arg_begin();
104c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner      for (Function::const_arg_iterator J = I->arg_begin(); J != I->arg_end();
105c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner           ++J) {
10651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner        DestI->setName(J->getName());
10729d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel        VMap[J] = DestI++;
10851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner      }
10951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner
110ec1bea0d94372985a0a5eb283e644c6d0dd345dcChris Lattner      SmallVector<ReturnInst*, 8> Returns;  // Ignore returns cloned.
11129d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel      CloneFunctionInto(F, I, VMap, Returns);
11251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner    }
11351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner
1144ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner    F->setLinkage(I->getLinkage());
11551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  }
11651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner
117a289511090b2b48e0824349865e5bc9cb4b7d33cAnton Korobeynikov  // And aliases
118a289511090b2b48e0824349865e5bc9cb4b7d33cAnton Korobeynikov  for (Module::const_alias_iterator I = M->alias_begin(), E = M->alias_end();
119a289511090b2b48e0824349865e5bc9cb4b7d33cAnton Korobeynikov       I != E; ++I) {
12029d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel    GlobalAlias *GA = cast<GlobalAlias>(VMap[I]);
121a289511090b2b48e0824349865e5bc9cb4b7d33cAnton Korobeynikov    GA->setLinkage(I->getLinkage());
122a289511090b2b48e0824349865e5bc9cb4b7d33cAnton Korobeynikov    if (const Constant* C = I->getAliasee())
12329d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel      GA->setAliasee(cast<Constant>(MapValue(C, VMap)));
124a289511090b2b48e0824349865e5bc9cb4b7d33cAnton Korobeynikov  }
125d8800e797261285f91c2a3382215fd740e6f875dDevang Patel
126d8800e797261285f91c2a3382215fd740e6f875dDevang Patel  // And named metadata....
127d8800e797261285f91c2a3382215fd740e6f875dDevang Patel  for (Module::const_named_metadata_iterator I = M->named_metadata_begin(),
128d8800e797261285f91c2a3382215fd740e6f875dDevang Patel         E = M->named_metadata_end(); I != E; ++I) {
129d8800e797261285f91c2a3382215fd740e6f875dDevang Patel    const NamedMDNode &NMD = *I;
130d8800e797261285f91c2a3382215fd740e6f875dDevang Patel    SmallVector<MDNode*, 4> MDs;
131d8800e797261285f91c2a3382215fd740e6f875dDevang Patel    for (unsigned i = 0, e = NMD.getNumOperands(); i != e; ++i)
13229d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel      MDs.push_back(cast<MDNode>(MapValue(NMD.getOperand(i), VMap)));
133d8800e797261285f91c2a3382215fd740e6f875dDevang Patel    NamedMDNode::Create(New->getContext(), NMD.getName(),
134d8800e797261285f91c2a3382215fd740e6f875dDevang Patel                        MDs.data(), MDs.size(), New);
135d8800e797261285f91c2a3382215fd740e6f875dDevang Patel  }
1363bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel
1373bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel  // Update metadata attach with instructions.
1383bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel  for (Module::iterator MI = New->begin(), ME = New->end(); MI != ME; ++MI)
1393bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel    for (Function::iterator FI = MI->begin(), FE = MI->end();
1403bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel         FI != FE; ++FI)
1413bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel      for (BasicBlock::iterator BI = FI->begin(), BE = FI->end();
1423bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel           BI != BE; ++BI) {
1433bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel        SmallVector<std::pair<unsigned, MDNode *>, 4 > MDs;
1443bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel        BI->getAllMetadata(MDs);
1453bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel        for (SmallVector<std::pair<unsigned, MDNode *>, 4>::iterator
1463bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel               MDI = MDs.begin(), MDE = MDs.end(); MDI != MDE; ++MDI) {
14729d3dd8a64791031eea00ffbae51843dc9982df9Devang Patel          Value *MappedValue = MapValue(MDI->second, VMap);
1483bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel          if (MDI->second != MappedValue && MappedValue)
1493bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel            BI->setMetadata(MDI->first, cast<MDNode>(MappedValue));
1503bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel        }
1513bf329f49512e633df430c097bfd5bdaa122ba55Devang Patel      }
15251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner  return New;
15351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner}
154