changeset 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 79124facde7c
children e62c90c8e699
files CbC-INSTALL CbC-implemantation.ja
diffstat 2 files changed, 273 insertions(+), 93 deletions(-) [+]
line wrap: on
line diff
--- 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 <<EOF
+  	#include<stdio.h>
+  	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
 
 
 
+
+
+
+
--- 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
-
-
-