我正在寻找在编译期间使用 LLVM 提取静态代码特征(如指令数)然后存储这些值以便我可以在程序执行期间使用的方法。
这可以通过 TransformationPasses 来完成吗?我在 LLVM 文档中没有得到这个概念。
我正在寻找在编译期间使用 LLVM 提取静态代码特征(如指令数)然后存储这些值以便我可以在程序执行期间使用的方法。
这可以通过 TransformationPasses 来完成吗?我在 LLVM 文档中没有得到这个概念。
你的问题太笼统了。TransformationPasses 转换您的代码(例如消除死代码)。对于分析,有分析通行证。您可以编辑这些通行证以获得所需的内容。
首先,您可以编写自己的分析通行证: http: //llvm.org/docs/WritingAnLLVMPass.html。其次,您有 runOnFunction() 之类的函数(您可以在其中使用指令迭代器或基本块迭代器)。对于计数指令的特定示例,只需在 runOnFunction() 或 LLVM 方法中使用计数器。
首先,您需要编写一个计算所需信息的通行证。然后,您需要将该信息注入到您的模块中。一种相对简单的方法是生成函数,在调用时返回计算值。
如果程序员想要接收这些特殊值,则需要调用这些函数。程序员可能需要自己添加签名,但您的 pass 将替换为declare
实际的define
,它只返回一个常量值。这些函数也应该被注释为内联。
您也可以通过替换特殊变量或参数或其他任何东西来做到这一点,只是函数调用在我看来是一种优雅的方法。