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(コードジン)