Cloning.h revision d4fd3978056928b156bc51bff7cd4eb825bffb1a
184bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner//===- Cloning.h - Clone various parts of LLVM programs ---------*- C++ -*-===// 284bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// 384bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// This file defines various functions that are used to clone chunks of LLVM 484bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// code for various purposes. This varies from copying whole modules into new 584bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// modules, to cloning functions with different arguments, to inlining 684bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// functions, to copying basic blocks to support loop unrolling or superblock 784bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// formation, etc. 884bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// 984bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner//===----------------------------------------------------------------------===// 1084bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner 1184bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner#ifndef LLVM_TRANSFORMS_UTIlS_CLONING_H 1284bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner#define LLVM_TRANSFORMS_UTIlS_CLONING_H 1384bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner 1484bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner#include <vector> 15d18015599cbe09dd327b5f73501581a865bf27daChris Lattner#include <map> 1684bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnerclass Module; 1784bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnerclass Function; 1884bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnerclass BasicBlock; 1984bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnerclass Value; 2084bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnerclass CallInst; 211c9985067bfedc219c1a6128bfc703cf3894b866Chris Lattnerclass ReturnInst; 2284bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner 23d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// CloneModule - Return an exact copy of the specified module 24d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// 25d4fd3978056928b156bc51bff7cd4eb825bffb1aChris LattnerModule *CloneModule(const Module *M); 26d18015599cbe09dd327b5f73501581a865bf27daChris Lattner 27d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// CloneFunction - Return a copy of the specified function, but without 28d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// embedding the function into another module. Also, any references specified 29d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// in the ValueMap are changed to refer to their mapped value instead of the 30d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// original one. If any of the arguments to the function are in the ValueMap, 31d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// the arguments are deleted from the resultant function. The ValueMap is 32d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// updated to include mappings from all of the instructions and basicblocks in 33d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// the function from their old to new values. 34d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// 35d18015599cbe09dd327b5f73501581a865bf27daChris LattnerFunction *CloneFunction(const Function *F, 36d18015599cbe09dd327b5f73501581a865bf27daChris Lattner std::map<const Value*, Value*> &ValueMap); 37d18015599cbe09dd327b5f73501581a865bf27daChris Lattner 38d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// CloneFunction - Version of the function that doesn't need the ValueMap. 39d18015599cbe09dd327b5f73501581a865bf27daChris Lattner/// 40d18015599cbe09dd327b5f73501581a865bf27daChris Lattnerinline Function *CloneFunction(const Function *F) { 41d18015599cbe09dd327b5f73501581a865bf27daChris Lattner std::map<const Value*, Value*> ValueMap; 42d18015599cbe09dd327b5f73501581a865bf27daChris Lattner return CloneFunction(F, ValueMap); 43d18015599cbe09dd327b5f73501581a865bf27daChris Lattner} 44d18015599cbe09dd327b5f73501581a865bf27daChris Lattner 4584bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// Clone OldFunc into NewFunc, transforming the old arguments into references to 4684bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// ArgMap values. Note that if NewFunc already has basic blocks, the ones 471c9985067bfedc219c1a6128bfc703cf3894b866Chris Lattner// cloned into it will be added to the end of the function. This function fills 481c9985067bfedc219c1a6128bfc703cf3894b866Chris Lattner// in a list of return instructions, and can optionally append the specified 491c9985067bfedc219c1a6128bfc703cf3894b866Chris Lattner// suffix to all values cloned. 5084bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// 5184bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnervoid CloneFunctionInto(Function *NewFunc, const Function *OldFunc, 52d18015599cbe09dd327b5f73501581a865bf27daChris Lattner std::map<const Value*, Value*> &ValueMap, 531c9985067bfedc219c1a6128bfc703cf3894b866Chris Lattner std::vector<ReturnInst*> &Returns, 541c9985067bfedc219c1a6128bfc703cf3894b866Chris Lattner const char *NameSuffix = ""); 5584bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner 5684bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner 5784bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// InlineFunction - This function forcibly inlines the called function into the 5884bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// basic block of the caller. This returns true if it is not possible to inline 5984bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// this call. The program is still in a well defined state if this occurs 6084bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// though. 6184bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// 6284bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// Note that this only does one level of inlining. For example, if the 6384bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// instruction 'call B' is inlined, and 'B' calls 'C', then the call to 'C' now 6484bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// exists in the instruction stream. Similiarly this will inline a recursive 6584bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// function by one level. 6684bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner// 6784bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattnerbool InlineFunction(CallInst *C); 6884bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner 6984bf9880eaf57f00cc01b4ade40179553ea6fd08Chris Lattner#endif 70