Mercurial > hg > CbC > CbC_gcc
annotate CbC-implemantation.ja @ 107:a3a2f64cf8f4
modify implementation of rectype
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 14 Jun 2012 19:44:54 +0900 |
parents | e62c90c8e699 |
children |
rev | line source |
---|---|
32 | 1 |
29
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 GCC への CbC コンパイル機能の実装について |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 |
32 | 5 |
6 ___________________________________________________________ | |
7 Code Segmentの実装 | |
8 ----------------------------------------------------------- | |
9 | |
10 Code SegmentをC言語に組み込む。 | |
11 コンパイラとしては単なるvoidの関数として扱い、parse treeにcode | |
12 segmentであることのフラグを追加する。 | |
13 | |
14 * 予約語''__code``の追加 | |
15 c-common.cで定義されているc_common_reswords配列に追加 | |
16 { "__code", RID_CbC_CODE, 0} # D_CONLYも入れるか? | |
29
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 |
32 | 18 * treeの生成関数 |
19 関数の型を表すtreeはbuild_funciton_type関数で生成されるが、code | |
20 segmentではこれを使えない。build_function_typeはhash管理でまったく同 | |
21 じ引数型、返り値型を持つものは同じオブジェクトを使うから。 | |
22 なのでbuild_code_segment_typeでこの代わりを行う。 | |
23 # 本当はbuild_function_typeのhashにcbcフラグも含める方がいいかもし | |
24 # れない。 | |
25 この関数は主にgrokdeclaratorから呼ばれる | |
29
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 |
32 | 27 * cbc_set_codesegment関数 |
28 Undocumented. | |
29 でも今は意味なかったような… | |
30 | |
29
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 |
32 | 33 ___________________________________________________________ |
34 goto文の実装 | |
35 ----------------------------------------------------------- | |
36 | |
37 CbCについて重要な構文''goto cs(a, b, c);``を実装する。 | |
38 c-parser.c内の c_parser_statement_after_labels()関数における巨大なスイ | |
39 ッチ文のcase RID_GOTOのコードを修正する。 | |
29
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 |
32 | 41 * アイデア |
42 全てのgoto文を単なる関数呼び出しとその後のリターン文と解釈することで | |
43 tail callを可能にする。 | |
44 次のgoto文は | |
45 goto cs(a); | |
46 このparse treeでもこの様に解釈される | |
47 cs(a); | |
48 return; | |
49 | |
50 * Parser側での修正 | |
51 | |
52 オリジナルC言語のパース方法 | |
53 1. gotoに続くトークンがCPP_NAME | |
54 通常のgoto文として処理 | |
55 2. gotoに続くトークンが'*` | |
56 computed gotoとして処理 | |
57 see "GCC Manual" Sec 6.3. (not internals Manual) | |
58 これを以下の様に変更する | |
29
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 |
32 | 60 CbCでのパース方法 |
61 1. gotoに続くトークンがCPP_NAME && CPP_NAMEに次ぐトークンが';` | |
62 通常のgoto文として処理 | |
63 2. gotoに続くトークンが'*` | |
64 computed gotoとして処理 | |
65 3. それ以外 | |
66 CbCのgotoとして処理 | |
67 | |
68 処理内容 | |
69 1. gotoトークンに続く文を関数呼び出しとみて | |
70 c_parser_expr_no_commas()関数を使ってパース、treeを取得 | |
71 # これで(*csp)(a)などにも対応できる | |
72 2. 取得したtreeがCALL_EXPRでなければエラー | |
73 3. treeにCbC_GOTOのフラグを立てる | |
74 4. treeにTAILCALLのフラグを立てる | |
75 5. add_stmt | |
76 6. return文のtreeを生成 | |
29
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
77 |
32 | 78 * RTL expansion |
29
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 |
32 | 80 通常のCALL_EXPRを解析するexpand_callを一部修正する。この関数の途中か |
81 らでexpand_cbc_goto関数に切り替えてRTLの生成はそこで全てを請け負う。 | |
82 本来expand_callではtreeにsibcallフラグが立っていても、生成の過程で不 | |
83 可能と検知するとsibcallを中断して通常のcallになるが、cbc_expand_call | |
84 では無理やりsibcallにする。 | |
85 | |
86 expand_callでの修正内容 | |
87 Undocumented. | |
88 expand_cbc_gotoの処理内容 | |
89 Undocumented. | |
29
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
90 |
32 | 91 ___________________________________________________________ |
92 goto文における並列代入の実装 Nov 26, 2009 | |
93 ----------------------------------------------------------- | |
94 | |
95 c-parser.c: c_parser_statement_after_labels()における goto文のパースの | |
96 段階で全ての引数を一時変数に代入する形に変更する。 | |
97 もちろんこれだけで並列代入ができる分けではないが、おそらくGCCの最適化 | |
98 機構でできると考える。 | |
99 | |
100 1. c_parser_expr_no_commasでCALL_EXPRを取得 | |
101 2. 全ての引数に対して一時変数を作成 | |
102 3. それぞれを代入 | |
103 4. CALL_EXPRの引数を一時変数に置き換え | |
104 2-4の処理をcbc_replace_argumentsで行う。 | |
105 | |
29
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
106 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
107 |
32 | 108 ___________________________________________________________ |
109 return擬似変数の実装 | |
110 ----------------------------------------------------------- | |
111 | |
112 ___________________________________________________________ | |
113 environmentの実装 | |
114 ----------------------------------------------------------- | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 ___________________________________________ | |
133 * goto文における並列代入実装について考える | |
134 ------------------------------------------- | |
135 | |
136 Nov 26, 2009 | |
137 c-parser.c: c_parser_statement_after_labels()における goto文のパースの | |
138 段階で全ての引数を一時変数に代入する形に変更する。 | |
139 もちろんこれだけで並列代入ができる分けではないが、おそらくGCCの最適化 | |
140 機構でできると考える。 | |
141 | |
142 1. c_parser_expr_no_commasでCALL_EXPRを取得 | |
143 2. 全ての引数に対して一時変数を作成 build_decl? | |
144 名前なしでできるか? | |
145 3. それぞれを代入 | |
146 4. CALL_EXPRの引数を一時変数に置き換え | |
147 5. expand_callでの実装を元に戻す? | |
148 現状のままでも動きはするはず | |
33
e62c90c8e699
modify CbC-implementation.ja
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
149 引数のタイプ |
e62c90c8e699
modify CbC-implementation.ja
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
150 関数 |
e62c90c8e699
modify CbC-implementation.ja
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
151 o ADDR_EXPR |
e62c90c8e699
modify CbC-implementation.ja
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
152 o PARM_DECL, VAR_DECL, |
e62c90c8e699
modify CbC-implementation.ja
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
153 other |
e62c90c8e699
modify CbC-implementation.ja
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
154 o *_EXPR |
e62c90c8e699
modify CbC-implementation.ja
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
155 o PARM_DECL, VAR_DECL, |
32 | 156 |
157 実装の準備 | |
158 o CALL_EXPRから引数リストを取得 | |
159 DECL_ARGUMENTS(fundecl) | |
160 tree args = DECL_ARGUMENTS (fndecl); | |
161 for (; args; args = TREE_CHAIN (args)) | |
162 { | |
163 tree type = TREE_TYPE (args); | |
164 if (INTEGRAL_TYPE_P (type) | |
165 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) | |
166 DECL_ARG_TYPE (args) = integer_type_node; | |
167 } | |
168 o 名前なしの変数作成 | |
169 var = build_decl(VAR_DECL, NULL_TREE, TYPE); | |
170 DECL_ARTIFICIAL (val) = 1; | |
171 o 代入文 | |
172 build_modify_expr (loc, TO_EXPR, NOP_EXPR, FROM_EXPR) | |
173 o Constantなら一時変数いらない | |
174 もしくはcallerの引数と同じ場合にのみ一時変数を使うか | |
175 o CALL_EXPRは取得後に引数を変えても大丈夫なのか? | |
176 o expand_callでのstore_one_arg, check_sibcall_argument_overlapの動作 | |
177 | |
178 <del>実装に邪魔ないくつかの関数の解析</del> | |
179 o mem_overlaps_already_clobbered_arg_p(addr, size) | |
180 指定したメモリ[addr,addr+size]範囲がすでに前の引数格納によって上書 | |
181 きされていないかをチェックする。 | |
182 引数範囲を1byte毎にbitmapの1bitに表し、上書きされた場所は1がセット | |
183 されている。それにかぶるとNG. | |
184 また、addrが動的(esp+eaxなど)ならNG. | |
185 o sotre_one_args() | |
186 この実装ではexpand_cbc_gotoをいじらない事にした | |
187 | |
188 | |
189 | |
190 * DEBUG手法 | |
191 | |
29
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
192 gccコマンドではなくcc1コマンドに対してgdbを起動 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
193 $ ls |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
194 GCC/ build-test/ test/ |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
195 $ cd test |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
196 $ gdb ../build-test/gcc/cc1 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
197 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
198 treeの表示 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
199 (gdb) p browse_tree (exp) <== expはtree構造体 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
200 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
201 rtxの表示 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
202 (gdb) p debug_rtx (exp) <== expはrtx構造体 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
203 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
204 browse_treeはtree, debug_rtxはrtxをconfigureの |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
205 --enable-checkingで指定している必要がある |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
206 |
cc07adb17855
deleting old commented out code.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
207 |