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