# HG changeset patch # User Kaito Tokumori # Date 1383731282 -32400 # Node ID ba51bba6ce3ab20843b7dde598ccadea827194cf # Parent 29901d3f319d3f95b20ca67461b1e569a6d270c6 complete diff -r 29901d3f319d -r ba51bba6ce3a 2013_mid.tex --- a/2013_mid.tex Wed Nov 06 18:10:16 2013 +0900 +++ b/2013_mid.tex Wed Nov 06 18:48:02 2013 +0900 @@ -65,34 +65,34 @@ clang は C, C++, Objective-C, Objective-C++ のコンパイラのフロントエンドであり, LLVM をバックエンドとして利用する. つまりLLVM と clang を組み合わせることで, C, C++, Objective-C, Objective-C++ のコンパイラが実現される. \subsection{``\_\_code''のパース} -``\_\_code''型をコンパイラに認識させるために, 予約語に登録する必要がある. 予約語は clang/include/clang/Basic/TokenKinds.def で登録する. 登録する予約語が C , あるいは C++ のどの規格で使用されるものかもここで記述し, これにより clang のパーサーが``\_\_code''を``kw\_\_\_code''として認識するようになる. +``\_\_code''型をコンパイラに認識させるために, 予約語に登録する必要がある. \\予約語は clang/include/clang/Basic/TokenKinds.def で登録する. 登録する予約語が C , あるいは C++ のどの規格で使用されるものかもここで記述し, これにより clang のパーサーが``\_\_code''を``kw\_\_\_code''として認識するようになる. \subsection{goto シンタックスの追加} 通常の goto シンタックスに加え, CbC ではコードセグメントへ移動するためのシンタックスが必要である. ``goto''が読み込まれた時の処理は clang/lib/Parse/ParseStmt.cpp で行われるのでここを書き換えた. \subsection{軽量継続の実装} -軽量継続の実装は Tail Call Elimination (末尾除去) の強制によって実現する. Tail Call Elimination が行われると関数を呼び出す際に call ではなく jmp 命令を用いて移動するようになる. Tail Call Elimination が行われるのは関数呼び出しの直後に処理が残っていない場合であり, その場合, 呼び出し元の関数に戻る必要がないので jmp 命令を用いて移動することが可能なのである. +軽量継続の実装は Tail Call Elimination (以下TCE) の強制によって実現する. TCE が行われると関数を呼び出す際に call ではなく jmp 命令を用いて移動するようになる. TCE が行われるのは関数呼び出しの直後に処理が残っていない場合であり, その場合, 呼び出し元の関数に戻る必要がないので jmp 命令を用いて移動することが可能なのである. -\subsection{Tail Call Elimination の強制} -LLVM で Tail Call Elimination を行うためには, 関数に Tail Call Flag を set したうえで複数の条件をクリアしなければならない. +\subsection{Tail Call Elimination (TCE) の強制} +LLVM で TCE を行うためには, 関数に Tail Call Flag を set したうえで複数の条件をクリアしなければならない. まず, Tail Call Flag を set する処理であるが, これは TailCallElim という Pass によって行われる. 通常この Pass は optimize level が 2 以上の場合にのみ有効化されるが, コード内に``\_\_code''が含まれる場合にはこの Pass を有効化し, コードセグメントに対してのみ処理を行うように改変した. -次に条件をクリアする方法を述べる. Tail Call Elimination 対象の関数は呼び出し直後に return 文があり, さらに void 型でなければならないという条件がある. これらの条件を満たすために, まずコードセグメントの型を``void''で統一した. さらに, コードセグメントが呼び出された場合, 直後に return 文を挿入する処理の追加を行った. +次に条件をクリアする方法を述べる. TCE 対象の関数は呼び出し直後に return 文があり, さらに void 型でなければならないという条件がある. これらの条件を満たすために, まずコードセグメントの型を``void''で統一した. さらに, コードセグメントが呼び出された場合, 直後に return 文を挿入する処理の追加を行った. -tailcallopt オプションの有効化も Tail Call Elimination を行うために必要である. tailcallopt オプションは LLVM 内部では GuaranteedTailCallOpt という変数で管理されており, 通常コンパイルオプションで指定することで有効化される. これを, コード内に``\_\_code''が含まれる場合には自動的に有効化するように改変した. また, GuaranteedTailCallOpt が true の場合, calling convention がチェックされ, 指定されたものでない場合には Tail Call Elimination が行われない. そこでコードセグメントの calling convention を全て指定 calling convention の一つである FastCC に変更する処理を加えることで解決した. +tailcallopt オプションの有効化も TCE を行うために必要である. tailcallopt オプションは LLVM 内部では GuaranteedTailCallOpt という変数で管理されており, 通常コンパイルオプションで指定することで有効化される. これを, コード内に``\_\_code''が含まれる場合には自動的に有効化するように改変した. また, GuaranteedTailCallOpt が true の場合, calling convention がチェックされ, 指定されたものでない場合には TCE が行われない. そこでコードセグメントの calling convention を全て指定 calling convention の一つである FastCC に変更する処理を加えることで解決した. -Tail Call Elimination は可変長引数リストを持つ関数に対して行えないという制限がある. CbC では可変長引数リストの機能を利用したい場合, データセグメントを用いることになる予定である. したがってコードセグメントは可変長引数リストを用いる必要はない. 可変長引数リストを持つコードセグメントがあった場合はそれを通常の関数呼び出しに変更する. +TCE は可変長引数リストを持つ関数に対して行えないという制限がある. CbC では可変長引数リストの機能を利用したい場合, データセグメントを用いることになる予定である. したがってコードセグメントは可変長引数リストを用いる必要はない. 可変長引数リストを持つコードセグメントがあった場合はそれを通常の関数呼び出しに変更する. \subsection{環境付き継続} CbC の軽量継続と C 関数呼び出しとの違いは環境を持つか持たないかである. C の関数からコードセグメントに移る際には環境を破棄するだけで良いが, 環境を破棄したコードセグメントから環境を必要とする C に移ることは通常不可能である. これを可能にする機能が環境付き継続である. 環境付き継続は C との互換性をもたせるのに必須であるが, LLVM 版のコンパイラでは未実装の機能である. \section{現状及び今後の課題} %現在までに行った実装は, LLVM BitCode に手を加えていない. -今後は本稿で述べたとおり, 未実装である環境付き継続の実装を行う. +今後は未実装である環境付き継続の実装を行う. 環境付き継続の実装案には複数あり, 例えばGCC 版の CbC コンパイラでは内部関数を用いることで環境付き継続を実現している. この他には setjmp , longjmp を用いた実装案, Exception を用いた実装案, LLVM BitCodeを用いた実装案がある. -%また, データセグメント部分のシンタックスの考案, コンパイラへの実装も行う予定である. +また, データセグメント部分のシンタックスの考案, コンパイラへの実装も行う予定である. \begin{thebibliography}{9} \bibitem{1}与儀 健人. ``組み込み向け言語Continuation based C の GCC 上の実装''. 琉球大学 情報工学科 学位論文(修士), 2008