我的应用程序中有两个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();
这个编译通过了,但是当我在链接模块上运行验证器时,我得到了以下信息:
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)来内部化。在链接之后,但在运行Verifier之前,我在其他一些优化之间运行了死全局消除传递(dead global elimination pass)。当我在结果模块上执行
dump()
时,看到来自运行时模块的@foo
也被移除了,尽管它被main()
所使用。这似乎表明LLVM认为运行时中的@foo
定义和可执行文件中的@foo
声明是不相关的。我已经尝试过更改链接类型,但没有成功。
那么,创建另一个模块中的函数调用的正确方法是什么呢?