如何使我的程序可用的LLVM IR功能可用?

问题描述:

我正在研究一个图书馆,我希望某些内省功能可用。假设我正在编译clang,所以我可以访问libtooling或其他任何东西。如何使我的程序可用的LLVM IR功能可用?

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

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

+0

我不认为这回答我的问题。问题是:如何从我自己的程序中访问LLVM IR? – user2333829

+0

LLVM是否会以任何方式(动态或静态)链接到您编译的程序? –

+0

如果必须的话,我可以肯定地将它链接到(LLVM),但是如果我能做到甚至没有更好。 – user2333829

你基本上想要反射到你的程序。反射需要二进制文件中存在元数据。就我所知,这在LLVM中并不存在。

为了达到这样的效果,您可以在程序中创建一个全局键值字典,通过导出的函数暴露 - 例如IRInstruction* retrieve_llvm_ir_stream(char* name)

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

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

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

+0

我无法快速接受这个答案!很好的答案。这是我的想法 - 需要在中间构建步骤中完成,但您完全将其勾画出来。谢谢! – user2333829