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

问题描述 投票:1回答:2

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

c++ clang llvm llvm-ir
2个回答
2
投票

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

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

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


0
投票

更简单,更完整的解决方案是利用llvm的析构函数,将代码作为析构函数附加到@ llvm.global_dtor列表中。有一个库可以帮助解决这个问题(Transforms / Utils / ModuleUtils.h中的addToGobalDtors函数)。

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

© www.soinside.com 2019 - 2024. All rights reserved.