annotate presen/advice.txt @ 56:46cc88d1051c

add presen/advice.txt
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Sat, 24 Dec 2011 20:58:48 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
56
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 Continuation
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 ベーシック
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 環境付き継続が普通。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 schemeとの継続は違う
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 light-weight
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 スタック
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 会議室
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 SICP のContinuation
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 Micro-C 2001 年
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 『GCC上の』をつける。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 『行った~』くらいに。赤いみない。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 難しいところがどこで、どうやって解決し方。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 フルセットのCに
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 C with Continuation
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 それを制限するとContinuation Based Cになる。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 より高度に最適化。。。の部分は外す。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 どのパス
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 コンパイラは幾つかパスを通る。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 そのたんびにTree
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 トレースをだす。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 GCC をいじるというのはどういうことなのかをいいたい。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 execute_pass_list: 1616
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 passes.c:1558
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 execute_one_pass() を読んでないと行けない。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 pass_execute
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 pass の前後でデバッグオプションがあるから
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 NEXT_PASS はオプティマイゼーションパス
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 passes.c:
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 do_per_function()
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 IPAモード関数単位でしかコンパイルしない場合…?。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 NEXT_PASS
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 OpenMP 様
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 eh = error handler
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 worn_function_return はcbCなのにreturn
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 NEXT_PASS (pass_build_ssa);
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 昔はGIMPLEは残っていたけど、消されてはまった。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 INter procedure Optimization
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 (ipa)
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 CbC だとほとんど使わないはず。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 なので、CbC で書いたほうが性能が悪くなる可能性がある。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 SSAからgimpleにもどす。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 昔はいきなりRTLに変換していた 
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 SSAをRTLに変換するルーチン
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 cse
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 common se… elimination
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 共通部分の最適化
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 pass の中でコード生成されていたと思うので。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 最終的にコード生成のところまでいくのはながい。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 SSAからgimpleに戻しているところがあるはず…
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 gimple_expand cfg
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 pass_expand から
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 call_expand は gimple から rtl を生成しているはず。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 こっから下は
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 rtlをSSAに変換しているアホがいる。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 そこのスライドはこのパスにそって説明する必要がある。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 pass_expandから上としたは全然ちがう。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 call_expandはgimpleだけど途中SSAに変換してgimpleに戻す。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 実際にpass_listがあって、そのpass_listの中でexpand_callがどこにあるのかっていうのを説明してほしい。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 なぜか、プログラミングシンポジウムはハッカーの為の詳細なので、
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 GCCを今いじるならどんなふうにいじるのか。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 自分が以下にGCCを理解しているのかを行って欲しい。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 実際は
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 gotoとなってるけど、単にfactorialと書いたのと同じだよね。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 factorial0()
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 goto factorial()
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 だとtail recursive call が矯正される。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 右側のgoto はとる。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 実際にどんな引数渡しになるのか。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 micro-C ベースのやつがレジスタ渡しだったのでださいコンパイラに負けるということになった。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 Intel64はレジスタが増えた。レジスタ16になったから増えた。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 basic.c は引数渡しに使われるレジスタの数を調べる。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 表にする。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 i386
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 ia64
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 引数は浮動小数点と整数があるよね。その浮動小数点と整数の2つを。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 環境付き継続がの説明のスライド。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 本来はクロージャである必要はない。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 GCCで
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 setjmpで実装しても問題はあまり変わらなくて。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 それでどうなるか、static を使うと
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 thread local な static だったらうまくいくのでは。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 setjmpでない普通のやつを先に。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 setjmpのソースは
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 どうやって生成しているかのソースを内部的に生成しているのをみせてもいいと。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 問題は return val 。だから意味がない。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 setjmp
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 重要なのはretval。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 これでない
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 問題はreturn val がmainの中の環境にある。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 これが普通のローカル変数だと、tail recurcive でぬけると駄目になる。だからstatic にしないといけない。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 static にすればこれを
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 なぜまずかったのか。mainから tail recursive call で抜けてるからまずい。普通にcallすれば生きてるので、
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 クロージャを使ってうまくできると…
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 mainで抜ける所で
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 goto は二種類。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 普通の関数からgotoする場合。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 コードセグメントからgotoする場合で実装が違う。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 statci tls をスレッドローカルにすればいんだけど、実際には決まったレジスタにすればいい。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 レジスタとは->リターンするレジスタ
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 書きこむ先は相手側にあるので関係ない。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 それをそっちの方にコピーするってのはどっかそのへんでやっている。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 多分return 文の中でコピーする。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 return は
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 正しく構造体の戻り値を指していればいいだけで、
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 引数がついている。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 構造体の場合は引数で一個呼ばれているのでその引数をとっておかないといけなくて。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 実は引数、 evnpがついてる。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 値を返す evnp がさしてる allocate させてるところにおいてもいい。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 evnpni
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 Micro-C ではフレームポインタが入っている。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 実装ではフレームピオンタが入っている。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 さっき行ったとおり、return val はレジスタでいいので、return レジスタ
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 simple return;
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 return だけで戻る。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 前にレジスタを設定したので戻ってくると。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 関数の戻りからの動作はおもいので、
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 goto 剃る前にはレジスタの値がきまっているはず。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 return val があればbuild1 で
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 if(0)なので中にはいってこない。このコードが最適化で消えないように工夫しないといけない。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 最適化をかけるとここがきえちゃう。消えないようにCOND をいれて〜とかある。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 cbc_exit0: が外から
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 TREE_used とか
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 c_decl_flag_label
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 最適化で消えちゃわないようになってる。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 最適化かけてうまく動かなかいのはこのコードが消されちゃうから。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 そのあたりをチェック。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 setjmp 使えば常にもどれるので。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 CbCのなかでsetjmp してlongjmp をかいてももどれる。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 CbC バージョン GCC バージョン
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 typedef
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 __rectype
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 __selftype
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 それを入れるためにはどうすればいいのかっていうのも議論すればいい。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 typdef をやると、先輩たちがやって
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 もちろん両方。
46cc88d1051c add presen/advice.txt
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239