Mercurial > hg > Papers > 2012 > nobu-thesis
changeset 9:942888c0f8aa draft
modify explanation of tailcall elimination
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 22 Feb 2012 02:29:12 +0900 |
parents | 42e6dd499688 |
children | 95325401552b |
files | paper/resume.tex |
diffstat | 1 files changed, 11 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/resume.tex Tue Feb 21 18:09:21 2012 +0900 +++ b/paper/resume.tex Wed Feb 22 02:29:12 2012 +0900 @@ -52,7 +52,7 @@ \section{GCC-4.6 への実装} -GCCでの軽量継続を Tail Call Ellimination (末尾除去)を強制することで実装する. +GCC における軽量継続は Tail Call Ellimination (末尾除去)を強制することで実装する. これにより, コードセグメント間の移動を, call ではなく jmp 命令行う. コードセグメント自体には戻値はない. @@ -65,30 +65,14 @@ \label{fig:continue} \end{figure} -\subsection{expand\_call 関数} -GCCでは, ある関数が Tail Call Elimination を行えるかどうかは expand\_call 関数で以下の条件で判断される. - -\begin{itemize} - \item caller 側と callee 側の戻値の型が一致している. - \item 関数呼び出しがリターンの直前に行われている. - \item 呼出先関数の引数に用いられるスタックサイズが呼出元関数のそれより少ない. - \item 引数の並びのコピーに上書きがない. -\end{itemize} - -CbC の実装では上記の条件を, 以下の様にして解決させている. - -\begin{itemize} - \item コードセグメントは void 型で統一する - \item Cの関数からコードセグメントにgotoする場合は返す値の型チェックを行わない. - \item goto の直後に retrun を置く. - \item スタックサイズは関数宣言時に決まったサイズにする. - \item 引数は一旦, 一時変数にコピーして重なりがないようにする. -\end{itemize} - -GCCでは, この他にもTCEを禁止するルールがあり, GCC-4.5, 4.6 でも -Tail Call Elimination にかからないコードセグメントがある. -この点を改善する必要がある. - +\subsection{末尾除去の矯正付与} +関数が末尾除去にかかる為には, ``呼び出し先関数と呼び出し元関数の方が一致している'' +といったいくつかの条件をクリアしなければならない. +%といったいくつかの条件をクリアしなければならない. +これまでの実装ではコードセグメントに条件をクリアさせる為, 専用の関数を用意していた. +しかし今回の実装ではその関数を撤廃し, 末尾除去にかかるフラグを落とさせない +コードを追加することで末尾除去の条件をクリアさせるようになった. +これにより GCC のアップデート時に伴う専用関数の修正が不要となり, 楽な管理が行えるようになった. \subsection{環境付き継続} CbC には通常の C の関数からコードセグメントに継続する際, @@ -151,7 +135,7 @@ \begin{figure}[h] \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=\_\_rectype 構文使用例,label=code:rectype] -typedef (*funcPtr)(int,__rectype*); +typedef __code (*funcPtr)(int,__rectype*); struct node { int num; selftype child; @@ -173,7 +157,7 @@ \begin{center} \scalebox{0.33}{\includegraphics{figure/conv1_linux.pdf}} \end{center} - \caption{それぞれのコンパイラにより生成されたコードの速度比較(Linux)} + \caption{各種コンパイラにより生成されたコードの速度比較} \label{fig:linux_conv} \end{figure}