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