コンパイルの過程を見やすく表示するツールもいくつか用意されている。 一つは、ソースプログラム、HIR、HIRの制御フローグラフ、LIR、 LIRの制御フローグラフなどの対応をグラフィカルに表示するもので、 CoVisという名前のものである。
図10-1は、ソースプログラムmatmult.cからHIRが生成された時の様子をCoVisで表示したものである。 図の左上は制御フローグラフ、左下は制御フローグラフに関する情報、右上はHIR、右下はソースプログラムである。 それぞれ赤や青の色のついた部分が 対応している。この図の中央上のボタンが示すように、(1)HIRが生成された時、 (2)HIRでの最適化後、(3)LIRが生成された時、(4)LIRでの最適化後、 の4つの時点でこのような表示をすることが出来る。
-coins:debuginfo,snapshotdebuginfo オプションは、 ソースファイルの行番号情報を LIR に渡すためのオプション であり、 snapshot オプションは、 COINS 内部表現を XML として出力するためのオプションである。
出力される情報は、以下の4ヶ所での情報である。いずれも、 coins.driver.Driverのメソッドcompileの中で出力される。
java -classpath ./classes covis.CoVis [XML ファイル]表示は関数単位で表示される。表示される内容は、ソースプログラム、制御フローグラフまたは支配木 (dominator tree)、制御フローグラフまたは支配木の中で選択されたノードに関する情報、 HIRまたはLIR(選択されたノードに対応する部分のハイライト)、LIRのC表現、 などである。何を表示するかは、タブ、あるいはボタンを使って選ぶことが出来る。
SSA最適化のosr(operator strength reduction)では, SSAグラフを作成して,その上で演算の強さの軽減と判定の置き換えを行う. このオプションを指定するためには,
-coins:ssa-opt=...
の中でosrを指定するか,"-O2"以上の最適化指定をすればよい.
その結果作成されたSSAグラフは,
-coins:trace=default.10000 または -coins:trace=SSA.10000
を指定すると,before_ssa_graph.dotとafter_ssa_graph.dot という名前の2つのファイルとして出力される.前者はosr最適化前の SSAグラフであり,後者はosr最適化後のSSAグラフである.
これらをグラフ描画ソフトのgraphvizに与えれば,グラフ表示が得られる.
図10-2は、コード生成過程のトレース表示をしたものである。左の欄にはトレース情報 をとった時点の名前が入っている。右上にはソースプログラム、右下には ある時点でのトレース情報が表示されている。右下の下半分あたりにLIRと マシン命令記述とのパターンマッチングの様子が示されている。 右下の上半分あたりには、そのパターンマッチングの前の時点での ある基本ブロックの中のLIRの列が表示されている。
そこにある[<<]をクリックすると、その基本ブロックが一つ前の時点で どうなっていたかを見ることが出来る。また、[>>]をクリックすると、 その基本ブロックが一つ後の時点でどうなるかを見ることが出来る。
-coins:debuginfo,trace=xxxのようなオプション指定をする必要がある。その出力結果を
java coins.driver.Driver -coins:debuginfo,... > trace.java perl trace2html.pl -o trace -c trace.javaのようにperlのファイルtrace2html.plで処理すればtrace.htmlファイルが 作成されるので、それをブラウザで表示すれば良い。
traceオプションの指定の仕方は2. コンパイラ・ドライバ の「2.2. コンパイラ・ドライバの使い方」の「その他」の項にあるが、ここで関係するものには以下のものがある。
ToCFG, ToLinear, ToMachineCode, EarlyRewriting, LateRewriting, Restruct, InstSel, AggregateByReference, ConvToAsm, NamingFloatConst, ReplaceFloatConst, RewriteConvUF, AugmentCFG, IntroVirReg, JumpCanon, JumpOpt, LoopInversion, PreHeaders, SimpleOpt, Ssa(pruned), Ssa(minimal), LiveRange, RegisterAllocation
より詳しくは トレース情報表示ツールを参照されたい。