gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:07:50 28 4
gpt4 key购买 nike

在我的应用程序中,我有 2 个 LLVM 模块 - 运行时模块(包含 void foo(int * a) 函数定义)和可执行模块(我使用 LLVM C++ API 创建)。

在我的可执行模块中,我创建了 int main(int argc, char ** argv)并想放 llvm::CallInst进入它的 body ,它会调用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 内部化的。链接之后,但在运行 Verifier 之前,我正在运行 Dead Global Elimination pass 以及其他一些优化。当我做 dump()在生成的模块上,我看到了 @foo来自运行时模块的也被删除了,尽管它被 main() 使用.看起来,LLVM 认为 @foo运行时定义和@foo可执行文件中的声明是无关的。

我试过使用链接类型 - 没有运气。

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

最佳答案

好的,我已经解决了,但我还是不明白问题出在哪里。在构建我的运行时位码模块期间,我一直在对其应用内部化转换。所以我尝试在链接后在运行时执行此操作,它对我有帮助。

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

关于llvm - 从另一个 llvm::Module 获取函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9023029/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com