如何在 LLVM pass 中的模块末尾插入函数调用?
How to insert a function call at the very end of the module in LLVM pass?
我的 pass 在某些点插入函数,这些函数收集一些信息。在模块的末尾,我想显示我长期以来收集的所有内容,因此我想在模块的末尾插入一个函数来为我完成打印工作。我无法检测到模块的末尾以在它之前插入函数。帮助和指导将不胜感激!
我认为没有简单易行的方法this.You需要在代码中寻找两种退出点。
1) 代码可以调用像 exit()
这样的函数,这将是程序的退出点。所以你需要在传递中寻找那些并在它们之前插入你的函数调用。如果您不想麻烦检查代码中的每条指令,那么您可以手动将代码函数中对 exit()
的调用替换为新的退出函数(类似于 exit_())
其中包含对您要调用的函数的调用,然后是对 exit()
函数的实际调用。后一种方法要求您事先访问代码。
2)程序会在入口函数结束时退出(通常是main
)。因此,您可以检查函数名称是否与潜在入口点函数相同,并在 return 语句之前插入函数调用。如果它没有 return 语句,则将其插入所有指令的末尾。
一个更简单、更完整的解决方案是利用 llvm 的析构函数功能,将您的代码作为析构函数附加到 @llvm.global_dtor 列表中。有一个库可以帮助解决这个问题(Transforms/Utils/ModuleUtils.h 中的 addToGobalDtors 函数)。
一旦你的函数被附加到 dtor 列表,它就会在程序退出时自动调用(就像任何 C++ 风格的全局析构函数一样)。
我的 pass 在某些点插入函数,这些函数收集一些信息。在模块的末尾,我想显示我长期以来收集的所有内容,因此我想在模块的末尾插入一个函数来为我完成打印工作。我无法检测到模块的末尾以在它之前插入函数。帮助和指导将不胜感激!
我认为没有简单易行的方法this.You需要在代码中寻找两种退出点。
1) 代码可以调用像 exit()
这样的函数,这将是程序的退出点。所以你需要在传递中寻找那些并在它们之前插入你的函数调用。如果您不想麻烦检查代码中的每条指令,那么您可以手动将代码函数中对 exit()
的调用替换为新的退出函数(类似于 exit_())
其中包含对您要调用的函数的调用,然后是对 exit()
函数的实际调用。后一种方法要求您事先访问代码。
2)程序会在入口函数结束时退出(通常是main
)。因此,您可以检查函数名称是否与潜在入口点函数相同,并在 return 语句之前插入函数调用。如果它没有 return 语句,则将其插入所有指令的末尾。
一个更简单、更完整的解决方案是利用 llvm 的析构函数功能,将您的代码作为析构函数附加到 @llvm.global_dtor 列表中。有一个库可以帮助解决这个问题(Transforms/Utils/ModuleUtils.h 中的 addToGobalDtors 函数)。
一旦你的函数被附加到 dtor 列表,它就会在程序退出时自动调用(就像任何 C++ 风格的全局析构函数一样)。