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

How can I make the LLVM IR of a function available to my program?

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

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

这种事可能吗?谢谢!

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

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

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

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

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