void copyFunctionBody(Function &New, const Function &Orig, ValueToValueMapTy &VMap) { if (!Orig.isDeclaration()) { Function::arg_iterator DestI = New.arg_begin(); for (Function::const_arg_iterator J = Orig.arg_begin(); J != Orig.arg_end(); ++J) { DestI->setName(J->getName()); VMap[J] = DestI++; } SmallVector<ReturnInst *, 8> Returns; // Ignore returns cloned. CloneFunctionInto(&New, &Orig, VMap, /*ModuleLevelChanges=*/true, Returns); } }
void moveFunctionBody(Function &OrigF, ValueToValueMapTy &VMap, ValueMaterializer *Materializer, Function *NewF) { assert(!OrigF.isDeclaration() && "Nothing to move"); if (!NewF) NewF = cast<Function>(VMap[&OrigF]); else assert(VMap[&OrigF] == NewF && "Incorrect function mapping in VMap."); assert(NewF && "Function mapping missing from VMap."); assert(NewF->getParent() != OrigF.getParent() && "moveFunctionBody should only be used to move bodies between " "modules."); SmallVector<ReturnInst *, 8> Returns; // Ignore returns cloned. CloneFunctionInto(NewF, &OrigF, VMap, /*ModuleLevelChanges=*/true, Returns, "", nullptr, nullptr, Materializer); OrigF.deleteBody(); }
Function* copyFunctionWithArguments(Module &M, Function *OldFunc, std::vector<Type*> ArgTypes) { FunctionType *functionType = buildLoweredFunctionType(OldFunc, ArgTypes); Function* NewFunc = Function::Create( functionType, OldFunc->getLinkage(), OldFunc->getName(), &M ); ValueToValueMapTy VMap; Function::arg_iterator DestI = NewFunc->arg_begin(); for (Function::const_arg_iterator I = OldFunc->arg_begin(), E = OldFunc->arg_end(); I != E; ++I) { VMap[I] = DestI++; } SmallVector<ReturnInst*, 5> Returns; CloneFunctionInto(NewFunc, OldFunc, VMap, false, Returns, "", 0); return NewFunc; }