在我的应用程序中,我有 2 个 LLVM 模块 - 运行时模块(其中包含void foo(int * a)
函数定义)和可执行文件(我使用 LLVM C++ API 创建)。
在我的可执行模块中我创建int main(int argc, char ** argv)
并想把llvm::CallInst
进入它的身体,这会调用foo()
来自运行时模块的函数。
这是我的代码:
Function * fooF = Function::Create(runtimeModule->getFunction("foo")->getFunctionType(),
GlobalValue::WeakAnyLinkage, "foo", execModule);
之后,我将两个模块链接在一起:
Linker linker("blabla", execModule, false);
linker.LinkInFile("/path/to/runtime.bc", false);
execModule = linker.releaseModule();
这编译正常,但是当我在链接模块上运行 Verifier pass 时,我得到:
Global is external, but doesn't have external or dllimport or weak linkage!
void (%i32*)* @foo
invalid linkage type for function declaration
void (%i32*)* @foo
值得一提的是,运行时模块中的所有全局变量都是使用Internalize pass 内部化的。链接之后,但在运行验证程序之前,我正在运行“死亡全局消除”传递以及其他一些优化。当我这样做时dump()
在生成的模块上,我明白了@foo
来自运行时模块的也被删除,尽管它被使用main()
。看来,LLVM认为@foo
运行时定义和@foo
可执行文件中的声明是不相关的。
我尝试过使用链接类型 - 没有运气。
那么,从另一个模块创建对该函数的调用的正确方法是什么?