加载一组预先生成的LLVM IR并使其可用于运行时JIT模块的正确方法是什么,以便相同的类型没有给出新的名称,并且仍然可以进行内联和const传播?< / p>
到目前为止我的尝试:
我通过clang -c -emit-llvm -S -ffast-math -msse2 -O3 -o MyLib.ll MyLib.c
对于每个运行时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
。