如何在LLVM传递中在模块的最末端插入函数调用?

时间:2017-02-08 10:41:31

标签: c++ clang llvm llvm-ir

我的传递在某些点插入函数,这些函数收集一些信息。在模块的最后,我想显示我收集的任何东西,所以我想在模块的末尾插入一个函数,为我完成打印工作。我无法检测模块的最后一部分,以便在它之前插入功能。帮助和指导将不胜感激!

2 个答案:

答案 0 :(得分:2)

我认为没有简单易行的方法。你需要在代码中寻找两种退出点。

1)代码可以调用exit()之类的函数,这些函数将成为程序的出口点。所以你需要在pass中查找那些并在它们之前插入你的函数调用。如果您不想麻烦地检查代码中的每条指令,那么您可以使用新的退出函数手动替换代码函数中exit()的调用(类似{{ 1}}包含对要调用的函数的调用,然后是对exit_())函数的实际调用。后一种方法要求您事先访问代码。

2)程序将在输入函数结束时退出(通常为exit())。因此,您可以检查函数名称是否与潜在入口点函数相同,并在return语句之前插入函数调用。如果它没有return语句,则在所有指令的末尾插入它。

答案 1 :(得分:0)

一个更简单,更完整的解决方案是,通过将代码作为析构函数附加到@ llvm.global_dtor列表中,以利用llvm的析构函数功能。有一个与此相关的库(Transforms / Utils / ModuleUtils.h中的addToGobalDtors函数)。

将函数添加到dtor列表后,它将在程序退出时自动调用(就像任何C ++样式的全局析构函数一样)。