annotate paper/gcc.tex @ 10:3d9addf62d0b

organized repository.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Tue, 16 Feb 2010 14:35:36 +0900
parents gcc.tex@4b2af58b0302
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \chapter{GNU コンパイラ コレクション}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 \label{chp:gcc}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 GNU コンパイラ コレクション(以下GCC)はフリーソフトウェア財団によって
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 管理されているオープンソースのコンパイラ群である。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 C, C++, Java, FORTRANなどの様々な言語に対応しており、UNIX系OSの標準的
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 なコンパイラとして用いられている。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 本研究におけるCbCコンパイラの実装対象もこのGCCとなる。本章では実装に当
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 たる予備知識としてGCCのプログラム構成について簡単に説明する。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
8
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
13 \section{コンパイル、アセンブル、リンク}
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 GCCはコンパイルだけでなく、出力したアセンブラのアセンブル、リンクまで
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 行い、最終的に実行ファイルを出力する。このコンパイル、アセンブル、リン
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 クはそれぞれcc1, as, collect2というプログラムが行っており、GCCは実際に
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
18 はそれらを統括しているだけである。
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
8
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
20 言語に関する処理はcc1だけである。以降はこのプログラムcc1がどのようにソ
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 ースコードをアセンブラに変換するかを説明する。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
8
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
23 \section{cc1}
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 GCCではプログラムソースコードをアセンブラに変換する過程で Generic,
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 GIMPLE, RTL という3つの内部表現を用いている。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 これらの内部表現とソースコード、アセンブラ間の変換はフロントエンド、ミ
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 ドルエンド、バックエンドが担当している。図\ref{fig:gcc-flow}にその様子
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 を示す。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 \begin{figure}[htpb]
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 \begin{center}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 \includegraphics[width=.8\textwidth]{figures/gcc-flow.eps}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 \end{center}
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
34 \caption{cc1でのデータフロー(Generic, GIMPLE, RTL)}
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 \label{fig:gcc-flow}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 \end{figure}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 \subsection{フロントエンドとGeneric, GIMPLE}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 フロントエンドはコンパイラ中で直接ソースコードを解析するルーチンのこと
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 である。ソースコードの解析はコンパイルする言語毎に異なるため、フロント
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 エンドの実装もC, C++, Javaなどで様々である。言語によって異なるソースコ
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 ードを解析し、その結果をGenericという構文木(プログラムの構造を表すデー
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 タ構造)に変換するのがフロントエンドの役割となる。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 構文木Genericは関数の宣言や繰返し制御構造、条件分岐、リターン文など、
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 プログラムの構造を全てツリー構造で表現することができる。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 この構文木は言語に依存しないため、言語設計者は通常はミドルエンド以降に
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 ついては考慮する必要はない。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 構文木がプログラムをデータ構造として表す様子を図
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 \ref{fig:tree-example}に示した。この図はコード\ref{code:tree-example}
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
54 の関数\verb|funcT|を解析した結果を構文木で表現している。
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 \begin{figure}[htpb]
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 \lstinputlisting
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 [caption=C言語の解析例(解析結果は図\ref{fig:tree-example}),
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 label=code:tree-example]
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 {sources/tree-example.c}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 \begin{center}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 \includegraphics[width=.8\textwidth]{figures/tree-example.eps}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 \end{center}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 \caption{コード\ref{code:tree-example}の構文木の例}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 \label{fig:tree-example}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 \end{figure}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 図のように、一般的なコンパイラでは\verb|#include|などのディレクティブ
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 を除くソースコードの全てを構文木で表現する。これによりプログラムの文脈
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 をコンパイラが理解し、それぞれのブロック毎にアセンブラへの変換が可能に
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 なる。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
8
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
72 \subsubsection{GimplifyとGIMPLE(SSA)}
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
73
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 フロントエンドではGenericを生成した後、ミドルエンドにデータを渡す前に
8
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
75 GenericをGIMPLEと呼ばれるデータ構造に変換する。この処理がGimplifyであ
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
76 る。GIMPLEはデータ構造としては Genericと同じであるが、一つの枝に4つ以
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
77 上の子がついてはいけないなどの制限が付加されている。
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
78
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
79 この制限されたデータ構造は一般的には静的単一代入(Static Single
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
80 Assignment)と呼ばれており、様々な最適化を簡略化する事を目的として導入
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
81 されている。
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 \subsection{ミドルエンドとRTL}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85
8
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
86 GCCはフロントエンドにて構文木GIMPLEの生成後、このGIMPLEを解析しながら
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
87 RTLと呼ばれる中間コードを生成する。RTLはアセンブラとほぼ同等の命令列を
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
88 表現可能であり、どのアーキテクチャでも同じように扱われる。また、GIMPLE
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
89 にも言語の依存はないため、ミドルエンドは言語にもアーキテクチャにも依存
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
90 しない、全ての GCC コンパイラに共通のルーチンとなっている。
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 しかしながらアーキテクチャに依存した形にRTLを作ることは可能であり、特
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 に最適化に関するRTL生成はアーキテクチャ依存であることが多い。ただしそ
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
94 の場合はアーキテクチャが対応してるか否かを判別するために次項に紹介する
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 Machine Descriptionが使われるため、共通のミドルエンドが使われることに
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 変わりはない。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
98 RTLはプログラム上はツリー構造として扱われるが、デバッグ表示や次のバッ
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
99 クエンドで使うMachine Descriptionのため、S式を用いた表現が用いられてい
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
100 る。例として、ある仮想レジスタに直接値20を乗算する命令を表すRTLのS式表
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
101 現は以下のようになる。
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 \begin{lstlisting}[caption=レジスタに20を乗算する命令のRTL表現例,
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 label=code:rtl-example,language=Lisp]
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 (set (reg/f:SI 54 virtual-stack-vars)
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 (mult:SI (reg:SI 58)
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 (const_int 20 [0x14])))
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 \end{lstlisting}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 この例では\verb|(reg:SI 58)|で表される仮想レジスタの値と定数20との積を
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 、\verb|(reg/f:SI 54)|で表されるレジスタにセットしている。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 ミドルエンドではGIMPLEを元にこの様なRTLの命令列を作成し、バックエンド
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 に処理を引き渡している。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
8
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
115 \subsubsection{最適化パス}
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
116 最適化はGCCの中でももっとも重要な機能の一つといえる。
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
117 様々な最適化の手法がGCCにおいて実装され、実用化されている。
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
118
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
119 GCCでは最適化は2つフェーズに分類される。
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
120
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
121 一つはGIMPLEを対象とした最適化である。 GIMPLEは、アーキテクチャはもち
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
122 ろん言語仕様にも依存しないため、どのコンパイラにおいてもこの最適化を適
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
123 用することができる。
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
124
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
125 もう一つはRTLを対象とした最適化である。 RTLのデータ構造自体は言語にも
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
126 アーキテクチャにも依存はないが、最適化にはレジスタの数やスタックの操作
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
127 法などに依存する事が多いため、この最適化ではいくつかの制限が入る。
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
128
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
129 ミドルエンドには``pass''という概念があり、最適化処理やGIMPLEの変換、そ
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
130 の他諸々の処理は、その処理のメインルーチンをpassに登録することでミドル
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
131 エンド上にて実行可能になる。
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
132
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
133 passの登録順序にも意味があり、passの前半部はGIMPLE対象の最適化など、続
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
134 いてGIMPLEからRTLへの変換処理、後半部にはRTLの最適化処理が登録されてい
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
135 る。
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
136
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
137 次章で説明するが、本研究では軽量継続の実装にGIMPLE対象の最適化である末
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
138 尾呼び出し最適化を利用している。そのため、CbCの言語実装であるがミドル
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
139 エンドの修正も行っている。
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
140
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 \subsection{バックエンドとMachine Description}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 バックエンドでは、ミドルエンドで生成されたRTLを元にアセンブラを出力し
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
145 ている。この処理は必然的にターゲットとするアーキテクチャにより処理が異
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
146 なるため、バックエンドはアーキテクチャ毎に用意されることになる。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
147
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 アーキテクチャ毎に異なるRTLの変換規則を記述したものがMachine
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 Description(以下md)である。 mdはGCCの対応する全てのアーキテクチャに
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 それぞれ用意されており、バックエンドはこれを元にアセンブラを生成する。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
152 mdはRTLと同じくS式で表現され、RTLの変換のために次の要素を定義する必要
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
153 がある。
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 \begin{itemize}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 \item その変換規則の名前
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
157 GCCのプログラムから関数として呼び出すための名前である。
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 \item 変換するRTLの構造(パターンマッチ)
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
160 この規則がどのようなRTLを変換できるかを表す。
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 \item 変換する条件
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
163 上記のパターンだけでは判別できない時の追加条件をCの構文で記述する。
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 \item 出力するアセンブラ
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
166 アセンブラ文字列か、もしくはアセンブラ文字列を出力するCの構文を記
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
167 述する。
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 \end{itemize}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 例としてARMアーキテクチャにおけるmdを一つ、コード
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 \ref{code:md-example}に示す。このmdはコード\ref{code:rtl-example}で紹
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 介した乗算命令のRTLにマッチし、アセンブラ``\verb|mul r0 r2 r1|'' を出
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 力する。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 2行目の要素がマッチするRTLのパターンで、コード\ref{code:rtl-example}と
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 形が似ていることが分かる。
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
176 5行目が条件である。バックエンドプログラムの変数などをチェックしている。
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
177 そして6行目が出力するアセンブラである。ここでは``\verb|%?|''や
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 ``\verb|%2|''を使い、 printf関数と似たような書式変換を行っている。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 \begin{lstlisting}[caption=ARMでのMachine Descriptionの例
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 (コード\ref{code:rtl-example}をアセンブラに変換),
7
8ef81ff8cb52 emended.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
182 label=code:md-example,language=Lisp,numbers=left]
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 (define_insn "*arm_mulsi3"
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 [(set (match_operand:SI 0 "s_register_operand" "=&r,&r")
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 (mult:SI (match_operand:SI 2 "s_register_operand" "r,r")
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 (match_operand:SI 1 "s_register_operand" "%?r,0")))]
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 "TARGET_32BIT && !arm_arch6"
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 "mul%?\\t%0, %2, %1")
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 \end{lstlisting}
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190
8
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
191 \subsubsection{mdからソースコードへの変換}
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192
8
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
193 mdの記述は上記の様に単なる生成規則でしかない。そのため通常のプログラム
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
194 であれば実行時にmdデータを読み込みその通りに解釈する方法を取るが、コン
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
195 パイラの様な大規模なソフトウェアではそれでは処理に時間がかかりすぎる。
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196
8
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
197 そのためGCCではこのmdを直接プログラムに変換する手法を取っている。
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
198 例として、\verb|i386.md|(x86アーキテクチャの生成規則である)は
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
199 \verb|insn-emit.c|や\verb|insn-output.c|などの、C言語ソースファイルに
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
200 変換され、バックエンドやその他のソースファイルと一緒にコンパイルされ、
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
201 cc1プログラムの一部となる。この様子を図\ref{fig:insns}に表した。
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202
8
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
203 \begin{figure}[htpb]
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
204 \begin{center}
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
205 \includegraphics[width=.9\textwidth]{figures/insns.eps}
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
206 \end{center}
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
207 \caption{mdからソースコードを生成、さらにcc1をコンパイルする様子}
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
208 \label{fig:insns}
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
209 \end{figure}
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210
8
4b2af58b0302 the version for probation.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
211 \section{GCC}
5
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 以上のようにGCCはフロントエンド、ミドルエンド、バックエンドがそれぞれ
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 の役割を持ち、全体を通して最終的にアセンブラの生成を行う。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 GCCではこのようにアセンブラを出力した後、アセンブル、リンクまでを行う。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 しかしそれらは本研究では関連しないので説明は割愛する。
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218
dfb89e32eea1 added gcc.tex, conclusion.tex
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219