# HG changeset patch # User kent # Date 1206384256 -32400 # Node ID 29847c3bea644b464e6d652756d735224bf272db # Parent d9061c8bce925a4b4c4257adfe6a5f0e12a7ae79 temporary finish diff -r d9061c8bce92 -r 29847c3bea64 Makefile --- a/Makefile Tue Mar 25 00:18:24 2008 +0900 +++ b/Makefile Tue Mar 25 03:44:16 2008 +0900 @@ -9,9 +9,9 @@ #TARGET3 = resume2 #SLIDE1 = slide -PDFs = $(TARGET1).pdf $(TARGET2).pdf $(TARGET3).pdf $(SLIDE1).pdf -DVIs = $(TARGET1).dvi $(TARGET2).dvi $(TARGET3).dvi $(SLIDE1).dvi -TEXs = $(TARGET1).tex $(TARGET2).tex $(TARGET3).tex $(SLIDE1).tex +PDFs = $(TARGET1).pdf +DVIs = $(TARGET1).dvi +TEXs = $(TARGET1).tex .SUFFIXES: .tex .dvi .pdf diff -r d9061c8bce92 -r 29847c3bea64 figures/GCC-TailCall.eps --- a/figures/GCC-TailCall.eps Tue Mar 25 00:18:24 2008 +0900 +++ b/figures/GCC-TailCall.eps Tue Mar 25 03:44:16 2008 +0900 @@ -745,33 +745,25 @@ %RBIEndFontSubset /HiraKakuPro-W3 cguidfix /F2.1/HiraKakuPro-W3 renmfont +[ /CIEBasedABC 4 dict dup begin +/WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def +/MatrixABC [ 0.4294 0.2332 0.0202 0.3278 0.6737 0.1105 0.1933 0.0938 0.9580 ] def +/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def +end ] /Cs1 exch/ColorSpace dr pop [ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def /DecodeA { { 1.8008 exp } bind exec} bind def /MatrixA [ 0.9642 1.0000 0.8249 ] def /RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def /DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def -end ] /Cs1 exch/ColorSpace dr pop -[ /CIEBasedABC 4 dict dup begin -/WhitePoint [ 0.9505 1.0000 1.0891 ] def -/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def -/MatrixABC [ 0.4294 0.2332 0.0202 0.3278 0.6737 0.1105 0.1933 0.0938 0.9580 ] def -/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def end ] /Cs2 exch/ColorSpace dr pop %%EndPageSetup +0.60000002 i /Cs1 SC -1 sc +1 1 1 sc q 0 0 382 263 rc -0 263 m -382 263 l -382 0 l -0 0 l -h -f -0.60000002 i -/Cs2 SC -1 1 1 sc 2 247 m 83 247 l 83 148 l @@ -790,7 +782,7 @@ h 36 36 m S -/Cs1 SC +/Cs2 SC 0 sc 0 i 1 0 0 -1 42.5 197.5 cm @@ -804,7 +796,7 @@ -35.5 42 m (\))s 0.60000002 i -/Cs2 SC +/Cs1 SC 1 1 1 sc CM 146 247 m @@ -823,7 +815,7 @@ h 180 36 m S -/Cs1 SC +/Cs2 SC 0 sc 0 i 1 0 0 -1 191 202 cm @@ -834,7 +826,7 @@ -40 42 m (\))s 0.60000002 i -/Cs2 SC +/Cs1 SC 1 1 1 sc CM 290 247 m @@ -853,7 +845,7 @@ h 324 36 m S -/Cs1 SC +/Cs2 SC 0 sc 0 i 1 0 0 -1 335 224.5 cm @@ -866,12 +858,12 @@ 1 0 0 -1 38.0625 192 cm -31.5 4.5 m (,&--$*./0)[ 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 0.000000 ] xS -/Cs2 SC -0 0 0 sc 1 0 0 -1 191.062 201 cm -31.5 4.5 m (,&--$+./0)[ 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 0.000000 ] xS 0.60000002 i +/Cs1 SC +0 0 0 sc 1 0 0 -1 -34 283 cm 80.856659 83.5 m 95.902931 70.667953 109.47776 52.915878 126 45 c @@ -959,7 +951,7 @@ h 94.355385 99.162338 m S -/Cs1 SC +/Cs2 SC 0 sc 0 i 1 0 0 -1 108.37735 252.14673 cm @@ -976,7 +968,7 @@ -18.455999 2 m ($%&'$\()[ 5.160000 7.056000 4.704001 7.415998 5.160001 0.000000 ] xS 0.60000002 i -/Cs2 SC +/Cs1 SC 1 1 1 sc CM 2 103 m @@ -997,7 +989,7 @@ h 36 180 m S -/Cs1 SC +/Cs2 SC 0 sc 0 i 1 0 0 -1 42.5 53.5 cm @@ -1011,7 +1003,7 @@ -35.5 42 m (\))s 0.60000002 i -/Cs2 SC +/Cs1 SC 1 1 1 sc CM 146 103 m @@ -1030,7 +1022,7 @@ h 180 180 m S -/Cs1 SC +/Cs2 SC 0 sc 0 i 1 0 0 -1 191 62.5 cm @@ -1041,7 +1033,7 @@ -40 34.5 m (\))s 0.60000002 i -/Cs2 SC +/Cs1 SC 1 1 1 sc CM 290 103 m @@ -1060,7 +1052,7 @@ h 324 180 m S -/Cs1 SC +/Cs2 SC 0 sc 0 i 1 0 0 -1 335 80.5 cm @@ -1073,12 +1065,12 @@ 1 0 0 -1 38.0625 48 cm -31.5 4.5 m (,&--$*./0)[ 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 0.000000 ] xS -/Cs2 SC -0 0 0 sc 1 0 0 -1 191.062 57 cm -31.5 4.5 m (12%3$+./0)[ 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 0.000000 ] xS 0.60000002 i +/Cs1 SC +0 0 0 sc 1 0 0 -1 -34 283 cm 80.856659 227.5 m 95.902931 214.66795 109.47776 196.91588 126 189 c @@ -1144,7 +1136,7 @@ h 96.852226 243.13986 m S -/Cs1 SC +/Cs2 SC 0 sc 0 i 1 0 0 -1 108.37735 108.14673 cm @@ -1161,14 +1153,14 @@ 2 J 1 j 0.60000002 i -/Cs2 SC +/Cs1 SC 0 0 0 sc 1 0 0 -1 -34 283 cm 225 135 m 225 158.25 l S 1.5 w -/Cs1 SC +/Cs2 SC 1 sc 225 135 m 225 158.25 l @@ -1176,7 +1168,7 @@ 0.75 w 0 J 0 j -/Cs2 SC +/Cs1 SC 0 0 0 sc 225 169.45 m 225 158.25 l @@ -1184,7 +1176,7 @@ 225 169.45 l 220.8 158.25 l S -/Cs1 SC +/Cs2 SC 0 sc 0 i 1 0 0 -1 231 130 cm @@ -1192,8 +1184,6 @@ (,)s -54.863998 2 m ("-#./"##.0+&-*-1"&-2\()[ 6.900002 2.855999 2.784000 3.995998 9.072002 6.899998 2.784000 2.783998 3.996002 9.540001 7.763998 4.704002 2.855999 11.171997 2.856005 5.975996 6.900005 4.703995 2.855999 7.500000 0.000000 ] xS -/Cs2 SC -0 0 0 sc 1 0 0 -1 173.062 183 cm /F1.1[ 14 0 0 -14 0 0]sf -10.5 4.5 m diff -r d9061c8bce92 -r 29847c3bea64 main.pdf Binary file main.pdf has changed diff -r d9061c8bce92 -r 29847c3bea64 main.tex --- a/main.tex Tue Mar 25 00:18:24 2008 +0900 +++ b/main.tex Tue Mar 25 03:44:16 2008 +0900 @@ -1,6 +1,6 @@ % File: main.tex % Created: 日 3 23 18:00 PM 2008 J -% Last Change: 月 3 24 21:20 PM 2008 J +% Last Change: 火 3 25 02:40 PM 2008 J % \documentclass[a4j,twocolumn,9pt]{jarticle} \usepackage{main} @@ -338,15 +338,13 @@ \begin{lstlisting}[caption=declspecs\_add\_type関数,label=code:declspecs_add_type] case RID_CbC_CODE: if (specs->long_p) - error ("both % and % in " - "declaration specifiers"); + error ("both % and %signed_p) - error ("both % and % in " - "declaration specifiers"); + error ("both % and %typespec_word = cts_CbC_code; - return specs; +return specs; \end{lstlisting} これは実際には\verb|case RID_VOID|とほぼ同じである。 違うのは\verb|specs->typespec_word = cts_CbC_code|のみとなる。 @@ -372,7 +370,7 @@ 具体的には以下の様な関数になる。 \begin{lstlisting}[caption=build\_code\_segment\_type関数,label=code:build_code_segment] tree -build_code_segment_type (tree value_type, tree arg_types) +build_code_segment_type(value_type ..) { tree t; t = make_node (FUNCTION_TYPE); @@ -400,10 +398,10 @@ 3番目の(巨大な)switch文の\verb|case cdk_function:|の部分である。 これを、code segmentの場合には\verb|build_code_segment_type|を使うようにする。 \begin{lstlisting}[caption=grokdeclarator関数,label=code:grokdeclarator] -if ( declspecs->typespec_word == cts_CbC_code ) - type = build_code_segment_type (type, arg_types); +if(typespec_word==cts_CbC_code) + type =build_code_segment_type(..); else - type = build_function_type (type, arg_types); + type =build_function_type(..); \end{lstlisting} これで、\_\_code型がパースされた時にはFUNCITON\_TYPEにフラグが付くようになった。 code segmentかをチェックする時はtree typeに対して @@ -421,29 +419,22 @@ を修正することになる。 具体的な修正は以下のようになった。 \begin{lstlisting}[caption=goto文の構文解析,label=code:goto_parse] -case RID_GOTO: - c_parser_consume_token (parser); - if ( c_parser_next_token_is (parser, CPP_NAME) - && c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON ) - { - stmt = c_finish_goto_label (c_parser_peek_token (parser)->value); - c_parser_consume_token (parser); - } - else - { - struct c_expr expr; - expr = c_parser_postfix_expression (parser); - if (TREE_CODE(expr.value) == CALL_EXPR ) - { - - CbC_IS_CbC_GOTO (expr.value) = 1; - CALL_EXPR_TAILCALL (expr.value) = 1; - stmt = c_finish_return (expr.value); - CbC_HAVE_CbC_GOTO (current_function_decl) = 1; - } - else - c_parser_error (parser, "expected identifier or %<*%>"); - } +c_parser_consume_token (parser); +if (c_parser_next_token_is(parser,..) + && _parser_peek_2nd_token(pars..)) + { + stmt = c_finish_goto_label(..); + c_parser_consume_token (parser); + } else { + struct c_expr expr; + expr=c_parser_postfix_expression(..); + if(TREE_CODE(expr)==CALL_EXPR){ + CbC_IS_CbC_GOTO(expr) = 1; + CALL_EXPR_TAILCALL(expr) = 1; + stmt = c_finish_return(expr); + } else + c_parser_error (parser, ..); + } \end{lstlisting} gotoトークンを読み込むと、次のトークンが識別子で、その次がセミコロンであれば 通常のCにおけるgotoと判定できる。 @@ -467,18 +458,8 @@ を新たに作成した。 \subsection{expand\_cbc\_goto} -\verb|expand_cbc_goto|の前にすこし\verb|expand_call|について説明する。 -この関数は大きく2つの処理に分けられる。 -前半はcallすべき関数のアドレスの算出や、与えられた引数を格納する場所を計算、 -またそれらのチェックなどを主に行う。 -後半には巨大なfor文ループが存在し、内部の処理が最大2回実行される。 -最初の1回はTail callをする前提での処理、次はTail callなしの処理である。 -最初の処理では途中でTail call不能と判断されると中断され、 -2回目の処理が優先される。 - -\verb|expand_cbc_goto|はこの巨大なfor文の直前に呼ばれる。 -簡単に説明するとfor文の最初の処理と同じことをTail call可否のチェックなしで -実装することになる。 +簡単に説明すると、\verb|expand_cbc_goto|は\verb|expand_call|での +Tail callの処理を可否判定無しで行うものとなる。 大まかな処理内容は以下の通り \begin{enumerate} \item スタックフレームのベースアドレスRTLを取得 @@ -512,7 +493,7 @@ for (i = 0; i < num_actuals; i++) if (args[i].reg==0 || args[i].pass_on_stack) - preexpand_argument_expr (&args[i] ..); + preexpand_argument_expr(&args[i] ..); \end{lstlisting} この処理で一つ一つの引数に付いて、与えられた式を計算し、レジスタか もしくはスタックに格納しておく。 @@ -524,15 +505,14 @@ にデータを移動する命令を出力するだけでよい。 \paragraph{オーバーラップ} -\ref{sec:condition_of_tailcall}節でも説明したように、 2つ以上の引数のもとのアドレスと格納先アドレスが相互に重なる場合、 一時的な変数に格納する必要がある。 \verb|expand_cbc_goto|ではこの処理を\verb|push_overlaps|関数に任せている。 \begin{lstlisting}[caption=push\_overlaps関数,label=code:push_overlaps] -if ( args[i].mode==BLKmode ) - emit_block_move (temp, args[i].value..) +if(args[i].mode==BLKmode) + emit_block_move(temp, args[i].value..) else - emit_move_insn (temp, args[i].value); + emit_move_insn(temp, args[i].value); \end{lstlisting} この関数は引数の読み込み元と書き込み先が重なる場合に、 一部の引数を別の場所に退避する役割を持つ。 @@ -551,15 +531,15 @@ RTLを生成する。 具体的には以下の様な関数\verb|emit_push_insn|を使っている。 \begin{lstlisting}[caption=引数の格納,label=code:push_args] - emit_push_insn (arg->value, arg->mode ..); +emit_push_insn(arg->value, arg->mode ..); \end{lstlisting} \paragraph{CALL\_INSN} 最後にCALL\_INSNを発行する処理が来る。 \begin{lstlisting}[caption=CALL\_INSNの発行,label=emit CALL_INSN] -funexp=rtx_for_function_call(fndecl, addr); +funexp=rtx_for_function_call(fndecl..); : -emit_call_1 (funexp, exp, fndecl, fun ..); +emit_call_1(funexp,exp,fndecl,fun ..); \end{lstlisting} この\verb|rtx_for_function_call|関数により、funexp変数にcallee関数の アドレスを示したrtxが格納され、 @@ -622,7 +602,7 @@ また、一部アーキテクチャではコンパイル不能に陥る現象も発生している。 これらの問題とその他改良点を今後の課題として以下に簡単に説明する。 \begin{description} - \item[environment] 第\ref{chp:CbC}章では説明を省いたが、 + \item[environment] CbCにはもう一つ、environment付きの継続という構文が存在する。 これは関数からcode segmentにgotoした場合に関数の呼び出し元に戻る ことを可能にするものだが、今回この実装は間に合わなかった。