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

Unk*_*987 5 llvm llvm-ir llvm-c++-api

加载一组预先生成的 LLVM IR 并使其可用于运行时 JIT 模块以便相同类型不会被赋予新名称并且内联和常量传播仍然可以发生的正确方法是什么?


到目前为止我的尝试:

我通过以下方式将这些 C 函数离线编译为 LLVM IR clang -c -emit-llvm -S -ffast-math -msse2 -O3 -o MyLib.ll MyLib.c

对于每个运行时 JIT 模块,我通过加载生成的 LLVM IRllvm::parseIRFile()并将其“粘贴”到运行时 JIT 模块中llvm::Linker::linkModules()

这适用于第一个 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