放置现有函数';调用LLVM函数传递中的另一个函数时的参数

放置现有函数';调用LLVM函数传递中的另一个函数时的参数,llvm,llvm-clang,llvm-c++-api,Llvm,Llvm Clang,Llvm C++ Api,我正在写一个LLVM函数传递。我有一个函数foo(inta,intb),在某些情况下,我需要将它的调用替换为bar(inta,intb) 我想这样做的方式基本上是: 找到我需要更换的foo() 向条()发出CallInst 使用foo()的参数填充CallInst::Create 调用ReplaceInstWithInst()使其工作 一切正常,但是foo()的参数没有被复制到bar()。执行替换调用时,bar()的参数仅为null 以下是相关代码: bool runOnFunction(函

我正在写一个LLVM函数传递。我有一个函数
foo(inta,intb)
,在某些情况下,我需要将它的调用替换为
bar(inta,intb)

我想这样做的方式基本上是:

  • 找到我需要更换的
    foo()
  • 条()发出
    CallInst
  • 使用
    foo()的参数填充
    CallInst::Create
  • 调用
    ReplaceInstWithInst()
    使其工作
一切正常,但是
foo()
的参数没有被复制到
bar()
。执行替换调用时,
bar()
的参数仅为null

以下是相关代码:

bool runOnFunction(函数&F)覆盖
{
CallInst*调用_to_foo=0;
函数*foo_func=0;
/*
循环函数中的所有调用,并在找到它时填充foo_func。
如果我们到达下面,这意味着我们所在的当前函数调用了
foo()(内部调用\u to \u foo),我们需要将其替换为bar()
指向一个foo函数
*/
函数*bar_func=get_bar_func();
//收集foo-args
//我相信问题就在这里:这些论点没有被复制
//正确或必须有一个深拷贝的排序,它的工作
std::向量条函数参数;
对于(size_t i=0;iarg_size();i++){
参数*arg=foo\u func->arg\u begin()+i;
bar_func_参数。向后推(参数);
}
自动*inst_to_replace=CallInst::Create(
bar_func,ArrayRef(bar_func_args),
“bar_func”);
用inst替换(
调用\u inst->getParent()->getInstList(),
BBI,安装至更换);
返回true;
}

非常感谢您的帮助。

您需要的参数在call指令中,而不是在被调用的函数中,因此您需要使用。

使用旧call指令中的参数而不是被调用的函数中的参数填充新的call指令。啊,对!!!一个人怎样才能得到卡林斯特的论点呢?非常感谢!请将您的评论作为答复,我将接受