从另一个llvm :: Module获取函数声明

时间:2012-01-26 18:09:04

标签: llvm codegen

在我的应用程序中,我有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传递时,我得到:

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传递其他一些优化。当我在生成的模块上dump()时,我发现,@foo来自运行时模块的main()也被删除了,尽管它被@foo使用了。看来,LLVM认为运行时的@foo定义和可执行文件中的{{1}}声明是无关的。

我试过玩连锁类型 - 没有运气。

那么,从另一个模块创建函数调用的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

好的,我已经修好了,但我仍然无法理解问题所在。在构建我的运行时bitcode模块期间,我一直在对它进行内部化转换。所以我尝试在链接后的运行时这样做,它帮助了我。

啊,我一直在使用GlobalValue::WeakAnyLinkage