如何正确链接预生成的LLVM IR与运行时生成的IR?

时间:2018-02-17 03:38:11

标签: llvm llvm-ir llvm-c++-api

加载一组预先生成的LLVM IR并使其可用于运行时JIT模块的正确方法是什么,以便相同的类型没有给出新的名称,并且仍然可以进行内联和const传播?< / p>

到目前为止我的尝试:

我通过clang -c -emit-llvm -S -ffast-math -msse2 -O3 -o MyLib.ll MyLib.c

将这些C函数编译为LLVM IR离线

对于每个运行时JIT模块,我通过llvm::parseIRFile()和&#34;粘贴&#34;加载生成的LLVM IR。它通过llvm::Linker::linkModules()进入运行时JIT模块。

这适用于第一个JIT模块,但不适用于后续创建的JIT模块。每次调用llvm::parseIRFile()时,IR中生成的模块类型定义都会被赋予新的名称。

例如,离线MyLib.ll如下所示:

%struct.A = type { <4 x float> } define <4 x float> @Foo(A*)(%struct.A* nocapture readonly) { ... }

第一次调用llvm::parseIRFile()时生成的模块与离线版本完全相同。从第二次调用llvm:parseIRFile()生成的模块看起来像:

%struct.A.1 = type { <4 x float> } define <4 x float> @Foo(A*)(%struct.A.1* nocapture readonly) { ... }

请注意,%struct.A已重命名为%struct.A.1。运行时JIT模块继续使用%struct.A生成代码,因此无法调用Foo(),因为它需要%struct.A.1

0 个答案:

没有答案