可以llvm lli执行swift ir

时间:2018-01-17 03:14:08

标签: llvm

我有一个函数(用Swift编写),我想获得函数PLUS的LLVM IR任何依赖项,这样我就可以在完全自包含的环境中运行生成的LLVM IR。

例如,请考虑以下功能:

message.guild.id

我可以将func plus(a: Int, b: Int) ->Int { return a + b } plus(5, 7) 选项传递给emit-ir,但是,生成的LLVM IR包含外部调用,并且无法使用swiftc运行生成的IR(错误如下所示)。

lli

有没有办法获取这些外部函数的IR,以便我可以使用LLVM ERROR: Program used external function '__TFSsa6C_ARGVGVSs20UnsafeMutablePointerGS_VSs4Int8__' which could not be resolved! 来运行程序?

1 个答案:

答案 0 :(得分:1)

您需要教授lli二进制文件的依赖关系。 这是如何做到的。

假设有一个“hello world”计划:

// main.swift
print("hello")

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

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

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

要了解依赖关系,您可以在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-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

另外,请注意参数的顺序:bitcode文件最后一个很重要。