【问题标题】:How to insert a function call at the very end of the module in LLVM pass?如何在 LLVM 传递中模块的最后插入函数调用?
【发布时间】:2017-02-08 10:41:31
【问题描述】:

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

【问题讨论】:

  • 你想在模块末尾输出这个吗?还是您的意思是要在程序终止之前输出?
  • 程序终止之前。
  • 你应该看看使用 atexit()。

标签: c++ clang llvm llvm-ir


【解决方案1】:

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

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

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

【讨论】:

  • 对。感谢您的详细回复。所以无论程序如何终止,调用终止的函数都是exit(),所以我可以替换它或者在exit()指令之前插入我的函数?
  • 是的,您可以在exit() 之前插入您的呼叫,并且您还需要注意上述答案中第2点所述的输入功能。
  • 是的。那么exit所在的函数的名称应该是入口之一,即main()?
  • 对不起,我不明白你的问题。
  • 哦,让我澄清一下。所以 exit() 所在的函数,我打算在它之前插入我自己的函数,应该在入口函数中,即 main()?
【解决方案2】:

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

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

【讨论】:

  • 现在(或一直是?)appendToGlobalDtors()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多