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