AndroidのRenderScriptのソースでLLVMをつかっているところ

きつねさんのLLVM本を読んで、LLVMのIR(中間表現。bitcodeと等価)に最適化をかけたりネイティブコードに変換するのは"Pass"として実装されていて、それらの"Pass"をたばねるのが"Passmanager"だと知りました。


(ちなみにこの本はコンパイラのことをよく知っているきつねさん用であって初心者向けではありません。)

AndroidのRenderScriptはまさにLLVMのbitcodeからネイティブコードへのコンパイルAndroid端末の中で行うのですが、それがソースコード上のどこなのかを調べました。

OpenGrokで軽く検索するとどうやら、/frameworks/compile/libbcc/lib/Core/Compiler.cppが肝で、RSCompilerはこれを継承しています。

bitcodeレベルで最適化をかけるのはここでやっています。
enum Compiler::ErrorCode Compiler::runLTO(Script &pScript)
LTO(Link Time Optimization)を行っています。

bitcodeからネイティブコードを生成するのはここでやっています。
enum Compiler::ErrorCode Compiler::runCodeGen(Script &pScript, llvm::raw_ostream &pResult)

きつねさんのLLVM本ではllvm::PassManagerBuilderについては説明がありませんでしたが、ソースをみてみるとこれはPassManagerに標準的な最適化のPassを追加してくれる便利なクラスのようです。

このCompilerというクラスはbitcodeの最適化とネイティブコード生成をつかさどる基底クラスです。LLVMを利用するとこれがこんなにすっきり書けてしまいます。RenserScript固有のややこしいことはこのサブクラスであるRSCompierでやっています。そっちは一見しただけではなにがなんだかわかりません。

ついでの情報

Android 4.4の中のChromiumはまだPNaClは入っていないようです。次のバージョンアップでは入るかな。