1

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

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

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

4

1 回答 1

2

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

为了达到这样的效果,你可以在你的程序中创建一个全局键值字典,通过导出的函数公开——比如IRInstruction* retrieve_llvm_ir_stream(char* name).

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

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

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

于 2015-09-05T19:52:11.360 回答