annotate paper/chapter2.tex @ 39:a6540714dda9 draft

modify presen
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Tue, 28 Feb 2012 20:01:28 +0900
parents be5b510b6d44
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
be5b510b6d44 add some files
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
1 \chapter{GCC, The Gnu Compiler Collection}
0
b939c5aae834 add paper
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 \section{GCC とは}
b939c5aae834 add paper
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
4
be5b510b6d44 add some files
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
4
0
b939c5aae834 add paper
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 \subsection{cc1}
39
a6540714dda9 modify presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
6 GCC はコンパイルだけではなく, アセンブルとリンクも行う.
4
be5b510b6d44 add some files
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
7
be5b510b6d44 add some files
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
8
0
b939c5aae834 add paper
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 \section{GCC の内部表現}
2
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
10 GCC-4.6 への実装の前に, GCC で扱われる内部表現について触れておく.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
11
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
12 GCC は内部で Generic Tree, GIMPLE Tree, Tree SSA, RTL という4つの内部表現を扱う(GIMPLE と SSA は一緒に考えられることもある).
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
13 それぞれが
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
14 読み込んだソースコードは Generic Tree, GIMPLE Tree, Tree SSA, RTL の順に変換されていき,
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
15 最後にアセンブラ言語へと出力される.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
16 図\ref{fig:ir}は GCC がソースコードを読み込みアセンブラ言語出力までの流れを表した図である.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
17
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
18
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
19 \begin{figure}[htpb]
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
20 \begin{center}
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
21 \includegraphics[width=100mm]{figure/ir.pdf}
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
22 \end{center}
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
23 \caption{GCC によるコンパイルの一連の流れ}
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
24 \label{fig:ir}
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
25 \end{figure}
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
26
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
27
0
b939c5aae834 add paper
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 \subsection{Generic Tree}
2
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
29 ソースコードより読み込んだ関数の情報を木構造で表したものが Generic Tree となる.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
30 関数の戻値,引数,変数の型,条件式とプログラムの処理全てが木構造で表される.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
31
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
32 CbC の実装ではパースの部分からこの Generic Tree 生成の部分に手が加わっている.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
33
0
b939c5aae834 add paper
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 \subsection{GIMPLE Tree}
2
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
35 Generic Tree で表現されたデータは GIMPLE Tree に変換される.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
36 GIMPLE Tree は Generic Tree より制約がかかった状態で作成された構文木となる.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
37 制約は「1つの枝につく子が3つ以下になるように分解」等といったもので,
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
38 GIMPLE Tree へと変換されたデータは Generic Tree より簡単な命令で表されることになる.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
39 CbC の実装では特に修正は加えていない.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
40
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
41
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
42
0
b939c5aae834 add paper
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 \subsection{SSA}
2
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
44 Tree SSA (Static Single Assignment) は, プログラムの中で
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
45 変数が一度しか代入されないように変換させた構文木になる.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
46 SSA に変換することで, 様々な最適化が行いやすくなる.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
47 こちらも GIMPLE 同様 CbC の実装では特に修正は加えていない.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
48
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
49
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
50
0
b939c5aae834 add paper
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 \subsection{RTL}
2
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
52 Tree SSA は解析が行われた後 RTL へと変換される.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
53 RTL はレジスタの割り当てといった低レベルの表現であり, アセンブラとほぼ同じ命令の表現を行うことができる.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
54 プログラム内部では RTL も木構造で表される.
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
55
124612a0f170 modify tex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
56 CbC における継続は,この RTL への変換で行われる最適化の1つ Tail Call Elimination が重要となってくる.