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
-
-
-