c++ - 如何使函数的 LLVM IR 可用于我的程序?

标签 c++ clang llvm llvm-ir libtooling

我正在开发一个库,我希望它具有某些内省(introspection)功能。假设我正在使用 clang 进行编译,因此我可以访问 libtooling 或其他任何工具。

我特别希望有人能够在程序中查看已编译函数的 LLVM IR。我知道,在编译时,我可以使用 -emit-llvm 来获取 IR。但这会将其保存到文件中。我想要的是将 LLVM IR 嵌入程序本身并可从程序本身检索——例如my_function_object.llvm_ir()

这样的事情可能吗?谢谢!

最佳答案

您基本上是在尝试对您的程序进行反射(reflection)。反射需要二进制文件中存在元数据。据我所知,这在 LLVM 中并不存在。

要达到这样的效果,您可以在您的程序中创建一个全局键值字典,通过导出函数公开 - 类似于 IRInstruction* retrieve_llvm_ir_stream(char* name)

这个字典会将给定函数的某种标识符(例如,导出的名称)映射到内存中的数组,该数组表示该函数的 IR 流(每条指令表示为自定义 IRInstruction结构,例如)。表示格式的类型和函数(如自定义 IRInstruction 结构)必须包含在您的源代码中。

在生成 IR 的步骤中,这个字典将为空。在 IR 生成步骤之后,您需要立即添加自定义构建步骤:打开 IR 文件并使用数据填充字典 - 对于程序的每个导出函数,将其名称作为键注入(inject)字典及其 IR流作为一个值。 IR 流将根据您的函数定义生成,正如您的自定义构建工具所读取的那样(它将利用 LLVM API 读取生成的 IR 并将其转换为您的格式)。

然后,像以前一样进行汇编器和链接器。

关于c++ - 如何使函数的 LLVM IR 可用于我的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32416943/

相关文章:

c - 采用函数指针并返回 block 的 block 的 block 签名

c++ - clang 3.3 中的模板默认 Arg 替换失败

c++ - 目标代码可以转换回 LLVM IR 吗?

ios - iOS 编程是否会使用 Clang 和 llvm 进行虚拟化?

c++ - 释放 Allegro 鼠标按钮

gcc - Clang 3.4 stdlib.h 编译错误

c++ - QTextDocument 中用于信封的页码

build-process - 如何注册一个新的 LLVM 后端?

c++ - 这个 RAII 独占资源检查对象/管理器组合线程安全吗?

c++ - 创建 Qt 插件并使用非虚函数