# HG changeset patch # User kent # Date 1260248848 -32400 # Node ID 59194914942bfd80e85234b1dd078903ee0fe9ad # Parent 79124facde7c46ac20b9b61f7ef59eb70f46da6a add documents. CbC-INSTALL: howto build the gcc for various systems. CbC-implementation.ja: methods of implementation for CbC's statement. diff -r 79124facde7c -r 59194914942b CbC-INSTALL --- a/CbC-INSTALL Tue Dec 08 12:50:31 2009 +0900 +++ b/CbC-INSTALL Tue Dec 08 14:07:28 2009 +0900 @@ -54,14 +54,14 @@ * PS3でのビルド SPU -../CbConGCC/configure --prefix=/usr/local/spu-cbc \ - --build=powerpc --target=spu --program-prefix=spu- \ - --disable-bootstrap --enable-checking=tree,rtl,assert \ - --disable-nls --disable-shared --disable-threads \ - --enable-languages=c --with-system-zlib --with-newlib \ - --enable-version-specific-runtime-libs --disable-libssp \ - --with-gnu-as -with-as=/usr/bin/spu-as --with-gnu-ld \ - --with-ld=/usr/bin/spu-ld + ../CbConGCC/configure --prefix=/usr/local/spu-cbc \ + --build=powerpc --target=spu --program-prefix=spu- \ + --disable-bootstrap --enable-checking=tree,rtl,assert \ + --disable-nls --disable-shared --disable-threads \ + --enable-languages=c --with-system-zlib --with-newlib \ + --enable-version-specific-runtime-libs --disable-libssp \ + --with-gnu-as -with-as=/usr/bin/spu-as --with-gnu-ld \ + --with-ld=/usr/bin/spu-ld PPU binutils $ tar xzvf binutils-...tar.gz @@ -120,6 +120,101 @@ +___________________________________________________________ + PS3用のクロスコンパイラの作成 +----------------------------------------------------------- + +PS3でのGCCのビルドはメモリが少なすぎるためか、insn-*.cのコンパイルに膨 +大な時間がかかってしまう。 +なので別のマシンからPS3をターゲットとしたクロスコンパイラを作成する。 +ただしこれはCbConGCCの開発のためと考えた方が良い。実際にCbC言語を使っ +たプログラムをPS3で開発する際はちゃんとPS3上にノンクロスコンパイラを作 +成しよう。時間はかかるがビルドは可能。 + + * 必要なもの + o binutilsのソース + o gccのソース + o ターゲットマシンのlib*.{a,so}類 + o ターゲットマシンの.hファイル + ~/PS3CROSSにクロスコンパイラ環境を整えるとする + ~/PS3CROSS/cross-tools: クロスコンパイルに使うツールのインストール先 + ~/PS3CROSS/sources: ソース置き場、出来上がったら消してもいいよ + ~/PS3CROSS/target-env: ターゲット環境(libやinclude)が入ったディレクトリ + + * 準備 + $ CROSS=$HOME/PS3CROSS + $ cd $CROSS + $ mkdir sources cross-tools target-env + $ cd sources + $ wget ... binutilsとかgccのソースをダウンロード + + * binutilsのビルド + $ tar xvf binutils..tar.gz + $ mkdir PS3-binutils-build; cd !#1 + $ ../binutils-.../configure --prefix=$CROSS/cross-tools \ + --with-lib-path=$CROSS/target-env \ + --hosti686-pc-linux-gnu --build=i686-pc-linux-gnu \ + --target=ppc64-redhat-linux --enable-64-bit-bfd \ + --disable-nls --enable-shared --with-sysroot + $ make && make install + + * ターゲットマシンの環境をコピーする + $ cd $CROSS/target-env + $ mkdir include lib lib64 + $ ln -s . usr + ## 必要なライブラリはすべてコピー + $ cd lib + $ rsync -avl 'charles.cr:/lib/libc[.-_]*' ./ + $ rsync -avl 'charles.cr:/usr/lib/libc[.-_]*' ./ + $ rsync -avl 'charles.cr:/usr/lib/crt*' ./ + $ rsync -avl 'charles.cr:/lib/ld*' ./ + $ cd ../lib64 + $ ..... + ## ヘッダは軽いので全部コピー + $ cd ../include + $ rsync -avl 'charles.cr:/usr/include/*' ./ + + * GCCのビルド + $ cd $CROSS/sources + $ mkdir PS3-gcc-build; cd !#1 + $ ../.../configure --prefix=$CROSS/cross-tools + --host=i686-pc-linux-gnu --target=ppc64-redhat-linux + --with-sysroot=$CROSS/target-env --disable-nls + --disable-shared --disable-threads + --enable-languages=c --without-headers + --disable-bootstrap + $ make all-gcc + $ make ## エラーで終わるけど気にするな + $ make install-gcc + $ make install-target-libgcc + + * テスト + $ cat >test.c < + int + main(int argc, char **argv) + { + int a=0; + int i; + for (i=0; i<10; i++) { + a = i; + } + printf("hello world\n"); + printf("a = %d\n", a); + return a; + } + EOF + $ $CROSS/cross-tools/bin/gcc -m32 test.c -o test32 + $ $CROSS/cross-tools/bin/gcc -m64 test.c -o test64 + $ file test32 test64 + test32: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), not stripped + test64: ELF 64-bit MSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), not stripped + $ scp test{32,64} PS3Machine: + PS3Machine $ ./test32 + + + + diff -r 79124facde7c -r 59194914942b CbC-implemantation.ja --- a/CbC-implemantation.ja Tue Dec 08 12:50:31 2009 +0900 +++ b/CbC-implemantation.ja Tue Dec 08 14:07:28 2009 +0900 @@ -1,50 +1,187 @@ + GCC への CbC コンパイル機能の実装について -BUILD方法 (作業ディレクトリとは別ディレクトリで) + +___________________________________________________________ + Code Segmentの実装 +----------------------------------------------------------- + +Code SegmentをC言語に組み込む。 +コンパイラとしては単なるvoidの関数として扱い、parse treeにcode +segmentであることのフラグを追加する。 + + * 予約語''__code``の追加 + c-common.cで定義されているc_common_reswords配列に追加 + { "__code", RID_CbC_CODE, 0} # D_CONLYも入れるか? - $ cd ../ - $ mkdir build-test - $ cd build-test - $ CFLAGS=-O0 ../GCC/configure --disable-nls --disable-bootstrap \ - --enable-languages=c --prefix=$PWD/INSTALL-DIR \ - --enable-checking=tree,rtl,assert - $ make - $ make install - installまでしないと環境によってはincludeに問題が出る場合がある - 実際に使用する場合はconfigureには何もオプションはつけないでいい - CFLAGSには "-O0 -gdwarf-2 -g3"をつけると gdbでのmacro表示できる + * treeの生成関数 + 関数の型を表すtreeはbuild_funciton_type関数で生成されるが、code + segmentではこれを使えない。build_function_typeはhash管理でまったく同 + じ引数型、返り値型を持つものは同じオブジェクトを使うから。 + なのでbuild_code_segment_typeでこの代わりを行う。 + # 本当はbuild_function_typeのhashにcbcフラグも含める方がいいかもし + # れない。 + この関数は主にgrokdeclaratorから呼ばれる - $ CFLAGS="-O0 -gdwarf-2 -g3" ../GCC/configure --disable-nls --disable-bootstrap \ - --enable-languages=c --prefix=$PWD/INSTALL-DIR \ - --enable-checking=tree,rtl,assert + * cbc_set_codesegment関数 + Undocumented. + でも今は意味なかったような… + -CVS管理 - GCC new release のインポート - $ wget gcc-core-4.x.y.tar.gz - $ tar xzvf gcc-core-4.x.y.tar.gz - $ cd gcc-core-4.x.y.tar.gz - $ cvs import -ko -m "comment" CbC_project/GCC FSF_GCC REL_4_x_y +___________________________________________________________ + goto文の実装 +----------------------------------------------------------- + +CbCについて重要な構文''goto cs(a, b, c);``を実装する。 +c-parser.c内の c_parser_statement_after_labels()関数における巨大なスイ +ッチ文のcase RID_GOTOのコードを修正する。 - これでimportされる。 + * アイデア + 全てのgoto文を単なる関数呼び出しとその後のリターン文と解釈することで + tail callを可能にする。 + 次のgoto文は + goto cs(a); + このparse treeでもこの様に解釈される + cs(a); + return; + + * Parser側での修正 + + オリジナルC言語のパース方法 + 1. gotoに続くトークンがCPP_NAME + 通常のgoto文として処理 + 2. gotoに続くトークンが'*` + computed gotoとして処理 + see "GCC Manual" Sec 6.3. (not internals Manual) + これを以下の様に変更する - 現在のローカルでの修正とのマージ - なにもないディレクトリにて - $ cvs checkout -jREL_4_._. -j REL_4_x_y CbC_project/GCC + CbCでのパース方法 + 1. gotoに続くトークンがCPP_NAME && CPP_NAMEに次ぐトークンが';` + 通常のgoto文として処理 + 2. gotoに続くトークンが'*` + computed gotoとして処理 + 3. それ以外 + CbCのgotoとして処理 + + 処理内容 + 1. gotoトークンに続く文を関数呼び出しとみて + c_parser_expr_no_commas()関数を使ってパース、treeを取得 + # これで(*csp)(a)などにも対応できる + 2. 取得したtreeがCALL_EXPRでなければエラー + 3. treeにCbC_GOTOのフラグを立てる + 4. treeにTAILCALLのフラグを立てる + 5. add_stmt + 6. return文のtreeを生成 - もしくは既にある作業ディレクトリにて - $ cvs update -jREL_4_._. -j REL_4_x_y + * RTL expansion - 4_._.は前のバージョン - conflictがでたら手作業で修正(運が良ければなにもしないでいい) + 通常のCALL_EXPRを解析するexpand_callを一部修正する。この関数の途中か + らでexpand_cbc_goto関数に切り替えてRTLの生成はそこで全てを請け負う。 + 本来expand_callではtreeにsibcallフラグが立っていても、生成の過程で不 + 可能と検知するとsibcallを中断して通常のcallになるが、cbc_expand_call + では無理やりsibcallにする。 + + expand_callでの修正内容 + Undocumented. + expand_cbc_gotoの処理内容 + Undocumented. - コンパイルして動作確認後、 - $ cvs commit -これであたらしいreleaseにマージ完了 +___________________________________________________________ + goto文における並列代入の実装 Nov 26, 2009 +----------------------------------------------------------- + +c-parser.c: c_parser_statement_after_labels()における goto文のパースの +段階で全ての引数を一時変数に代入する形に変更する。 +もちろんこれだけで並列代入ができる分けではないが、おそらくGCCの最適化 +機構でできると考える。 + + 1. c_parser_expr_no_commasでCALL_EXPRを取得 + 2. 全ての引数に対して一時変数を作成 + 3. それぞれを代入 + 4. CALL_EXPRの引数を一時変数に置き換え + 2-4の処理をcbc_replace_argumentsで行う。 + -DEBUG手法 +___________________________________________________________ + return擬似変数の実装 +----------------------------------------------------------- + +___________________________________________________________ + environmentの実装 +----------------------------------------------------------- + + + + + + + + + + + + + + + + + +___________________________________________ + * goto文における並列代入実装について考える +------------------------------------------- + +Nov 26, 2009 +c-parser.c: c_parser_statement_after_labels()における goto文のパースの +段階で全ての引数を一時変数に代入する形に変更する。 +もちろんこれだけで並列代入ができる分けではないが、おそらくGCCの最適化 +機構でできると考える。 + + 1. c_parser_expr_no_commasでCALL_EXPRを取得 + 2. 全ての引数に対して一時変数を作成 build_decl? + 名前なしでできるか? + 3. それぞれを代入 + 4. CALL_EXPRの引数を一時変数に置き換え + 5. expand_callでの実装を元に戻す? + 現状のままでも動きはするはず + +実装の準備 + o CALL_EXPRから引数リストを取得 + DECL_ARGUMENTS(fundecl) + tree args = DECL_ARGUMENTS (fndecl); + for (; args; args = TREE_CHAIN (args)) + { + tree type = TREE_TYPE (args); + if (INTEGRAL_TYPE_P (type) + && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) + DECL_ARG_TYPE (args) = integer_type_node; + } + o 名前なしの変数作成 + var = build_decl(VAR_DECL, NULL_TREE, TYPE); + DECL_ARTIFICIAL (val) = 1; + o 代入文 + build_modify_expr (loc, TO_EXPR, NOP_EXPR, FROM_EXPR) + o Constantなら一時変数いらない + もしくはcallerの引数と同じ場合にのみ一時変数を使うか + o CALL_EXPRは取得後に引数を変えても大丈夫なのか? + o expand_callでのstore_one_arg, check_sibcall_argument_overlapの動作 + +実装に邪魔ないくつかの関数の解析 + o mem_overlaps_already_clobbered_arg_p(addr, size) + 指定したメモリ[addr,addr+size]範囲がすでに前の引数格納によって上書 + きされていないかをチェックする。 + 引数範囲を1byte毎にbitmapの1bitに表し、上書きされた場所は1がセット + されている。それにかぶるとNG. + また、addrが動的(esp+eaxなど)ならNG. + o sotre_one_args() +この実装ではexpand_cbc_gotoをいじらない事にした + + + + * DEBUG手法 + gccコマンドではなくcc1コマンドに対してgdbを起動 $ ls GCC/ build-test/ test/ @@ -61,55 +198,3 @@ --enable-checkingで指定している必要がある -ソースコードを読むために - ディレクトリ内でbuild - $ cd CbC_project/GCC - $ cvs release (念のため) - $ CFLAGS='-O0 -gdwarf-2 -g3' ../GCC/configure --disable-nls \ - > --disable-bootstrap --enable-languages=c --prefix=$PWD/INSTALL-DIR \ - > --enable-checking=tree,rtl,assert - $ make - $ gtags - - -GDBでmacroを表示 - 上記のように CFLAGS='-O0 -gdwarf-2 -g3' をつけてbuild - (gdb) macro expand MACRO(a) - (gdb) info macro MACRO - (gdb) help macro - - -for spu on PS3 - $ ../CbConGCC/configure --prefix=/usr/local/spu-cbc - > --build=powerpc --target=spu --program-prefix=spu- - > --disable-bootstrap --enable-checking=tree,rtl,assert - > --disable-nls --disable-shared --disable-threads - > --enable-languages=c --with-system-zlib --with-newlib - > --enable-version-specific-runtime-libs --disable-libssp - > --with-gnu-as -with-as=/usr/bin/spu-as --with-gnu-ld - > --with-ld=/usr/bin/spu-ld - $ make install - $ cd /usr/local/spu-cbc - $ ln -s /usr/spu spu - - -for ppu on PS3 - binutils - $ tar xzvf binutils-...tar.gz - $ mkdir binutils_4ps3 - $ cd binutils_4ps3 - $ ../binutils../configure --prefix=$PWD/INSTALL_DIR - > --target=ppc64-yellowdog-linux - $ make install - $ cd .. - cross gcc - $ mkdir gcc_4ps3 - $ PATH=$PWD/../binutils_4ps3/INSTALL_DIR/bin:$PATH - $ ../CbConGCC/configure --prefix=$PWD/INSTALL_DIR - > --enable-language=c --target=ppc64-yellowdog-linux - > --with-newlib --with-included-gettext --enable-shared - > --enable-threads - $ make - - -