Mercurial > hg > Papers > 2011 > nobu-prosym
annotate presen/index.html~ @ 86:a6135031ce35 default tip
modify
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 07 Jan 2012 17:43:09 +0900 |
parents | 7ed352ddae10 |
children |
rev | line source |
---|---|
54 | 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" |
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |
3 | |
4 <html xmlns="http://www.w3.org/1999/xhtml"> | |
5 | |
6 <head> | |
80 | 7 <style type="text/css"> |
8 tr.srctr { | |
9 font-size:28px; | |
10 } | |
11 td.srctd { | |
12 height:17em; | |
13 } | |
14 pre.srcbox { | |
15 height: 100%; | |
16 overflow: scroll; | |
17 } | |
18 .src{ | |
19 overflow: scroll; | |
20 width: 90%; | |
21 height: 60%; | |
22 } | |
54 | 23 .center { |
24 margin-left: auto; | |
25 margin-right: auto; | |
26 text-align: center; | |
27 } | |
28 .textcenter { | |
29 text-align: center; | |
30 } | |
31 .taninaritop { | |
32 margin: auto; | |
33 width: 95%; | |
34 font-weight: bold; | |
35 } | |
36 </style> | |
80 | 37 <title>2012/ 1/ 7</title> |
54 | 38 <!-- metadata --> |
39 <meta name="generator" content="S5" /> | |
40 <meta name="version" content="S5 1.1" /> | |
80 | 41 <meta name="presdate" content="20120107" /> |
54 | 42 <meta name="author" content="Nobuyasu Oshiro" /> |
43 <meta name="company" content="University of the Ryukyu" /> | |
44 <!-- meta temporary --> | |
45 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> | |
46 <meta http-equiv="Content-Script-Type" content="text/javascript" /> | |
47 <meta http-equiv="Content-Style-Type" content="text/css" /> | |
48 <!-- configuration parameters --> | |
49 <meta name="defaultView" content="slideshow" /> | |
50 <meta name="controlVis" content="hidden" /> | |
51 <!-- configuration extensions --> | |
52 <meta name="tranSitions" content="true" /> | |
53 <meta name="fadeDuration" content="500" /> | |
54 <meta name="incrDuration" content="250" /> | |
55 <!-- configuration autoplay extension --> | |
56 <meta name="autoMatic" content="false" /> | |
57 <meta name="playLoop" content="true" /> | |
58 <meta name="playDelay" content="10" /> | |
59 <!-- configuration audio extension --> | |
60 <meta name="audioSupport" content="false" /> | |
61 <meta name="audioVolume" content="100" /> | |
62 <meta name="audioError" content="false" /> | |
63 <!-- configuration audio debug --> | |
64 <meta name="audioDebug" content="false" /> | |
65 <!-- style sheet links --> | |
66 <link rel="stylesheet" href="ui/default_utf/slides.css" type="text/css" media="projection" id="slideProj" /> | |
67 <link rel="stylesheet" href="ui/default_utf/outline.css" type="text/css" media="screen" id="outlineStyle" /> | |
68 <link rel="stylesheet" href="ui/default_utf/print.css" type="text/css" media="print" id="slidePrint" /> | |
69 <link rel="stylesheet" href="ui/default_utf/opera.css" type="text/css" media="projection" id="operaFix" /> | |
70 <!-- embedded styles --> | |
71 <style type="text/css" media="all"> | |
72 .imgcon {width: 100%; margin: 0 auto; padding: 0; text-align: center;} | |
73 #anim {width: 33%; height: 320px; position: relative;} | |
74 #anim img {position: absolute; top: 0px; left: 0px;} | |
75 </style> | |
76 <!-- S5 JS --> | |
77 <script src="ui/default_utf/slides.js" type="text/javascript"></script> | |
78 </head> | |
79 <body> | |
80 | |
81 <div class="layout"> | |
82 <div id="controls"><!-- DO NOT EDIT --></div> | |
83 <div id="currentSlide"><!-- DO NOT EDIT --></div> | |
84 <div id="header"></div> | |
85 <div id="footer"> | |
80 | 86 <h1>プログラミングシンポジウム: 2012/ 1/ 7</h1> |
54 | 87 <h2>並列信頼研</h2> |
88 </div> | |
89 </div> | |
90 | |
91 <div class="presentation"> | |
92 | |
93 <div class="slide"> | |
94 <h1>Continuation based Cの GCC 4.6 上の実装について</li> | |
95 <h3></h3> | |
96 <li>大城 信康</li> | |
97 <h4><a href="http://ie.u-ryukyu.ac.jp/" rel="external">琉球大学 並列信頼研究室</a></h4> | |
98 <div class="handout"></div> | |
99 </div> | |
100 <!-- PAGE --> | |
101 <div class="slide"> | |
102 <h1>目的と背景(1)</h1> | |
80 | 103 <li>当研究室ではコードセグメント単位で記述するプログラミング言語Continuation based C (以下CbC)を開発している。</li> |
54 | 104 <li>コードセグメントは並列実行の単位として使うことができ、プログラムの正しさを示す単位としても使用することができる。</li> |
80 | 105 <li>Many Core での並列実行を高い性能と高い信頼性で実現することができると考えている。</li> |
54 | 106 </div> |
107 <!-- PAGE --> | |
108 <div class="slide"> | |
109 <h1>目的と背景(2)</h1> | |
83 | 110 <li>CbCのコンパイラは2001年に Micro-C版、2008年にはGCC-4.2をベースとしたコンパイラが開発された。</li> |
111 <li>GCC上のCbCコンパイラは、GCCで修正・追加されていく最適化の機能を使用する為に、アップデートに合わせ変更する必要がある。</li> | |
112 <li>本研究ではCbCコンパイラをGCC-4.6へとアップデートを行った。 </li> | |
80 | 113 </div> |
114 <!-- PAGE --> | |
85
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
115 <!-- |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
116 <div class=""> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
117 <h1>先行研究</h1> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
118 <li>Continuation based c コン パイラの gcc-4.2 による実装</li> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
119 <li></li> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
120 </div> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
121 --> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
122 <!-- PAGE --> |
80 | 123 <div class="slide"> |
124 <h1>発表内容</h1> | |
125 <ol> | |
126 <li>CbC の紹介</li> | |
127 <li>GCC でのコンパイルの流れ</li> | |
128 <font color="red"> | |
129 <li>CbC の実装</li> | |
130 </font> | |
131 <li>Micro-C との性能比較</li> | |
132 <li>まとめ</li> | |
133 <ol> | |
134 </div> | |
135 <!-- PAGE --> | |
136 <div class="slide"> | |
137 <h1>Continuation based C </h1> | |
138 <h2>コードセグメント単位での記述と継続を基本としたプログラミング言語。</h2> | |
139 <ul> | |
140 <li>コードセグメント:CbCにおけるプログラムの基本単位</li> | |
141 <ul> | |
83 | 142 <li>Cから関数コールとループ制御が取り除かれた形</li> |
80 | 143 <li>C の関数よりも細かい単位になる。</li> |
144 <li>コードセグメントの末尾処理で別のコードセグメントへ継続(goto)することでCbCのプログラムは続いていく。</li> | |
145 </ul> | |
146 <p class="center"> | |
147 <img src="./pix/codesegment.png" style="height:6em;"> | |
148 </p> | |
149 </ul> | |
150 </div> | |
151 <!-- PAGE --> | |
152 <div class="slide"> | |
153 <h1>Continuation based C </h1> | |
154 <h2>継続:現在の処理を実行していく為の情報</h2> | |
155 | |
156 <table width=100% border=1> | |
157 <tr> | |
158 <td><small>Cの継続</small></td> | |
159 <td><small>CbCの継続(軽量継続)</small></td> | |
160 </tr> | |
161 <tr style="font-size:30px"> | |
162 <td> | |
163 <ul> | |
164 <li>続く命令のアドレス</li> | |
165 <li>命令に必要なデータ</li> | |
166 <li>スタックに積まれている値(環境)</li> | |
167 </ul> | |
168 </td> | |
169 <td> | |
170 <ul> | |
171 <li>Cの継続から環境を除外</li> | |
172 <li>続く命令とその命令に必要なデータのみ</li> | |
173 </ul> | |
174 </td> | |
175 </tr> | |
176 <tr> | |
177 <td style="margin-left:auto; margin-right: auto; text-align: center;"> | |
178 <img class="scale" src="./pix/func_call.png" style="height: 6em;"> | |
179 </td> | |
180 <td style="margin-left:auto; margin-right: auto; text-align: center;"> | |
181 <img class="scale" src="./pix/cs_stack.png" style="height: 6em;"> | |
182 </td> | |
183 </tr> | |
184 </table> | |
185 <li>コードセグメントへの継続はcallではなくjmp命令で行われる</li> | |
186 </div> | |
187 <!-- PAGE --> | |
188 <div class="slide"> | |
189 <h1>Continuation based C </h1> | |
190 <table width=100% border=1> | |
191 <caption><small>階乗を求めるCbCのプログラム</small></caption> | |
192 <tr class="srctr"> | |
193 <td width=50%> | |
194 <pre class="srcbox"> | |
195 | |
196 __code print_factorial(int prod) { | |
197 printf("factorial = %d\n",prod); | |
198 exit(0); | |
199 } | |
200 | |
201 __code factorial0(int prod, int x) { | |
202 if ( x >= 1) { | |
203 goto factorial0(prod*x, x-1); | |
204 }else{ | |
205 goto print_factorial(prod); | |
206 } | |
207 } | |
208 </pre> | |
209 </td> | |
210 <td> | |
211 <pre class="srcbox"> | |
212 | |
213 __code factorial(int x) { | |
214 goto factorial0(1, x); | |
215 } | |
216 | |
217 int main(int argc, char **argv) { | |
218 int i; | |
219 i = atoi(argv[1]); | |
220 goto factorial(i); | |
221 return 0; | |
222 } | |
223 </pre> | |
224 </td> | |
225 </tr> | |
226 </table> | |
227 <ul> | |
228 <li><small>__code キーワードによるコードセグメントの宣言</small></li> | |
229 <li><small>goto によるコードセグメントへの継続(Cの関数呼び出しと同等)</small></li> | |
230 </ul> | |
231 <li class="incremental"><small>以上がCbCについての紹介となる。</small></li> | |
54 | 232 </div> |
233 <!-- PAGE --> | |
234 <div class="slide"> | |
80 | 235 <h1>GCC</h1> |
83 | 236 <li>GCC:Gnu Compiler Collection</li> |
80 | 237 <ul> |
83 | 238 <li><small>GCCの中でも変更を加えた部分はソースコードをアセンブラに変換するcc1になる。</small></li> |
239 <li><small>cc1ではアセンブラ言語を出力するまでに読み込まれたソースコードは次の4つの中間言語へと変換される。</small></li> | |
80 | 240 <ul> |
241 <li>Generic Tree</li> | |
242 <li>GIMPLE</li> | |
243 <li>Tree SSA</li> | |
244 <li>RTL</li> | |
245 </ul> | |
83 | 246 <!-- |
80 | 247 <li class="incremental">CbCの実装においてはGeneric Tree生成部分とRTLへの変換部分に修正が加えられている。</li> |
83 | 248 --> |
80 | 249 <li class="incremental">Generic Tree生成部分について詳しく触れてみる。</li> |
250 </ul> | |
251 </div> | |
252 <!-- PAGE --> | |
253 <!-- | |
254 <div class="slide"> | |
255 <h1>GCC:Generic Tree</h1> | |
256 <li>Generic Treeではソースコードの内容が FUNCTION_TYPE, CALL_EXPR, MODIFY_EXPR 等と言った形で表される。</li> | |
257 <table class="center" width=100% border=1> | |
258 <tr> | |
259 <td></td> | |
260 <td><small>値の代入:MODIFY_EXPR</small></td> | |
261 <td><small>関数呼び出し:CALL_EXPR</small></td> | |
262 </t> | |
263 <tr> | |
264 <td>命令</td> | |
265 <td>b = a * 10</td> | |
266 <td>func(a,10)</td> | |
267 </t> | |
268 <tr> | |
269 <td><small>Generic<br>Tree</small></td> | |
270 <td> | |
271 <img src="./pix/MODIFY_EXPR.png" style="height: 6em;"> | |
272 </td> | |
273 <td> | |
274 <img src="./pix/CALL_EXPR.png" style="height: 7em;"> | |
275 </td> | |
276 </tr> | |
277 </table> | |
278 <p class="center"><small>Generic Treeでの表現</small></p> | |
279 </div> | |
280 --> | |
281 <!-- PAGE --> | |
282 <div class="slide"> | |
283 <h1>GCC:Generic Tree</h1> | |
83 | 284 <li><small>CALL_EXPRE、MODIFY_EXPR、RETURN_EXPR等といった表現で扱われる。</small></li> |
80 | 285 <table width=100% border=1> |
286 <tr> | |
287 <td class="center"><small>ソースコード</small></td> | |
288 <td class="center"><small>Generic Treeでの表現</small></td> | |
289 </tr> | |
290 <tr> | |
291 <td> | |
292 <small> | |
293 <pre> | |
294 int main() { | |
295 int a, b; | |
296 a = 3; | |
297 b = func(a, 10); | |
298 return b; | |
299 } | |
300 </pre> | |
301 </small> | |
302 </td> | |
303 <td style="margin-left:auto; margin-right:auto; text-align: center;"> | |
304 <img src="./pix/STATEMENT_LIST.png" style="height: 7em;"> | |
305 </td> | |
306 </tr> | |
307 </table> | |
308 <li class="incremental">CbCの実装においてこのGeneric Treeの生成を意識していくことになる。</li> | |
309 </div> | |
310 <!-- PAGE --> | |
311 <!-- | |
312 <div class="slide"> | |
313 <h1>GCC</h1> | |
314 <li>GCC についての簡単な説明を行う...</li> | |
315 <li>TODO: NEXT_PASS() の把握</li> | |
316 <img src="./pix/ir.png" style="height: 6em;"> | |
317 <li>CbCの実装は主に Parser の部分と RTL を生成する部分に行われる。</li> | |
318 </div> | |
319 --> | |
320 <!-- PAGE --> | |
321 <div class="slide"> | |
322 <h1>CbCの実装</h1> | |
323 <ul> | |
324 <li>シンタックスの追加</li> | |
83 | 325 <li>継続処理の実装</li> |
326 <!-- | |
80 | 327 <li>末尾除去:Tail Call Elimination(TCE)</li> |
83 | 328 --> |
80 | 329 <li>レジスタによる引数渡し(fastcall属性の付与)</li> |
330 <li>環境付き継続</li> | |
331 </ul> | |
332 </div> | |
333 <!-- PAGE --> | |
334 <div class="slide"> | |
335 <h1>CbCの実装:__codeシンタックスの追加</h1> | |
54 | 336 <ul> |
80 | 337 <li>__code キーワードでのコードセグメントの宣言</li> |
338 <ul> | |
339 <li>__code 用idとkeywordを作成。</li> | |
83 | 340 <li>通常の関数作成と基本同じだが、コードセグメント判定用のフラグを立てる。</li> |
80 | 341 </ul> |
342 </ul> | |
343 <table width=100% border=1> | |
344 <tr class="srctr"> | |
345 <td> | |
83 | 346 <pre class="srcbox" style="height:13em"> |
347 tree | |
348 build_code_segment_type (tree value_type, tree arg_types) | |
349 { | |
350 tree t; | |
351 hashval_t hashcode = 0; | |
352 | |
353 gcc_assert (TREE_CODE (value_type) == VOID_TYPE); | |
354 | |
355 /* Make a node of the sort we want. */ | |
356 t = make_node (FUNCTION_TYPE); | |
357 TREE_TYPE (t) = value_type; | |
358 TYPE_ARG_TYPES (t) = arg_types; | |
359 | |
360 CbC_IS_CODE_SEGMENT (t) = 1; | |
361 | |
362 if (!COMPLETE_TYPE_P (t)) | |
363 layout_type (t); | |
364 return t; | |
365 } | |
366 </pre> | |
367 </td> | |
368 </tr> | |
369 </table> | |
370 <li><small>コードセグメントはGCC内部では関数として扱われる。</small></li> | |
371 </div> | |
372 | |
373 <!-- SOURCE --> | |
374 <!-- | |
80 | 375 const struct c_common_resword c_common_reswords[] = |
376 { | |
377 { "_Bool", RID_BOOL, D_CONLY }, | |
378 : | |
379 { "__code", RID_CbC_CODE, 0 }, | |
83 | 380 ... |
381 | |
80 | 382 case RID_CbC_CODE: |
383 : | |
384 specs->typespec_word = cts_CbC_code; | |
83 | 385 ... |
386 | |
80 | 387 case cts_CbC_code: |
388 : | |
389 specs->type = void_type_node; | |
390 break; | |
83 | 391 --> |
392 <!--PAGE--> | |
80 | 393 <div class="slide"> |
394 <h1>CbCの実装:gotoシンタックスの追加</h1> | |
395 <li>goto によるコードセグメントへの継続</li> | |
396 <ul> | |
83 | 397 <li>通常の goto の構文にコードセグメントへ継続する処理を追加。</li> |
398 <!-- | |
80 | 399 <li>コードセグメントへのgotoの後に、returnの処理を自動で追加。</li> |
83 | 400 --> |
80 | 401 </ul> |
83 | 402 <table width=100% border=1> |
403 <tr> | |
404 <td> | |
405 <pre class="srcbox" style="font-size:25px; height:20em;" > | |
80 | 406 case RID_GOTO: |
407 c_parser_consume_token (parser); | |
408 if ( c_parser_next_token_is (parser, CPP_NAME) | |
409 && c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON ) | |
410 { | |
85
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
411 : |
80 | 412 } |
83 | 413 #ifndef noCbC |
80 | 414 else |
415 { | |
83 | 416 if (c_parser_next_token_is (parser, CPP_NAME)) |
417 { | |
418 tree id = c_parser_peek_token (parser)->value; | |
419 location_t loc = c_parser_peek_token (parser)->location; | |
420 /** build_external_ref (id,RID_CbC_CODE , loc); **/ | |
421 build_external_ref (loc, id, RID_CbC_CODE, &expr.original_type); | |
422 } | |
423 expr = c_parser_expr_no_commas (parser, NULL); | |
424 if (TREE_CODE(expr.value) == CALL_EXPR ) | |
425 { | |
426 location_t loc = c_parser_peek_token (parser)->location; | |
427 cbc_replace_arguments (loc, expr.value); | |
428 TREE_TYPE(expr.value) = void_type_node; | |
429 CbC_IS_CbC_GOTO (expr.value) = 1; | |
430 CALL_EXPR_TAILCALL (expr.value) = 1; | |
431 add_stmt(expr.value); | |
432 stmt = c_finish_return(loc, NULL_TREE, NULL_TREE); | |
433 } | |
434 else | |
435 c_parser_error (parser, "expected code segment jump or %<*%>"); | |
80 | 436 } |
83 | 437 #else |
80 | 438 </pre> |
83 | 439 </td> |
440 </tr> | |
441 </table> | |
80 | 442 </div> |
443 <!-- PAGE --> | |
444 <div class="slide"> | |
445 <h1>CbCの実装:gotoシンタックスの追加</h1> | |
446 <ul> | |
447 <small> | |
448 <li>cbc_replace_arguments関数は引数のデータを一時的な変数へ避難させる。</li> | |
449 <li>CALL_EXPR_TAILCALLマクロでtail callフラグを立てる。</li> | |
450 <li>最後にc_finish_return関数によりreturn文を生成している。</li> | |
451 </small> | |
452 </ul> | |
453 <table border=1 width=100%> | |
454 <!-- | |
455 <caption><small>return 自動生成</small></caption> | |
456 --> | |
457 <tr class="center"> | |
458 <td><small>実際のコード</small></td> | |
459 <td><small>GCC内で処理されるコード</small></td> | |
460 </tr> | |
461 <tr class="srctr"> | |
462 <td> | |
463 <pre> | |
464 | |
465 __code test() { | |
466 : | |
467 goto factorial0(1, x); | |
468 } | |
469 </pre> | |
470 </td> | |
471 <td> | |
472 <pre> | |
473 | |
474 void test() { | |
475 : | |
476 factorial0(1, x); | |
477 return; | |
478 } | |
479 </pre> | |
480 </td> | |
481 </tr> | |
482 </table> | |
483 <ul> | |
83 | 484 <li><small>これで__codeによるコードセグメントの宣言と、gotoによる関数呼び出しが行われるようになった。</small></li> |
485 <li class="incremental"><small>次に、コードセグメントへの関数呼び出しは軽量継続で行わせる処理がいる。</small></li> | |
486 <!-- | |
80 | 487 <li><small>tail callフラグを立てることで、関数呼び出しに末尾除去(末尾最適化)をかけることができる。</small></li> |
488 <li><small>最後のリターン文生成も、末尾除去にかける為に必要な処理。</small></li> | |
83 | 489 --> |
80 | 490 </ul> |
491 </div> | |
492 <!-- PAGE --> | |
493 <div class="slide"> | |
83 | 494 <h1>CbCの実装:軽量継続(末尾除去)</h1> |
495 <h2>軽量継続は<font color=red>末尾除去(Tail Call elimination)</font>によって実装される。</h2> | |
80 | 496 <ul> |
497 <li>関数呼び出しをcallではなくjmp命令で行う最適化。</li> | |
498 </ul> | |
499 <li><small>以下のソースの場合 関数g から関数f へjmp命令で処理が移る。</small></li> | |
500 <br> | |
501 <table width=100%> | |
502 <tr class="srctr"> | |
503 <td width=50%> | |
504 <!-- | |
505 <pre class="srcbox"> | |
506 int main() { | |
507 int num = a(2); | |
508 printf("main:num=%d\n",num); | |
509 return 0; | |
510 } | |
511 int a(int num) { | |
512 return b(num+5); | |
513 } | |
514 int b(int num) { | |
515 printf("b:a = %d\n",num); | |
516 return num+3; | |
517 } | |
518 </pre> | |
519 --> | |
520 <pre class="srcbox"> | |
521 | |
522 void f(int a, int b) { | |
523 printf("f: a=%d b=%d\n",a,b); | |
524 return ; | |
525 } | |
526 void g(int a, int b){ | |
527 printf("g: a=%d b=%d\n",a,b); | |
528 f(a,b); | |
529 return; | |
530 } | |
531 | |
532 int main() { | |
533 g(3,4); | |
534 return 0; | |
535 } | |
536 | |
537 </pre> | |
538 </td> | |
539 <td class="center"> | |
83 | 540 <img src="./pix/continuation.png" style="height:90%;"> |
80 | 541 </td> |
542 </tr> | |
543 </table> | |
544 </div> | |
545 <!-- PAGE --> | |
546 <div class="slide"> | |
83 | 547 <h1>CbCの実装:軽量継続(末尾除去)</h1> |
80 | 548 <ul> |
83 | 549 <li>末尾除去にかかる条件</li> |
80 | 550 <ul> |
551 <li>caller側とcallee側の戻値の型の一致している。</li> | |
552 <li>関数呼び出しがリターン直前に行われている。</li> | |
553 <li>呼出先関数の引数に用いられるスタックサイズが呼出元のそれより少ない。</li> | |
554 <li>引数の並びのコピーに上書きがない。</li> | |
555 </ul> | |
556 <li class="incremental">条件を回避する為以下の実装にする。</li> | |
557 <ul class="incremental"> | |
83 | 558 <li>コードセグメントの型はvoid型で統一する。</li> |
80 | 559 <li>gotoの直後にreturnを置く。</li> |
560 <li>スタックサイズは固定にする。</li> | |
561 <li>引数は一旦、一時変数にコピーする。</li> | |
562 </ul> | |
54 | 563 </ul> |
564 </div> | |
565 <!-- PAGE --> | |
566 <div class="slide"> | |
83 | 567 <h1>CbCの実装:軽量継続(末尾除去)</h1> |
568 <li>末尾除去の条件はexpand_call関数で調べられる。</li> | |
80 | 569 <ul> |
570 <li>expand_call関数</li> | |
54 | 571 <ul> |
85
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
572 <li>SSAへの変換を終えたGIMPLEからとり出されたCALL_EXPREのTreeからRTLを生成する関数</li> |
80 | 573 <li>スタックの領域確保、引数の格納、関数へのcall命令の発行が行わる。</li> |
85
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
574 <li>try_taill_call(局所変数)フラグがあり、末尾除去の条件に合わなければこのフラグが落とされる。</li> |
54 | 575 </ul> |
80 | 576 <li class="incremental">具体的な実装内容</li> |
577 <ul> | |
578 <li class="incremental">try_tail_callフラグを落とすif文の条件をかわすようにする。</li> | |
579 <li class="incremental">try_tail_callフラグを立たせる処理の追加。</li> | |
580 </ul> | |
581 <ul> | |
582 | |
54 | 583 </div> |
584 <!-- PAGE --> | |
585 <div class="slide"> | |
83 | 586 <h1>CbCの実装:軽量継続(末尾除去)</h1> |
85
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
587 <ul> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
588 <li><small>try_tail_callフラグを落とさせない。</small></li> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
589 <pre class="srcbox" style="font-size:28px;"> |
80 | 590 if (currently_expanding_call++ != 0 |
591 || ((!fndecl || !CbC_IS_CODE_SEGMENT (TREE_TYPE (fndecl))) | |
592 && !flag_optimize_sibling_calls) | |
593 || args_size.var | |
594 || dbg_cnt (tail_call) == false) | |
595 try_tail_call = 0; | |
596 </pre> | |
85
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
597 <ul> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
598 <!-- |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
599 <li>!CbC_IS_CODE_SEGMENT (TREE_TYPE (fndecl)により条件を回避</li> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
600 --> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
601 </ul> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
602 <li><small>try_tail_callフラグ矯正付与のソースコード</small></li> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
603 <pre class="srcbox" style="font-size:28px;"> |
80 | 604 if (fndecl && CbC_IS_CODE_SEGMENT (TREE_TYPE (fndecl)) |
605 && CbC_IS_CODE_SEGMENT (TREE_TYPE (current_function_decl)) | |
606 && try_tail_call == 0) | |
607 { | |
608 location_t loc = EXPR_LOCATION (exp); | |
609 char *name_callee = IDENTIFIER_POINTER(DECL_NAME(fndecl)); | |
610 warning_at (loc, 0, "transition to code segment \"%s\" with CbC goto, but tail call optimization was cut.", | |
611 name_callee); | |
612 try_tail_call = 1; | |
613 } | |
614 </pre> | |
54 | 615 </div> |
616 <!-- PAGE --> | |
617 <div class="slide"> | |
83 | 618 <h1>CbCの実装:軽量継続(末尾除去)の実装について</h1> |
80 | 619 <ul> |
620 <li>以前はexpand_call関数を元にしたexpand_cbc_goto関数を作り条件を回避させていた。</li> | |
621 <li>だがその方法だとexpand_call関数の修正にも合わせていく必要もあり管理も面倒であった。</li> | |
622 <li>しかしtry_tail_callフラグを落とさせない方法にすることでexpand_cbc_goto関数はいらなくなり、管理が容易くなった。</li> | |
623 </ul> | |
54 | 624 </div> |
625 <!-- PAGE --> | |
626 <!-- | |
627 <div class="slide"> | |
80 | 628 <h1>環境付き継続:論文におけるクロージャの問題の訂正</h1> |
629 <p><small>『GCC 4.6とLionの組み合わせではclosureは正しく動作してないことが分かった。』<br> | |
630 とあるが、これはCbCの実装でTCEを強制的に立てることが原因であったことを訂正させて頂きます。</small></p> | |
631 </div> | |
632 --> | |
633 <!-- PAGE --> | |
634 <div class="slide"> | |
635 <h1>CbCの実装:引数渡し</h1> | |
636 <li>GCC版コンパイラー開発当初、コンパイルしたCbCのプログラムはMicro-C版に速度面で勝てなかった。</li> | |
637 <ul> | |
638 <li class="incremental">Micro-Cでは関数呼び出しの際にできるだけレジスタを使うようにしていた。</li> | |
639 </ul> | |
640 <li class="incremental">そこで、GCC版CbCコンパイラの引数渡しもできるだけレジスタで行うことに。</li> | |
641 </div> | |
642 <!-- PAGE --> | |
643 <div class="slide"> | |
644 <h1>CbCの実装:引数渡し(fastcall)</h1> | |
645 <h2>fastcall</h2> | |
646 <ul> | |
647 <li>i386 において関数呼び出しの際、引数渡しをできるだけレジスタを用いるGCCの拡張機能。</li> | |
648 <li>関数に『__attribute__ ((fastcall))』をつけることで使えるようになる。</li> | |
649 </ul> | |
650 <li>__codeで宣言された関数は自動でfastcall属性が付与されるように以下のコードを追加。</li> | |
651 <small> | |
652 <pre> | |
653 if(!TARGET_64BIT) { | |
654 attrs = build_tree_list (get_identifier("fastcall"), NULL_TREE); | |
655 declspecs_add_attrs(specs, attrs); | |
656 } | |
657 </pre> | |
658 </small> | |
85
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
659 <p><small>Intel64 ではレジスタが増えていてfastcallの機能は標準でつくようになっている。</small></p> |
80 | 660 </div> |
661 <!-- PAGE --> | |
662 <div class="slide"> | |
663 <h1>CbCの実装:引数渡し</h1> | |
664 <ul> | |
665 <li>fastcall属性の付与によりMicro-C版に速度で勝るようになった。</li> | |
666 </ul> | |
667 <br> | |
85
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
668 <br> |
80 | 669 <table width=100% border=1 class="center"> |
670 <caption><small>引数渡しに使われるレジスタの数(gcc)</small></caption> | |
671 <tr> | |
672 <td>arch</td> | |
673 <td>int(整数型)</td> | |
674 <td>float(浮動小数点型)</td> | |
675 <td>double(浮動小数点型)</td> | |
676 </tr> | |
677 <tr> | |
678 <td>i386</td> | |
679 <td>2</td> | |
680 <td>0<br>(stackを使用)</td> | |
681 <td>0<br>(stackを使用)</td> | |
682 </tr> | |
683 <tr> | |
684 <td>x64</td> | |
685 <td>6</td> | |
686 <td>8</td> | |
687 <td>8</td> | |
688 </tr> | |
689 </table> | |
690 </div> | |
691 <!-- PAGE --> | |
692 <div class="slide"> | |
693 <h1>CbCの実装:環境付き継続</h1> | |
694 <ul> | |
695 <li>CbCにおけるCとの互換性を保つための機能。コードセグメントを呼び出したCの関数に戻ることができる。</li> | |
696 <li>__returnキーワードを引数に渡すことで使うことができる。</li> | |
697 </ul> | |
698 <li>以下の使い方の場合は1を返す。</li> | |
699 <table border=1 width=100%> | |
700 <td> | |
701 <small> | |
702 <pre class="srcbox"> | |
703 __code c1(__code ret(int,void *),void *env) { | |
704 goto ret(1,env); | |
705 } | |
706 int main() { | |
707 goto c1(__return, __environment); | |
708 } | |
709 </pre> | |
710 </small> | |
711 </td> | |
712 </table> | |
713 <p><small>__environmentキーワードは関数の環境を保持する(Micro-Cの場合)。</small></p> | |
714 </div> | |
715 <!-- PAGE --> | |
716 <div class="slide"> | |
717 <h1>CbCの実装:環境付き継続</h1> | |
718 <!-- | |
719 <li><small>生成しているコードと生成する為のコード</small></li> | |
720 --> | |
721 <table border=1 width=100%> | |
722 <tr> | |
723 <td><small>生成しているコード</small></td> | |
83 | 724 <td><small>生成するコード(GCC内部)</small></td> |
80 | 725 </tr> |
726 <tr class="srctr"> | |
727 <td width=50% class="srctd"> | |
728 <pre class="srcbox" style="width:25em;"> | |
729 | |
730 //goto c1(__return, __environment); | |
731 goto c1(({ | |
732 __label__ _cbc_exit0; | |
733 static int retval; | |
734 void _cbc_internal_return(int retval_, void *_envp) { | |
735 retval = retval_; | |
736 goto _cbc_exit0; | |
737 } | |
738 if (0) { | |
739 _cbc_exit0: | |
740 return retval; | |
741 } | |
742 _cbc_internal_return; | |
743 }), __environment); | |
744 </pre> | |
745 </td> | |
746 <td class="srctd"> | |
747 <pre class="srcbox" style="width:25em;"> | |
748 | |
749 case RID_CbC_RET: | |
750 { | |
751 tree value, stmt, label, tlab, decl; | |
752 c_parser_consume_token (parser); | |
753 | |
754 stmt = c_begin_stmt_expr (); | |
755 cbc_return_f = c_parser_peek_token (parser)->value; | |
756 location_t location = c_parser_peek_token (parser)->location; | |
757 | |
758 /* create label. (__label__ _cbc_exit0;) */ | |
759 label = get_identifier ("_cbc_exit0"); | |
760 tlab = declare_label (label); | |
761 C_DECLARED_LABEL_FLAG (tlab) = 1; | |
762 add_stmt (build_stmt (location, DECL_EXPR, tlab)); | |
763 | |
764 /* declare retval. (int retval;) */ | |
765 tree decl_cond = | |
766 build_decl (location, VAR_DECL, get_identifier ("retval"), | |
767 TREE_TYPE (TREE_TYPE (current_function_decl))); | |
768 TREE_STATIC (decl_cond) = 1; | |
769 TREE_USED (decl_cond) = 1; | |
770 | |
771 /* Use thread-local */ | |
772 DECL_TLS_MODEL (decl_cond) = decl_default_tls_model (decl_cond); | |
773 DECL_NONLOCAL (decl_cond) = 1; | |
774 add_stmt (build_stmt(location, DECL_EXPR, pushdecl (decl_cond))); | |
775 | |
776 /* define nested function. */ | |
777 decl = | |
778 cbc_finish_nested_function (location, label, decl_cond); | |
779 TREE_USED(decl) = 1; | |
780 | |
781 /* define if-ed goto label and return statement. */ | |
782 cbc_finish_labeled_goto (location, label, decl_cond); | |
783 | |
784 /* get pointer to nested function. */ | |
785 value = build_addr (decl , current_function_decl); | |
786 TREE_USED (current_function_decl) = 1; | |
787 SET_EXPR_LOCATION (value, location); | |
788 add_stmt (value); | |
789 | |
790 TREE_SIDE_EFFECTS (stmt) = 1; | |
791 expr.value = c_finish_stmt_expr (location, stmt); | |
792 expr.original_code = ERROR_MARK; | |
793 } | |
794 </pre> | |
795 </td> | |
83 | 796 </td> |
797 </tr> | |
798 </table> | |
799 <li><small>retval変数の型は継続を行った関数と同じ戻値の型となる。</small></li> | |
800 <!-- | |
801 <li class="incremental">上記のコードをGCC内で生成すると次のようなTreeができる。</li> | |
802 --> | |
803 </div> | |
804 <!-- PAGE --> | |
80 | 805 <!-- PAGE --> |
806 <div class="slide"> | |
807 <h1>環境付き継続:実装の問題</h1> | |
808 <li>重要な部分</li> | |
809 <ul> | |
810 <li>リターンするretval変数のメモリ確保</li> | |
811 </ul> | |
812 <li>次の方法が考えられる。</li> | |
813 <ul> | |
814 <li>クロージャでの確保</li> | |
815 <li>staticでの確保</li> | |
83 | 816 <li>static thread local storage(tls)を用いての確保</li> |
817 <!-- | |
80 | 818 <li>setjmpを用いての実装</li> |
819 <li>戻り値を入れるレジスタを明示的に指定</li> | |
83 | 820 --> |
80 | 821 </ul> |
822 </div> | |
823 <!-- PAGE --> | |
824 <div class="slide"> | |
825 <h1>環境付き継続:実装の問題</h1> | |
826 <ul> | |
827 <li>クロージャでの実装の問題点:</li> | |
828 <!-- <ul><li>クロージャにしてスタックに値を確保する。</li></ul> --> | |
829 <ul> | |
830 <li >CbCでは継続によりスタックの値は破棄されていく。</li> | |
831 <li >クロージャにしたコードが破棄される可能性がある。</li> | |
832 </ul> | |
833 | |
834 <li>staticでの実装の問題点:</li> | |
835 <!-- <ul><li>静的に値を確保することでスタック破棄の影響を受けない。</li></ul> --> | |
836 <ul> | |
837 <li >マルチスレッドのプログラムに対応できない。</li> | |
838 <li >値を返し切る前に別スレッドによって値が書き換えられる可能性がある。</li> | |
839 </ul> | |
83 | 840 <li class="incremental">static tlsでの実装</li> |
841 <!-- <ul> <li>スレッド毎に静的に値を確保する。</li></ul>--> | |
842 <ul class="incremental"> | |
843 <li>現在はこの方法で実装を行なっている。</li> | |
844 <li>しかし、最適化にかけると正しい値が返ってこない。 | |
845 <br>(最適化によりコードが削除されている...?)</li> | |
846 </ul> | |
847 </div> | |
848 <!-- PAGE --> | |
849 <div class="slide"> | |
850 <h1>クロージャの動作について</h1> | |
851 <li>予稿における訂正</li> | |
852 <li>『GCC 4.6 と Lion の組合せでは Closure は正しく動作していないことが分かった.』</li> | |
853 <ul> | |
854 <li>CbCの末尾除去矯正付与のせいでクロージャが破壊されていたことが判明。</li> | |
855 <li>GCC 4.6 と Lion でのクロージャは特に問題はなかった。</li> | |
856 </ul> | |
857 </div> | |
858 <!-- PAGE --> | |
859 <!-- | |
860 <div class="slide"> | |
861 <h1>環境付き継続:実装の問題</h1> | |
862 <ul> | |
863 <li>setjmpでの実装の問題点:</li> | |
80 | 864 <ul> |
865 <li>setjmpを行うTreeを生成するのが少し手間になる。</li> | |
866 <li>int型の戻値しか得られない。</li> | |
867 </ul> | |
83 | 868 |
80 | 869 </ul> |
870 <li>戻値を入れるレジスタを明示的に指定する。</li> | |
871 <ul> | |
872 <li>まだ実装を試していない。</li> | |
873 </ul> | |
874 </ul> | |
875 </div> | |
83 | 876 --> |
80 | 877 <!-- PAGE --> |
878 <div class="slide"> | |
879 <h1>Micro-Cとの比較</h1> | |
880 <table width=100% class="center"> | |
83 | 881 <caption><small>Micro-C,GCC-4.4とGCC-4.6のCbCコンパイラでコンパイルしたプログラムの実行の速度</small></caption> |
80 | 882 <td> |
83 | 883 <img src="./pix/mac_conv.png" style="height:10em"> |
80 | 884 </td> |
885 <td> | |
83 | 886 <img src="./pix/linux_conv.png" style="height:10em"> |
80 | 887 </td> |
888 </table> | |
85
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
889 <li><small>最適化無しだと、引数を全て一時変数に代入するGCCは遅い。 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
890 だが、最適化にかければ不要な代入は減りMicro-C版より早くなる。</small></li> |
80 | 891 </div> |
892 <!-- PAGE --> | |
893 <div class="slide"> | |
894 <h1>まとめ</h1> | |
895 <ul> | |
896 <li>今回GCC版CbCコンパイラのアップデートを行った。</li> | |
83 | 897 <li>末尾除去にかかる判定の部分の実装の修正を行った。 |
898 <br>それにより、以前より楽な管理ができる実装にすることができた。</li> | |
899 <li>後は環境付き継続の最適化の問題の修正とselftypeといった新しい実装を行う。</li> | |
80 | 900 <li>全ての実装を終えたらGCC版CbCコンパイラの実装はアップデートを行なっていくだけとなる。</li> |
901 </ul> | |
902 </div> | |
903 <!-- PAGE --> | |
904 <div class="slide"> | |
85
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
905 <h1>今後の課題</h1> |
80 | 906 <ul> |
907 <li>CbCを用いたプログラムの作成</li> | |
908 <ul> | |
909 <li>CbCによるタスクマネージャの作成</li> | |
910 </ul> | |
911 <li>llvmへのCbCの実装</li> | |
912 </ul> | |
913 <br> | |
914 <h2 class="incremental" style="font-weight: bold;">ご清聴ありがとうございました。</h2> | |
915 </div> | |
916 <!-- PAGE --> | |
917 <div class="slide"> | |
83 | 918 <h1>CbCの引数渡し</h1> |
919 <table border=1 width=100%> | |
920 <caption><small>fastcall属性有・無の実行速度</small></caption> | |
921 <tr class="center"> | |
922 <td width=50%><small>fastcall有り</small></td> | |
923 <td width=50%><small>fastcall無し</small></td> | |
924 </tr> | |
925 <tr class="center"> | |
926 <td> | |
927 <img src="./pix/linux_conv_fastcall.png"> | |
928 </td> | |
929 <td> | |
930 <img src="./pix/linux_conv_nofastcall.png"> | |
931 </td> | |
932 </tr> | |
933 </table> | |
934 </div> | |
935 <!-- PAGE --> | |
936 <div class="slide"> | |
937 <h1>軽量継続(末尾除去)の動作</h1> | |
80 | 938 <li>スタック:呼び出し元関数と同じ範囲を使うことになる。</li> |
939 <table width=100% border=1> | |
940 <td> | |
941 <p class="center"> | |
942 <img src="./pix/tce.png" style="height: 6em;"> | |
943 </p> | |
944 </td> | |
945 <td> | |
946 <ul> | |
947 <li><small>func_bの引数はfunc_aのスタックに上書する</small></li> | |
948 <li><small>func_bの為にスタックポインタは伸ばされない</small></li> | |
949 </ul> | |
950 </td> | |
951 </table> | |
952 </div> | |
953 <!-- PAGE --> | |
954 <div class="slide"> | |
85
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
955 <h1>call_insn</h1> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
956 <li>expand_callより作成されたRTLのTreeは以下のS式となる。</li> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
957 <pre class="srcbox" style="font-size:28px; width:45em;"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
958 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
959 (call_insn/j 18 17 19 3 (call (mem:QI (symbol_ref:DI ("factorial") [flags 0x403] <function_decl 0x1443b4400 factorial>) [0 S1 A8]) |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
960 (const_int 1024 [0x400])) factorial.cbc:30 -1 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
961 (expr_list:REG_EH_REGION (const_int 0 [0]) |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
962 (nil)) |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
963 (expr_list:REG_DEP_TRUE (use (reg:SI 5 di)) |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
964 (nil))) |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
965 </pre> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
966 <li></li> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
967 </div> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
968 <!-- PAGE --> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
969 <div class="slide"> |
83 | 970 <h1>__rectype の実装</h1> |
80 | 971 <ul> |
972 <li>通常、関数の引数に関数ポインタを渡した際は以下の様に使われる。</li> | |
973 <pre style="font-size:28px;"> | |
974 void factorial(int n, int result, void(*print)()){ | |
975 : | |
976 (*print)(n,result,print,exit1, envp); | |
977 } | |
978 </pre> | |
979 <li>そこで、__rectype という予約後を作り、以下の宣言を行えるようにした。</li> | |
980 <pre style="font-size:28px;"> | |
981 __code factorial(int n, int result, __rectype *print) { | |
982 : | |
983 goto (*print)(n,result,print,exit1, envp); | |
984 } | |
985 </pre> | |
986 </ul> | |
987 </div> | |
988 <!-- PAGE --> | |
989 <div class="slide"> | |
83 | 990 <h1>selftype</h1> |
80 | 991 <h2>selftypeの実装</h2> |
992 <li>以下の宣言が行えるようにしたい。</li> | |
993 <small> | |
994 <pre> | |
995 typedef sturct node { | |
996 selftype *left; | |
997 selftype *right; | |
998 int num; | |
999 }*NODE | |
1000 </pre> | |
1001 <p>selftype は struct node を指す。</p> | |
1002 </small> | |
54 | 1003 </div> |
1004 <!-- PAGE --> | |
85
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1005 <div class="slide"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1006 <h1>環境付き継続</h1> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1007 <table border=1 width=100%> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1008 <tr> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1009 <td width=50%><small>生成する為のコード</small></td> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1010 <td width=50%><small>生成されるTree</small></td> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1011 </tr> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1012 <tr class="srctr"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1013 <td class="srctd"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1014 <pre class="srcbox" style="width:25em;"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1015 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1016 case RID_CbC_RET: |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1017 { |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1018 tree value, stmt, label, tlab, decl; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1019 c_parser_consume_token (parser); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1020 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1021 stmt = c_begin_stmt_expr (); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1022 cbc_return_f = c_parser_peek_token (parser)->value; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1023 location_t location = c_parser_peek_token (parser)->location; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1024 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1025 /* create label. (__label__ _cbc_exit0;) */ |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1026 label = get_identifier ("_cbc_exit0"); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1027 tlab = declare_label (label); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1028 C_DECLARED_LABEL_FLAG (tlab) = 1; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1029 add_stmt (build_stmt (location, DECL_EXPR, tlab)); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1030 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1031 /* declare retval. (int retval;) */ |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1032 tree decl_cond = |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1033 build_decl (location, VAR_DECL, get_identifier ("retval"), |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1034 TREE_TYPE (TREE_TYPE (current_function_decl))); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1035 TREE_STATIC (decl_cond) = 1; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1036 TREE_USED (decl_cond) = 1; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1037 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1038 /* Use thread-local */ |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1039 DECL_TLS_MODEL (decl_cond) = decl_default_tls_model (decl_cond); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1040 DECL_NONLOCAL (decl_cond) = 1; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1041 add_stmt (build_stmt(location, DECL_EXPR, pushdecl (decl_cond))); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1042 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1043 /* define nested function. */ |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1044 decl = |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1045 cbc_finish_nested_function (location, label, decl_cond); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1046 TREE_USED(decl) = 1; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1047 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1048 /* define if-ed goto label and return statement. */ |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1049 cbc_finish_labeled_goto (location, label, decl_cond); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1050 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1051 /* get pointer to nested function. */ |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1052 value = build_addr (decl , current_function_decl); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1053 TREE_USED (current_function_decl) = 1; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1054 SET_EXPR_LOCATION (value, location); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1055 add_stmt (value); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1056 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1057 TREE_SIDE_EFFECTS (stmt) = 1; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1058 expr.value = c_finish_stmt_expr (location, stmt); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1059 expr.original_code = ERROR_MARK; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1060 } |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1061 </pre> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1062 </td> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1063 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1064 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1065 <td class="srctd"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1066 <img src="./pix/STATEMENT_LIST_1.png" style="height: 10em;"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1067 </td> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1068 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1069 </tr> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1070 </table> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1071 </div> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1072 <!--PAGE--> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1073 <div class="slide"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1074 <h1>環境付き継続</h1> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1075 <table border=1 width=100%> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1076 <tr> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1077 <td><small>生成しているコード</small></td> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1078 <td><small>生成されるTree</small></td> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1079 </tr> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1080 <tr class="srctr"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1081 <td width=50% class="srctd"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1082 <pre class="srcbox" style="width:25em;"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1083 |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1084 //goto c1(__return, __environment); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1085 goto c1(({ |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1086 __label__ _cbc_exit0; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1087 static int retval; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1088 void _cbc_internal_return(int retval_, void *_envp) { |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1089 retval = retval_; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1090 goto _cbc_exit0; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1091 } |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1092 if (0) { |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1093 _cbc_exit0: |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1094 return retval; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1095 } |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1096 _cbc_internal_return; |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1097 }), __environment); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1098 </pre> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1099 </td> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1100 <td class="srctd"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1101 <img src="./pix/STATEMENT_LIST_1.png" style="height: 10em;"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1102 </td> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1103 </tr> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1104 </table> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1105 </div> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1106 <!--PAGE--> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1107 <div class="slide"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1108 <h1></h1> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1109 <li>引数の並びの上書きにコピーが無い。</li> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1110 <pre style="font-size:28px;"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1111 __code cs_a(int a, int b) { |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1112 goto cs_b(b,a); |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1113 } |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1114 </pre> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1115 <img src="./pix/cs_prog.png"> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1116 </div> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1117 <!--PAGE--> |
7ed352ddae10
modify spell miss
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
1118 |
54 | 1119 </div> |
1120 </body> | |
1121 </html> |