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">