我正在开发一个我希望某些内省功能可用的库。假设我正在使用clang进行编译,因此我可以访问libtooling或其他任何内容。
我特别想要的是能够查看已编译函数的LLVM IR作为程序的一部分。我知道,在编译时,我可以使用-emit-llvm来获取IR。但是它将它保存到文件中。我想要的是将LLVM IR嵌入到程序本身中并从程序本身中检索 - 例如my_function_object.llvm_ir()
这样的事情可能吗?谢谢!
答案 0 :(得分:2)
你基本上试图反思你的程序。反射需要二进制文件中存在元数据。据我所知,这在LLVM中并不存在。
要实现这样的效果,您可以在程序中创建一个全局键值字典,通过导出的函数公开 - 类似IRInstruction* retrieve_llvm_ir_stream(char* name)
。
此字典会将给定函数的某种标识符(例如,导出的名称)映射到表示该函数的IR流的内存数组(每条指令表示为自定义IRInstruction
结构, 例如)。表示格式的类型和功能(如自定义IRInstruction
结构)必须包含在您的源代码中。
在IR生成步骤中,此词典将为空。在IR生成步骤之后,您需要立即添加自定义构建步骤:打开IR文件并使用数据填充字典 - 对于程序的每个导出函数,将其名称作为字典的键注入其IR流作为值。 IR流将根据您的函数定义生成,由您的自定义构建工具(它将利用LLVM API读取生成的IR并将其转换为您的格式)读取。
然后,像以前一样继续进行汇编器和链接器。