【问题标题】:LLVM IR: How to call a function in another .ll fileLLVM IR:如何调用另一个 .ll 文件中的函数
【发布时间】:2016-07-07 13:16:11
【问题描述】:

我正在编写 LLVM IR 代码,我可以在另一个 .ll 文件中调用函数吗?

例如: 在.ll 文件中,有一个函数 foo(); 我可以在 b.ll 中使用这个函数吗,就像调用 foo 一样?如果是这样,我怎样才能包含 a.ll

谢谢

【问题讨论】:

    标签: llvm llvm-clang llvm-ir llvm-c++-api llvm-3.0


    【解决方案1】:

    您需要在调用它的ll文件中添加函数foo的声明,然后像往常一样转换链接ll文件以生成可执行文件

     llvm-link a.ll b.ll -o a.out
    

    示例 全部

    declare i32 @foo(i32)
    
    define i32 @main() {
        start:
        %0 = call i32 @foo(i32 0)
        ret i32 %0
    }
    

    b.ll

    define i32 @foo(i32) {
        start:
        ret i32 %0
    }
    

    【讨论】:

    • 非常感谢。但是如果我在 a.ll 中有一个在 b.ll 中使用 foo() 的函数 foo2(),我可以使用 C++ API parseIRFile 来提取 foo2() 函数,并使其在 c++ 代码中运行吗?如果是这样,怎么做?谢谢。
    【解决方案2】:

    我尝试了上述过程,但生成的a.out 文件不是可执行文件。它最初给出Permission denied 错误,在添加适当的权限后说:

    -bash: ./a.out: cannot execute binary file

    采用相同的两个 llvm 文件,即 a.llb.ll 对我有用的是:

    llvm-link-8 -S a.ll b.ll > hello.ll
    llc-8 -filetype=obj hello.ll
    clang hello.o
    

    以下 3 个命令创建了一个可以正常执行的可执行文件。第一个命令创建一个名为 hello.ll 的 LLVM 位代码文件,该文件链接 a.llb.ll。之后,它只是一个从 llvm 位码文件创建可执行二进制文件的过程。接下来的 2 个步骤就是这样做的。 (注意我使用的是 LLVM 8)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-13
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多