Mercurial > hg > CbC > CbC_gcc
comparison CbC-implemantation.ja @ 32:59194914942b
add documents.
CbC-INSTALL: howto build the gcc for various systems.
CbC-implementation.ja: methods of implementation for CbC's statement.
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 08 Dec 2009 14:07:28 +0900 |
parents | cc07adb17855 |
children | e62c90c8e699 |
comparison
equal
deleted
inserted
replaced
31:79124facde7c | 32:59194914942b |
---|---|
1 | |
1 | 2 |
2 GCC への CbC コンパイル機能の実装について | 3 GCC への CbC コンパイル機能の実装について |
3 | 4 |
4 BUILD方法 (作業ディレクトリとは別ディレクトリで) | 5 |
5 | 6 ___________________________________________________________ |
6 $ cd ../ | 7 Code Segmentの実装 |
7 $ mkdir build-test | 8 ----------------------------------------------------------- |
8 $ cd build-test | 9 |
9 $ CFLAGS=-O0 ../GCC/configure --disable-nls --disable-bootstrap \ | 10 Code SegmentをC言語に組み込む。 |
10 --enable-languages=c --prefix=$PWD/INSTALL-DIR \ | 11 コンパイラとしては単なるvoidの関数として扱い、parse treeにcode |
11 --enable-checking=tree,rtl,assert | 12 segmentであることのフラグを追加する。 |
12 $ make | 13 |
13 $ make install | 14 * 予約語''__code``の追加 |
14 installまでしないと環境によってはinclude<stdio.h>に問題が出る場合がある | 15 c-common.cで定義されているc_common_reswords配列に追加 |
15 実際に使用する場合はconfigureには何もオプションはつけないでいい | 16 { "__code", RID_CbC_CODE, 0} # D_CONLYも入れるか? |
16 CFLAGSには "-O0 -gdwarf-2 -g3"をつけると gdbでのmacro表示できる | 17 |
17 | 18 * treeの生成関数 |
18 $ CFLAGS="-O0 -gdwarf-2 -g3" ../GCC/configure --disable-nls --disable-bootstrap \ | 19 関数の型を表すtreeはbuild_funciton_type関数で生成されるが、code |
19 --enable-languages=c --prefix=$PWD/INSTALL-DIR \ | 20 segmentではこれを使えない。build_function_typeはhash管理でまったく同 |
20 --enable-checking=tree,rtl,assert | 21 じ引数型、返り値型を持つものは同じオブジェクトを使うから。 |
21 | 22 なのでbuild_code_segment_typeでこの代わりを行う。 |
22 | 23 # 本当はbuild_function_typeのhashにcbcフラグも含める方がいいかもし |
23 CVS管理 | 24 # れない。 |
24 GCC new release のインポート | 25 この関数は主にgrokdeclaratorから呼ばれる |
25 $ wget gcc-core-4.x.y.tar.gz | 26 |
26 $ tar xzvf gcc-core-4.x.y.tar.gz | 27 * cbc_set_codesegment関数 |
27 $ cd gcc-core-4.x.y.tar.gz | 28 Undocumented. |
28 $ cvs import -ko -m "comment" CbC_project/GCC FSF_GCC REL_4_x_y | 29 でも今は意味なかったような… |
29 | 30 |
30 これでimportされる。 | 31 |
31 | 32 |
32 現在のローカルでの修正とのマージ | 33 ___________________________________________________________ |
33 なにもないディレクトリにて | 34 goto文の実装 |
34 $ cvs checkout -jREL_4_._. -j REL_4_x_y CbC_project/GCC | 35 ----------------------------------------------------------- |
35 | 36 |
36 もしくは既にある作業ディレクトリにて | 37 CbCについて重要な構文''goto cs(a, b, c);``を実装する。 |
37 $ cvs update -jREL_4_._. -j REL_4_x_y | 38 c-parser.c内の c_parser_statement_after_labels()関数における巨大なスイ |
38 | 39 ッチ文のcase RID_GOTOのコードを修正する。 |
39 4_._.は前のバージョン | 40 |
40 conflictがでたら手作業で修正(運が良ければなにもしないでいい) | 41 * アイデア |
41 | 42 全てのgoto文を単なる関数呼び出しとその後のリターン文と解釈することで |
42 コンパイルして動作確認後、 | 43 tail callを可能にする。 |
43 $ cvs commit | 44 次のgoto文は |
44 これであたらしいreleaseにマージ完了 | 45 goto cs(a); |
45 | 46 このparse treeでもこの様に解釈される |
46 | 47 cs(a); |
47 DEBUG手法 | 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 これを以下の様に変更する | |
59 | |
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を生成 | |
77 | |
78 * RTL expansion | |
79 | |
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. | |
90 | |
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 | |
106 | |
107 | |
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 現状のままでも動きはするはず | |
149 | |
150 実装の準備 | |
151 o CALL_EXPRから引数リストを取得 | |
152 DECL_ARGUMENTS(fundecl) | |
153 tree args = DECL_ARGUMENTS (fndecl); | |
154 for (; args; args = TREE_CHAIN (args)) | |
155 { | |
156 tree type = TREE_TYPE (args); | |
157 if (INTEGRAL_TYPE_P (type) | |
158 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) | |
159 DECL_ARG_TYPE (args) = integer_type_node; | |
160 } | |
161 o 名前なしの変数作成 | |
162 var = build_decl(VAR_DECL, NULL_TREE, TYPE); | |
163 DECL_ARTIFICIAL (val) = 1; | |
164 o 代入文 | |
165 build_modify_expr (loc, TO_EXPR, NOP_EXPR, FROM_EXPR) | |
166 o Constantなら一時変数いらない | |
167 もしくはcallerの引数と同じ場合にのみ一時変数を使うか | |
168 o CALL_EXPRは取得後に引数を変えても大丈夫なのか? | |
169 o expand_callでのstore_one_arg, check_sibcall_argument_overlapの動作 | |
170 | |
171 <del>実装に邪魔ないくつかの関数の解析</del> | |
172 o mem_overlaps_already_clobbered_arg_p(addr, size) | |
173 指定したメモリ[addr,addr+size]範囲がすでに前の引数格納によって上書 | |
174 きされていないかをチェックする。 | |
175 引数範囲を1byte毎にbitmapの1bitに表し、上書きされた場所は1がセット | |
176 されている。それにかぶるとNG. | |
177 また、addrが動的(esp+eaxなど)ならNG. | |
178 o sotre_one_args() | |
179 この実装ではexpand_cbc_gotoをいじらない事にした | |
180 | |
181 | |
182 | |
183 * DEBUG手法 | |
184 | |
48 gccコマンドではなくcc1コマンドに対してgdbを起動 | 185 gccコマンドではなくcc1コマンドに対してgdbを起動 |
49 $ ls | 186 $ ls |
50 GCC/ build-test/ test/ | 187 GCC/ build-test/ test/ |
51 $ cd test | 188 $ cd test |
52 $ gdb ../build-test/gcc/cc1 | 189 $ gdb ../build-test/gcc/cc1 |
59 | 196 |
60 browse_treeはtree, debug_rtxはrtxをconfigureの | 197 browse_treeはtree, debug_rtxはrtxをconfigureの |
61 --enable-checkingで指定している必要がある | 198 --enable-checkingで指定している必要がある |
62 | 199 |
63 | 200 |
64 ソースコードを読むために | |
65 ディレクトリ内でbuild | |
66 $ cd CbC_project/GCC | |
67 $ cvs release (念のため) | |
68 $ CFLAGS='-O0 -gdwarf-2 -g3' ../GCC/configure --disable-nls \ | |
69 > --disable-bootstrap --enable-languages=c --prefix=$PWD/INSTALL-DIR \ | |
70 > --enable-checking=tree,rtl,assert | |
71 $ make | |
72 $ gtags | |
73 | |
74 | |
75 GDBでmacroを表示 | |
76 上記のように CFLAGS='-O0 -gdwarf-2 -g3' をつけてbuild | |
77 (gdb) macro expand MACRO(a) | |
78 (gdb) info macro MACRO | |
79 (gdb) help macro | |
80 | |
81 | |
82 for spu on PS3 | |
83 $ ../CbConGCC/configure --prefix=/usr/local/spu-cbc | |
84 > --build=powerpc --target=spu --program-prefix=spu- | |
85 > --disable-bootstrap --enable-checking=tree,rtl,assert | |
86 > --disable-nls --disable-shared --disable-threads | |
87 > --enable-languages=c --with-system-zlib --with-newlib | |
88 > --enable-version-specific-runtime-libs --disable-libssp | |
89 > --with-gnu-as -with-as=/usr/bin/spu-as --with-gnu-ld | |
90 > --with-ld=/usr/bin/spu-ld | |
91 $ make install | |
92 $ cd /usr/local/spu-cbc | |
93 $ ln -s /usr/spu spu | |
94 | |
95 | |
96 for ppu on PS3 | |
97 binutils | |
98 $ tar xzvf binutils-...tar.gz | |
99 $ mkdir binutils_4ps3 | |
100 $ cd binutils_4ps3 | |
101 $ ../binutils../configure --prefix=$PWD/INSTALL_DIR | |
102 > --target=ppc64-yellowdog-linux | |
103 $ make install | |
104 $ cd .. | |
105 cross gcc | |
106 $ mkdir gcc_4ps3 | |
107 $ PATH=$PWD/../binutils_4ps3/INSTALL_DIR/bin:$PATH | |
108 $ ../CbConGCC/configure --prefix=$PWD/INSTALL_DIR | |
109 > --enable-language=c --target=ppc64-yellowdog-linux | |
110 > --with-newlib --with-included-gettext --enable-shared | |
111 > --enable-threads | |
112 $ make | |
113 | |
114 | |
115 |