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

3

我的应用程序中有两个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声明是不相关的。
我已经尝试过更改链接类型,但没有成功。
那么,创建另一个模块中的函数调用的正确方法是什么呢?

快速问题:这两个模块共享相同的上下文吗? - Anton Korobeynikov
什么是上下文?LLVMContext?不知道。 - arrowd
类型仅在相同的上下文中“兼容”。确保您的模块共享它们。请查看http://llvm.org/docs/doxygen/html/classllvm_1_1LLVMContext.html获取更多信息。 - Anton Korobeynikov
是的,它们共享同一个上下文 - 我使用getGlobalContext()获取它。 - arrowd
1个回答

0

好的,我已经修复了它,但我仍然不明白问题出在哪里。在构建我的运行时位码模块期间,我一直在对其应用内部化转换。因此,我尝试在链接后在运行时执行此操作,并且这帮助了我。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接