【问题标题】:Can llvm lli excute swift irllvm lli可以执行swift ir吗
【发布时间】:2018-01-21 18:05:58
【问题描述】:

我有一个函数(用 Swift 编写),我想获取该函数的 LLVM IR 以及任何依赖项,以便我可以在完全独立的环境中运行生成的 LLVM IR。

例如,考虑以下函数:

func plus(a: Int, b: Int) ->Int {
    return a + b
}

plus(5, 7)

我可以将emit-ir 选项传递给swiftc,但是,生成的LLVM IR 包含外部调用,并且生成的IR 不能使用lli 运行(错误如下所示)。

LLVM ERROR: Program used external function '__TFSsa6C_ARGVGVSs20UnsafeMutablePointerGS_VSs4Int8__' which could not be resolved!

有没有什么方法可以获取这些外部函数的 IR 以便我可以使用 lli 来运行程序?

【问题讨论】:

    标签: llvm


    【解决方案1】:

    您需要向lli 介绍二进制文件的依赖关系。 以下是如何执行此操作。

    假设有一个“hello world”程序:

    // main.swift
    print("hello")
    

    将其编译为 LLVM Bitcode 和普通的可执行文件:

    > swiftc main.swift -o hello
    > swiftc -emit-bc main.swift -o hello.bc
    

    如果您按原样通过lli 运行main.bc,那么您将遇到与您在程序中看到的类似的错误。

    要了解依赖关系,您可以在 macOS 上使用 otool,在 Linux 上使用 ldd

    > otool -L /path/to/executbale
    > ldd /path/to/executbale
    

    以下是“hello world”程序的依赖项:

    > otool -L ./hello
    ./hello:
        /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1450.15.0)
        /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)
        @rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 900.0.74)
        @rpath/libswiftSwiftOnoneSupport.dylib (compatibility version 1.0.0, current version 900.0.74)
    

    在这种情况下,我们需要将libswiftSwiftOnoneSupport.dyliblibswiftCore.dylib 传递给lli sing -load 选项。

    在我的机器上,这些库位于此目录中(我使用find 找到它们):

    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx
    

    最后,您可以通过以下方式运行您的程序:

    > lli \
        -load=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftCore.dylib \
        -load=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftSwiftOnoneSupport.dylib \
        hello.bc
    

    另外,请注意参数的顺序:位码文件放在最后很重要。

    【讨论】:

    • 谢谢!我做同样的事情,它的工作原理!但我不能添加“import Foundation”
    • 它告诉我“原因:找不到图像 - 加载请求被忽略。”
    • 仔细检查文件路径?
    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 2012-04-07
    • 2019-08-30
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多