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

从另一个llvm::模块获取函数声明,llvm,codegen,Llvm,Codegen,在我的应用程序中,我有2个LLVM模块——运行时一个(包含代码>虚空FO(int *a)< /Cuff>函数定义”和可执行的(LLVM C++ API)。 在我的可执行模块中,我创建了intmain(intargc,char**argv),并希望将llvm::CallInst放入它的主体中,它将从运行时模块调用foo()函数 这是我的密码: Function * fooF = Function::Create(runtimeModule->getFunction("foo")->ge

在我的应用程序中,我有2个LLVM模块——运行时一个(包含代码>虚空FO(int *a)< /Cuff>函数定义”和可执行的(LLVM C++ API)。 在我的可执行模块中,我创建了
intmain(intargc,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
值得一提的是,运行时模块中的所有全局变量都是使用internalizepass进行内部化的。在链接之后,但在运行验证器之前,我正在运行一些其他优化中的死全局消除过程。当我对生成的模块执行
dump()
时,我看到,来自运行时模块的
@foo
也被删除,尽管它被
main()
使用。看起来,LLVM认为运行时中的
@foo
定义和可执行文件中的
@foo
声明是不相关的

我试过玩链接类型-运气不好


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

好的,我已经修复了它,但我仍然无法理解问题出在哪里。在构建运行时位代码模块的过程中,我一直在对其应用内部化转换。所以我尝试在链接后在运行时这样做,这对我很有帮助


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

快速问:这两个模块共享相同的上下文吗?上下文是什么?LLVMContext?不知道。这些类型只在同一上下文中“兼容”。确保您的模块共享它们。检查更多信息。是的,它们共享相同的上下文-我通过getGlobalContext()获得。