Mercurial > hg > Papers > 2014 > kaito_sigos
changeset 26:d2398deb3e48
rewrite implementation
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 12 May 2014 22:58:06 +0900 |
parents | 9c718fe8b81d |
children | 20f6eff0779c |
files | presen/slide/s6/presen.html |
diffstat | 1 files changed, 19 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/presen/slide/s6/presen.html Mon May 12 22:49:54 2014 +0900 +++ b/presen/slide/s6/presen.html Mon May 12 22:58:06 2014 +0900 @@ -444,62 +444,49 @@ <table width='100%'> <tr><td> <ul> - <li>code segment から関数に戻るための機能. - <li>GCC 上に実装した CbC コンパイラは nested function を使用していたが clang はこの構文を受け付けない. - <li>setjmp/longjmp を用いて実装. <li>__return, __environment という二つのキーワードを利用して実現. - <li>以下のコードのように使用し, この場合 0 でなく 1 が返る. + <li>C の関数から code segment に継続した後, C 元の関数を呼び出した関数に戻るための機能. + <li>以下のコードの場合, A から継続した B は環境付き継続を用いて A の呼び出し元である main に戻る. </ul> </tr> <tr> <td style="border: double;"> <pre class='code'> -__code cs(int retval,__code(*ret)(int,void *),void *env){ +__code B(int retval,__code(*ret)(int,void *),void *env){ goto ret(n, env); } -int func (){ - goto cs(1, __return, __environment); +int A(){ + goto B(1, __return, __environment); return 0; } -int caller (){ +int main(){ int retval; - retval = func(); // retval should be 1. + retval = A(); // retval should be 1. } </pre> </tr> </table> + <ul> + <li>GCC 上に実装した CbC コンパイラは nested function を使用していたが clang はこの構文を受け付けない. + <li>setjmp/longjmp を用いて実装. + </ul> </div> <div class='slide'> <h2>環境付き継続</h2> - <p>__return, __environment の存在を確認すると以下のコードを自動生成する.</p> - <table width='100%'> - <tr> - <td>元のコード - <td>clang/LLVM 内部でのコード - </tr> + <p align='center'>自動生成されたコード</p> + <table width='80%' align='center'> <tr> <td valign='top'> <pre class='small_code'> -__code cs(int retval,__code(*ret)(int,void *),void *env){ - goto ret(n, env); -} - -int func (){ - goto cs(1, __return, __environment); - return 0; -} - </pre> - <td> - <pre class='smaller_code'> #include <setjmp.h> struct CbC_env { void *ret_p,*env; }; -__code cs(int retval,__code(*ret)(int,void *),void *env){ +__code B(int retval,__code(*ret)(int,void *),void *env){ goto ret(n, env); } @@ -508,8 +495,11 @@ longjmp((int*)(((struct CbC_env *)env)->env),1); } -int func (){ - goto code1(1, + </pre> + <td> + <pre class='small_code'> +int A(){ + goto B(1, ({ __code (*__CbC_return)(); __CbC_return = return1;