Mercurial > hg > Papers > 2011 > nobu-prosym
changeset 78:6465e96ba272
modify explanation of continuation with environment
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 04 Jan 2012 17:12:52 +0900 |
parents | 2697e09f6ce9 |
children | d53237223e13 |
files | presen/index.html |
diffstat | 1 files changed, 79 insertions(+), 131 deletions(-) [+] |
line wrap: on
line diff
--- a/presen/index.html Tue Jan 03 22:11:32 2012 +0900 +++ b/presen/index.html Wed Jan 04 17:12:52 2012 +0900 @@ -504,45 +504,23 @@ </div> <!-- PAGE --> <div class="slide"> - <h1>CbCの実装:TCE(末尾除去)の動作</h1> - <li>スタック:呼び出し元関数と同じ範囲を使うことになる。</li> - <table width=100% border=1> - <td> - <p class="center"> - <img src="./pix/tce.png" style="height: 6em;"> - </p> - </td> - <td> - <ul> - <li><small>func_bの引数はfunc_aのスタックに上書する</small></li> - <li><small>func_bの為にスタックポインタは伸ばされない</small></li> - </ul> - </td> - </table> - <li class="incremental">CbCにおけるコードセグメントへの継続はこのTCEを用いて実装されている。</li> - <li class="incremental">TCEにかかるには条件が幾つかある。</li> - </div> - <!-- PAGE --> - <div class="slide"> <h1>CbCの実装:TCE(末尾除去)</h1> + <ul> <li>TCEにかかる条件</li> - <ol> + <ul> <li>caller側とcallee側の戻値の型の一致している。</li> <li>関数呼び出しがリターン直前に行われている。</li> <li>呼出先関数の引数に用いられるスタックサイズが呼出元のそれより少ない。</li> <li>引数の並びのコピーに上書きがない。</li> - </ol> - </div> - <!-- PAGE --> - <div class="slide"> - <h1>CbCの実装:TCE(末尾除去)</h1> - <li>条件を回避する為以下の実装にする。</li> - <ol> + </ul> + <li class="incremental">条件を回避する為以下の実装にする。</li> + <ul class="incremental"> <li>型はvoid型で統一する。</li> <li>gotoの直後にreturnを置く。</li> <li>スタックサイズは固定にする。</li> <li>引数は一旦、一時変数にコピーする。</li> - </ol> + </ul> + </ul> </div> <!-- PAGE --> <div class="slide"> @@ -564,37 +542,6 @@ </div> <!-- PAGE --> -<!-- - <div class="slide"> - <h1>CbCの実装:TCE</h1> - <li>TCEにかかる条件</li> - <ul> - <li>try_tail_callフラグを落とさせない。</li> - </ul> - <li></li> - </div> ---> - <!-- PAGE --> - <div class="slide"> - <h1>CbCの実装:TCE(末尾除去)</h1> - <li>try_tail_callフラグが落とされる部分</li> - <table width=100%> - <tr class="srctr"> - <td> - <pre class="srcbox"> - if (currently_expanding_call++ != 0 - || ((!fndecl || !CbC_IS_CODE_SEGMENT (TREE_TYPE (fndecl))) - && !flag_optimize_sibling_calls) - || args_size.var - || dbg_cnt (tail_call) == false) - try_tail_call = 0; - </pre> - </td> - </tr> - </table> - <li><string>!CbC_IS_CODE_SEGMENT (TREE_TYPE (fndecl)により条件を回避</string></li> - </div> - <!-- PAGE --> <div class="slide"> <h1>CbCの実装:TCE(末尾除去)</h1> <li>try_tail_callフラグが落とされる部分</li> @@ -602,6 +549,16 @@ <tr class="srctr"> <td class="srctd"> <pre class="srcbox"> + + if (currently_expanding_call++ != 0 + || ((!fndecl || !CbC_IS_CODE_SEGMENT (TREE_TYPE (fndecl))) + && !flag_optimize_sibling_calls) + || args_size.var + || dbg_cnt (tail_call) == false) + try_tail_call = 0; + + : + if ( #ifdef HAVE_sibcall_epilogue !HAVE_sibcall_epilogue @@ -627,20 +584,9 @@ crtl->args.size)) || !lang_hooks.decls.ok_for_sibcall (fndecl)) try_tail_call = 0; - </pre> - </td> - </tr> - </table> - <li><small>引数のスタックサイズ、関数の型のチェックが行われる。</small></li> - </div> - <!-- PAGE --> - <div class="slide"> - <h1>CbCの実装:TCE(末尾除去)</h1> - <li>try_tail_callフラグが落とされる部分</li> - <table width=100% > - <tr class="srctr"> - <td class="srctd"> - <pre class="srcbox" style=""> + + : + /* Check if caller and callee disagree in promotion of function return value. */ #ifndef noCbC @@ -676,10 +622,10 @@ try_tail_call = 0; } </pre> - </td> + </td> </tr> </table> - <li>関数の型のチェックが行われる。</li> + <li><string>!CbC_IS_CODE_SEGMENT (TREE_TYPE (fndecl)により条件を回避</string></li> </div> <!-- PAGE --> <div class="slide"> @@ -786,10 +732,10 @@ <h1>CbCの実装:引数渡し</h1> <ul> <li>fastcall属性の付与によりMicro-C版に速度で勝るようになった。</li> - <li></li> </ul> + <br> <table width=100% border=1 class="center"> - <caption>引数渡しに使われるレジスタの数(gcc)</caption> + <caption><small>引数渡しに使われるレジスタの数(gcc)</small></caption> <tr> <td>arch</td> <td>int(整数型)</td> @@ -959,64 +905,59 @@ <!-- PAGE --> <div class="slide"> <h1>環境付き継続:実装の問題</h1> + <li>重要な部分</li> <ul> - <li>リターンするretval変数が重要になってくる。</li> - <li>retval変数のデータをどうやって確保するか。</li> + <li>リターンするretval変数のメモリ確保</li> </ul> <li>次の方法が考えられる。</li> <ul> <li>クロージャでの確保</li> <li>staticでの確保</li> + <li>setjmpを用いての実装</li> <li>static thread local storage(tls)を用いての確保</li> + <li>戻り値を入れるレジスタを明示的に指定</li> </ul> </div> <!-- PAGE --> <div class="slide"> <h1>環境付き継続:実装の問題</h1> <ul> - <li>クロージャでの実装の問題点:</li> -<!-- - <ul><li>クロージャにしてスタックに値を確保する。</li></ul> ---> - <ul> - <li >CbCでは継続によりスタックの値は破棄されていく。</li> - <li >クロージャにしたコードが破棄される可能性がある。</li> - </ul> - <br> - <li>staticでの実装の問題点:</li> -<!-- - <ul><li>静的に値を確保することでスタック破棄の影響を受けない。</li></ul> ---> - <ul> - <li >マルチスレッドのプログラムに対応できない。</li> - <li >値を返し切る前に別スレッドによって値が書き換えられる可能性がある。</li> - </ul> + <li>クロージャでの実装の問題点:</li> + <!-- <ul><li>クロージャにしてスタックに値を確保する。</li></ul> --> + <ul> + <li >CbCでは継続によりスタックの値は破棄されていく。</li> + <li >クロージャにしたコードが破棄される可能性がある。</li> + </ul> + + <li>staticでの実装の問題点:</li> + <!-- <ul><li>静的に値を確保することでスタック破棄の影響を受けない。</li></ul> --> + <ul> + <li >マルチスレッドのプログラムに対応できない。</li> + <li >値を返し切る前に別スレッドによって値が書き換えられる可能性がある。</li> + </ul> + + <li>setjmpでの実装</li> + <ul> + <li>setjmpを行うTreeを生成するのが少し手間になる。</li> + <li>int型の戻値しか得られない。</li> + </ul> </ul> </div> <!-- PAGE --> <div class="slide"> <h1>環境付き継続:実装の問題</h1> - <li>static tlsでの実装</li> <ul> - <li>スレッド毎に静的に値を確保する。</li> - </ul> + <li>static tlsでの実装</li> + <!-- <ul> <li>スレッド毎に静的に値を確保する。</li></ul>--> + <ul> <li>現在はこの方法で実装を行なっている。</li> <li>しかし、最適化にかけると正しい値が返ってこない。 <br>(最適化によりコードが削除されている...?)</li> - </div> - <!-- PAGE --> - <div class="slide"> - <h1>環境付き継続:その他の実装方法</h1> + </ul> + <li>戻値を入れるレジスタを明示的に指定する。</li> <ul> - <li>setjmpでの実装</li> - <ul> - <li>setjmpを行うTreeを生成するのが少し手間になる。</li> - <li>int型の戻値しか得られない。</li> - </ul> - <li>戻値を入れるレジスタを明示的に指定する。</li> - <ul> - <li>まだ実装を試していない。</li> - </ul> + <li>まだ実装を試していない。</li> + </ul> </ul> </div> <!-- PAGE --> @@ -1056,40 +997,47 @@ </ul> <li>llvmへのCbCの実装</li> </ul> - <li>ご清聴ありがとうございました。</li> + <br> + <h2 class="incremental" style="font-weight: bold;">ご清聴ありがとうございました。</h2> </div> <!-- PAGE --> <div class="slide"> + <h1>CbCの実装:TCE(末尾除去)の動作</h1> + <li>スタック:呼び出し元関数と同じ範囲を使うことになる。</li> + <table width=100% border=1> + <td> + <p class="center"> + <img src="./pix/tce.png" style="height: 6em;"> + </p> + </td> + <td> + <ul> + <li><small>func_bの引数はfunc_aのスタックに上書する</small></li> + <li><small>func_bの為にスタックポインタは伸ばされない</small></li> + </ul> + </td> + </table> + <li>CbCにおけるコードセグメントへの継続はこのTCEを用いて実装されている。</li> + </div> + <!-- PAGE --> + <div class="slide"> <h1>CbCの機能の拡張:__rectype の実装</h1> + <ul> <li>通常、関数の引数に関数ポインタを渡した際は以下の様に使われる。</li> - <small> - <pre> + <pre style="font-size:28px;"> void factorial(int n, int result, void(*print)()){ : (*print)(n,result,print,exit1, envp); } </pre> - </small> - <li>以下の様に引数に()をつけて受けてることをやめたい。</li> - <small> - <pre> -void factorial(int n, int result, void *print){ - : - void(*print)(n,result,print,exit1, envp); -} - </pre> -</small> - </div> - <!-- PAGE --> - <div class="slide"> - <h1>CbCの機能の拡張:__rectype の実装</h1> <li>そこで、__rectype という予約後を作り、以下の宣言を行えるようにした。</li> - <pre> + <pre style="font-size:28px;"> __code factorial(int n, int result, __rectype *print) { : goto (*print)(n,result,print,exit1, envp); } </pre> + </ul> </div> <!-- PAGE --> <div class="slide">