【发布时间】:2018-04-03 16:16:19
【问题描述】:
我有一个文件,其中 main 函数调用了三个测试函数,即测试 1、测试 2 和测试 3。我想做一个传递,一个一个地删除每两个函数并返回正在调用的文件只有三个测试功能之一。现在,我的 pass 是一个带有这个 body 的 ModulePass:
for(Module::iterator F= M.begin(), E = M.end(); F != E; ++F) // iterating over functions in a module
{
std::string function_name = F->getName();
if((std::find(calledFunctions.begin(), calledFunctions.end(), function_name) != calledFunctions.end())
&& function_name != current_function )
{
F->replaceAllUsesWith(UndefValue::get(F->getType()));
F->removeFromParent();
}
}
其中被调用的函数包含您想要删除的函数(例如,测试 2 和测试 3),而 current_function 是您在主函数中想要的函数(在本例中为测试 1)
有人可以告诉我我的方法是否正确吗?截至目前,我遇到了分段错误。
【问题讨论】:
-
我怀疑删除函数会使
Module::iterator F无效。尝试删除循环后的所有函数。 -
是的,这就是我后来所做的。通行证工作正常,但是当我运行位码时,当它尝试执行我用 undef 替换函数调用的行时,它给了我一个分段错误。它失败的确切行是:
invoke.cont1: ; preds = %invoke.cont invoke void undef() to label %invoke.cont3 unwind label %lpad其中 cont3 基本上打印出“完成”(它没有这样做 rn)。 -
我相信它给了我一个分段错误,因为在上面提到的那一行,它试图从一个未初始化的内存中读取(从谷歌得到它,创建 undef 来表示未初始化的内存读取)。这让我相信也许我应该用其他东西替换我的函数调用。你能建议我从这里去哪里吗?
-
我建议你使用调试器来找出确切的原因,而不是猜测。
标签: llvm llvm-ir llvm-gcc llvm-3.0