Mercurial > hg > CbC > CbC_gcc
diff 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 |
line wrap: on
line diff
--- 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<stdio.h>に問題が出る場合がある - 実際に使用する場合は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の動作 + +<del>実装に邪魔ないくつかの関数の解析</del> + 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 - - -