我有一个函数(用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!
来运行程序?
答案 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.dylib
和libswiftCore.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文件最后一个很重要。