iOSアプリとLLVMのbitcode

(2020-07-07)

Objective-CやSwiftはLLVMを通して機械語にコンパイルされる。 Swiftの場合、フロントエンドのコンパイラによってASTが作られ SIL(Swift Intermediate Language)という中間表現に変換された後、 LLVM IR(intermediate representation)に再度変換され、 これをLLVM Optimizerで最適化したものが バックエンドのLLVMに渡りターゲットアーキテクチャの機械語に変換される流れになっている。

bitcodeはこのLLVM IRのバイナリフォーマットのこと。 ちなみに、bitcodeはターゲットに依存しなさそうなのだが実際は依存してしまう。 SILは一般的にターゲットに依存しない

Xcode7以降ではデフォルトでBuild OptionsのEnable BitcodeがYesになっているため Archive時にbitcodeが埋め込まれる。これを提出するとAppleがコンパイルして最適化してくれるのでアプリサイズが減る。 アプリにbitcodeを埋め込む場合、依存フレームワークにもbitcodeが埋め込まれている必要があるが、 Xcodeのバージョンがフレームワークのビルドに使われたバージョンより古いと'Invalid bitcode version (Producer: 'xxx' Reader: 'yyy')'でArchiveに失敗することがある。

参考

Swiftから透けて見えるAppleのコンパイラ技術 (1/2):CodeZine(コードジン)

「LLVM bitcode はポータブルでない」ってどういう意味なの? - Qiita

What is app thinning? (iOS, tvOS, watchOS) - Xcode Help