【问题标题】:Get a function declaration from another llvm::Module从另一个 llvm::Module 获取函数声明
【发布时间】:2012-02-19 20:04:16
【问题描述】:

在我的应用程序中,我有 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();

这可以编译,但是当我在链接模块上运行验证器传递时,我得到:

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 内部化的。链接后,但在运行验证程序之前,我正在运行 Dead Global Elimination pass 以及其他一些优化。当我在结果模块上执行dump() 时,我看到来自运行时模块的@foo 也被删除,尽管main() 使用了它。看来,LLVM 认为运行时中的 @foo 定义和可执行文件中的 @foo 声明是不相关的。

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

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

【问题讨论】:

  • 快速问:这两个模块是否共享相同的上下文?
  • 什么是上下文? LLVM上下文?那就不知道了。
  • 这些类型仅在相同的上下文中是“兼容的”。确保您的模块共享它们。查看llvm.org/docs/doxygen/html/classllvm_1_1LLVMContext.html了解更多信息。
  • 是的,它们共享相同的上下文 - 我通过 getGlobalContext() 得到它。

标签: llvm codegen


【解决方案1】:

好的,我已经解决了,但我仍然无法理解问题所在。在构建我的运行时位码模块期间,我一直在对其进行内部化转换。因此,我尝试在链接后在运行时执行此操作,这对我有所帮助。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    相关资源
    最近更新 更多