CloneModule.cpp revision 7899b74fdbb58bcb50641703b6f1f212a3aebcb0
151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner//===- CloneModule.cpp - Clone an entire module ---------------------------===// 251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner// 351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner// This file implements the CloneModule interface which makes a copy of an 451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner// entire module. 551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner// 651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner//===----------------------------------------------------------------------===// 751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "llvm/Transforms/Utils/Cloning.h" 951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "llvm/Module.h" 1051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "llvm/DerivedTypes.h" 1151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "llvm/Constant.h" 1251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "ValueMapper.h" 1351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 1451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner/// CloneModule - Return an exact copy of the specified module. This is not as 1551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner/// easy as it might seem because we have to worry about making copies of global 1651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner/// variables and functions, and making their (intializers and references, 1751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner/// respectively) refer to the right globals. 1851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner/// 1951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris LattnerModule *CloneModule(const Module *M) { 2051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // First off, we need to create the new module... 2137f59419b8680fd1814e71387c8354ad64bd670bChris Lattner Module *New = new Module(M->getModuleIdentifier()); 227899b74fdbb58bcb50641703b6f1f212a3aebcb0Chris Lattner New->setEndianness(M->getEndianness()); 237899b74fdbb58bcb50641703b6f1f212a3aebcb0Chris Lattner New->setPointerSize(M->getPointerSize()); 2451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 2551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // Create the value map that maps things from the old module over to the new 2651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // module. 2751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner std::map<const Value*, Value*> ValueMap; 2851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 2951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // Loop over all of the global variables, making corresponding globals in the 3051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // new module. Here we add them to the ValueMap and to the new Module. We 3151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // don't worry about attributes or initializers, they will come later. 3251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // 3351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner for (Module::const_giterator I = M->gbegin(), E = M->gend(); I != E; ++I) 344ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner ValueMap[I] = new GlobalVariable(I->getType()->getElementType(), false, 354ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner GlobalValue::ExternalLinkage, 0, 364ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner I->getName(), New); 3751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 3851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // Loop over the functions in the module, making external functions as before 3951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) 4051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner ValueMap[I]=new Function(cast<FunctionType>(I->getType()->getElementType()), 414ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner GlobalValue::ExternalLinkage, I->getName(), New); 4251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 4351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // Now that all of the things that global variable initializer can refer to 4451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // have been created, loop through and copy the global variable referrers 4551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // over... We also set the attributes on the global now. 4651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // 4751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner for (Module::const_giterator I = M->gbegin(), E = M->gend(); I != E; ++I) { 4851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner GlobalVariable *GV = cast<GlobalVariable>(ValueMap[I]); 4951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner if (I->hasInitializer()) 5051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner GV->setInitializer(cast<Constant>(MapValue(I->getInitializer(), 5151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner ValueMap))); 524ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner GV->setLinkage(I->getLinkage()); 5351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 5451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 5551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // Similarly, copy over function bodies now... 5651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // 5751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) { 5851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner Function *F = cast<Function>(ValueMap[I]); 5951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner if (!I->isExternal()) { 6051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner Function::aiterator DestI = F->abegin(); 6151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner for (Function::const_aiterator J = I->abegin(); J != I->aend(); ++J) { 6251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner DestI->setName(J->getName()); 6351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner ValueMap[J] = DestI++; 6451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 6551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 6651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner std::vector<ReturnInst*> Returns; // Ignore returns cloned... 6751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner CloneFunctionInto(F, I, ValueMap, Returns); 6851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 6951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 704ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner F->setLinkage(I->getLinkage()); 7151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 7251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 7351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner return New; 7451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner} 75