Заполнение LLVM CloneFunction VMAP
Я хочу написать некоторый код, который, учитывая функцию F LLVM, создает точную копию в том же модуле (таким образом, копия может быть изменена позже при сохранении оригинала). Я хочу сделать это с помощью метода CloneFunctionInto.
Моя текущая попытка включает в себя попытку вставить каждую пару (новый аргумент, старый аргумент) в VMap. Ранее я пытался вставить неинициализированный VMap и поставить пару наоборот. Впечатляюще, все 3 привели к одному и тому же сообщению об ошибке:
Утверждение `VMap.count(&I) && " Не указано сопоставление из исходного аргумента!"
//F and S are defined higher up in the code
FunctionType *FType = F->getFunctionType();
Function *new_F = cast<Function>(M->getOrInsertFunction(S,FType));
std::vector<Type*> ArgTypes;
ValueToValueMapTy VMap;
Function::arg_iterator old_args = F->arg_begin();
for (Function::arg_iterator new_args = new_F->arg_begin(), new_args_end = new_F->arg_end();new_args != new_args_end; new_args++) {
std::pair<Value*,Value*> pair(&*new_args,&*old_args);
VMap.insert(pair);
if (VMap.count(&*new_args)>0) {
errs().write_escaped("Mapping added") << '\n';
}
old_args++;
}
SmallVector<ReturnInst*, 8> Returns;
CloneFunctionInto(new_F, F, VMap, false, Returns, "_new", 0, 0);
При использовании сообщение "добавление сопоставления" печатается правильное количество раз (т.е. один раз для каждого аргумента), поэтому я действительно не уверен, где ошибка.
1 ответ
Ты можешь использовать CloneFunction
вместо CloneFunctionInto
когда вы просто хотите клонировать функцию.
Также CloneFunction
показывает, как справиться с ValueToValueMap
для клонирования:
От CloneFunction.cpp
:
00223 Function *llvm::CloneFunction(const Function *F, ValueToValueMapTy &VMap,
00224 bool ModuleLevelChanges,
00225 ClonedCodeInfo *CodeInfo) {
00226 std::vector<Type*> ArgTypes;
00227
00228 // The user might be deleting arguments to the function by specifying them in
00229 // the VMap. If so, we need to not add the arguments to the arg ty vector
00230 //
00231 for (const Argument &I : F->args())
00232 if (VMap.count(&I) == 0) // Haven't mapped the argument to anything yet?
00233 ArgTypes.push_back(I.getType());
00234
00235 // Create a new function type...
00236 FunctionType *FTy = FunctionType::get(F->getFunctionType()->getReturnType(),
00237 ArgTypes, F->getFunctionType()->isVarArg());
00238
00239 // Create the new function...
00240 Function *NewF = Function::Create(FTy, F->getLinkage(), F->getName());
00241
00242 // Loop over the arguments, copying the names of the mapped arguments over...
00243 Function::arg_iterator DestI = NewF->arg_begin();
00244 for (const Argument & I : F->args())
00245 if (VMap.count(&I) == 0) { // Is this argument preserved?
00246 DestI->setName(I.getName()); // Copy the name over...
00247 VMap[&I] = &*DestI++; // Add mapping to VMap
00248 }
00249
00250 if (ModuleLevelChanges)
00251 CloneDebugInfoMetadata(NewF, F, VMap);
00252
00253 SmallVector<ReturnInst*, 8> Returns; // Ignore returns cloned.
00254 CloneFunctionInto(NewF, F, VMap, ModuleLevelChanges, Returns, "", CodeInfo);
00255 return NewF;
00256 }