Mercurial > hg > Papers > 2011 > nobu-prosym
changeset 60:a21d16da431a
modify addition of goto syntax
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 26 Dec 2011 09:58:11 +0900 |
parents | 6ef99d3e66b2 |
children | 2c543a47737b |
files | presen/index.html |
diffstat | 1 files changed, 48 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/presen/index.html Mon Dec 26 08:24:23 2011 +0900 +++ b/presen/index.html Mon Dec 26 09:58:11 2011 +0900 @@ -141,23 +141,23 @@ <li>命令に必要なデータ</li> <li>スタックに積まれている値(環境)</li> </ul> - <li>CbCの継続(軽量継続)</li> + </div> + <!-- PAGE --> + <div class="slide"> + <h1>Continuation Based C (軽量継続)</h1> + <h2>CbCの継続(軽量継続)</h2> + <li>関数コールが無い -> 呼び出し元への復帰がない</li> <ul> <li>Cの継続から環境を除外</li> <li>続く命令とその命令に必要なデータのみ</li> </ul> - </div> - <div class="slide"> - <h1>Continuation Based C (軽量継続)</h1> - <li>関数コールが無い -> 呼び出し元への復帰がない</li> - <li>継続の際にスタックに載せるデータはコードセグメントへの引数だけとなる。</li> +<!-- <li>継続の際にスタックに載せるデータはコードセグメントへの引数だけとなる。</li> --> <!-- <li>スタックポインタの位置を変えずにすむ。</li> --> <p style=" margin-right:auto; margin-left:auto;"> <img class="scale" src="./pix/cs_stack.png" style="height: 7em;"> </p> </div> <!-- PAGE --> - <!-- PAGE --> <div class="slide"> <h1>Continuation based C </h1> <small> @@ -197,16 +197,14 @@ </tr> </table> </small> - </div> - <!-- PAGE --> - <div class="slide"> - <h1>Continuation Based C</h1> - <li></li> + <li>__code キーワードによるコードセグメントの宣言</li> + <li>goto によるコードセグメントへの継続(Cの関数呼び出しと同等)</li> </div> <!-- PAGE --> <div class="slide"> <h1>GCC によるコンパイル</h1> <li>GCC についての簡単な説明を行う...</li> + <li>TODO: NEXT_PASS() の把握</li> <img src="./pix/ir.png" style="height: 6em;"> <li>CbCの実装は主に Parser の部分と RTL を生成する部分に行われる。</li> </div> @@ -218,34 +216,56 @@ <li>fastcall属性の付与</li> <li>Tail Call Elimination</li> <li>環境付き継続</li> + <li>__rectype の実装</li> </ul> </div> <!-- PAGE --> <div class="slide"> - <h1>シンタックスの追加</h1> + <h1>CbCの実装:シンタックスの追加</h1> <ul> - <li>__code でコードセグメントの宣言</li> - <li>goto にコードセグメントへの継続処理を追加</li> + <li>__code キーワードでのコードセグメントの宣言</li> + <ul> + <li>__code 用idとkeywordを作成。</li> + <li>戻り値が無い為、コードセグメントは void 型の関数で作成される木と同じ木が作られる。</li> + </ul> + <li>goto によるコードセグメントへの継続</li> + <ul> + <li>通常の goto に加え、コードセグメントを呼び出す処理を追加。</li> + <li>コードセグメントへのgoto後は、 return の処理を自動で追加。</li> + </ul> </ul> - <li></li> + <li class="incremental">gotoシンタックスの追加部分のソースは次のようになる。</li> </div> <!-- PAGE --> <div class="slide"> - <h1>シンタックスの追加</h1> - <h2>__code でコードセグメントの宣言</h2> - <ul> - <li>__code 用idとkeywordを作成。</li> - <li>戻り値が無い為、コードセグメントは void 型の関数で作成される木と同じ木が作られる。</li> - </ul> + <h1>CbCの実装:シンタックスの追加</h1> + <h2>gotoシンタックスの追加</h2> + <small> + <pre> +expr = c_parser_expr_no_commas (parser, NULL); +if (TREE_CODE(expr.value) == CALL_EXPR ) + { + location_t loc = c_parser_peek_token (parser)->location; + cbc_replace_arguments (loc, expr.value); + + TREE_TYPE(expr.value) = void_type_node; + /*tree env = NULL_TREE;**/ + CbC_IS_CbC_GOTO (expr.value) = 1; + CALL_EXPR_TAILCALL (expr.value) = 1; + add_stmt(expr.value); + stmt = c_finish_return(loc, NULL_TREE, NULL_TREE); /* stmt = c_finish_return (0); */ + } + </pre> + </small> + <li>CALL_EXPR_TAILCALLマクロにより tail call フラグを立てている。</li> + <li>cbc_replace_arguments関数は引数のデータを一時的な変数へと代入させる関数</li> + <li>最後にc_finish_return関数によりreturn文を生成している。</li> </div> <!-- PAGE --> <div class="slide"> - <h1>シンタックスの追加</h1> + <h1>CbCの実装:シンタックスの追加</h1> <h2>goto シンタックスの追加</h2> - <ul> - <li>通常の goto に加え、コードセグメントを呼び出す処理を追加。</li> - <li>コードセグメントへのgoto後は、 return の処理を自動で追加。</li> - </ul> + <li>最後にリターン文を生成することにより、次へと制御を映させず。また末尾最適化がかかるようになる。</li> <table border=1 width=100%> <tr class="center"> <small> @@ -267,6 +287,7 @@ </td> </tr> </table> + <li>末尾最適化(末尾除去)については後ほど詳しく説明する。</li> </div> <!-- PAGE --> <div class="slide">