CloneModule.cpp revision 00b16889ab461b7ecef1c91ade101186b7f1fce2
151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner//===- CloneModule.cpp - Clone an entire module ---------------------------===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under 6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source 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" 18892310eaff9eb8439029755ddf84c2f22f0b7dd7Chris Lattner#include "llvm/SymbolTable.h" 1951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "llvm/Constant.h" 2051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#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) { 2951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // First off, we need to create the new module... 3037f59419b8680fd1814e71387c8354ad64bd670bChris Lattner Module *New = new Module(M->getModuleIdentifier()); 317899b74fdbb58bcb50641703b6f1f212a3aebcb0Chris Lattner New->setEndianness(M->getEndianness()); 327899b74fdbb58bcb50641703b6f1f212a3aebcb0Chris Lattner New->setPointerSize(M->getPointerSize()); 3351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 34892310eaff9eb8439029755ddf84c2f22f0b7dd7Chris Lattner // Copy all of the type symbol table entries over... 35892310eaff9eb8439029755ddf84c2f22f0b7dd7Chris Lattner const SymbolTable &SymTab = M->getSymbolTable(); 369231ac8b6f2c3f9877bdb7a223f7392061258ab6Reid Spencer SymbolTable::type_const_iterator TypeI = SymTab.type_begin(); 379231ac8b6f2c3f9877bdb7a223f7392061258ab6Reid Spencer SymbolTable::type_const_iterator TypeE = SymTab.type_end(); 389231ac8b6f2c3f9877bdb7a223f7392061258ab6Reid Spencer for ( ; TypeI != TypeE; ++TypeI ) { 399231ac8b6f2c3f9877bdb7a223f7392061258ab6Reid Spencer New->addTypeName(TypeI->first, TypeI->second); 409231ac8b6f2c3f9877bdb7a223f7392061258ab6Reid Spencer } 41892310eaff9eb8439029755ddf84c2f22f0b7dd7Chris Lattner 4251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // Create the value map that maps things from the old module over to the new 4351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // module. 4451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner std::map<const Value*, Value*> ValueMap; 4551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 4651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // Loop over all of the global variables, making corresponding globals in the 4751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // new module. Here we add them to the ValueMap and to the new Module. We 4851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // don't worry about attributes or initializers, they will come later. 4951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // 50c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner for (Module::const_global_iterator I = M->global_begin(), E = M->global_end(); 51c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner I != E; ++I) 524ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner ValueMap[I] = new GlobalVariable(I->getType()->getElementType(), false, 534ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner GlobalValue::ExternalLinkage, 0, 544ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner I->getName(), New); 5551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 5651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // Loop over the functions in the module, making external functions as before 57c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) { 5800b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen Function *NF = 59c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner new Function(cast<FunctionType>(I->getType()->getElementType()), 60c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner GlobalValue::ExternalLinkage, I->getName(), New); 61c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner NF->setCallingConv(I->getCallingConv()); 62c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner ValueMap[I]= NF; 63c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner } 6451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 6551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // Now that all of the things that global variable initializer can refer to 6651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // have been created, loop through and copy the global variable referrers 6751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // over... We also set the attributes on the global now. 6851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // 69c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner for (Module::const_global_iterator I = M->global_begin(), E = M->global_end(); 70c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner I != E; ++I) { 7151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner GlobalVariable *GV = cast<GlobalVariable>(ValueMap[I]); 7251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner if (I->hasInitializer()) 7351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner GV->setInitializer(cast<Constant>(MapValue(I->getInitializer(), 7451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner ValueMap))); 754ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner GV->setLinkage(I->getLinkage()); 7651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 7751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 7851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // Similarly, copy over function bodies now... 7951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // 8051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) { 8151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner Function *F = cast<Function>(ValueMap[I]); 8251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner if (!I->isExternal()) { 83e4d5c441e04bdc00ccf1804744af670655123b07Chris Lattner Function::arg_iterator DestI = F->arg_begin(); 84c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner for (Function::const_arg_iterator J = I->arg_begin(); J != I->arg_end(); 85c154cef9a1e7db1afd42e4b227571debe7a986f5Chris Lattner ++J) { 8651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner DestI->setName(J->getName()); 8751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner ValueMap[J] = DestI++; 8851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 8951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 9051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner std::vector<ReturnInst*> Returns; // Ignore returns cloned... 9151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner CloneFunctionInto(F, I, ValueMap, Returns); 9251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 9351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 944ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner F->setLinkage(I->getLinkage()); 9551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 9651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 9751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner return New; 9851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner} 999231ac8b6f2c3f9877bdb7a223f7392061258ab6Reid Spencer 1009231ac8b6f2c3f9877bdb7a223f7392061258ab6Reid Spencer// vim: sw=2 101