可視化ツール

9.1. 中間プログラム表現可視化ツール CoVis

コンパイルの過程を見やすく表示するツールもいくつか用意されている。 一つは、ソースプログラム、HIR、HIRの制御フローグラフ、LIR、 LIRの制御フローグラフなどの対応をグラフィカルに表示するもので、 CoVisという名前のものである。

図9-1は、ソースプログラムmatmult.cからHIRが生成された時の様子をCoVisで表示したものである。図の左上は制御フローグラフ、左下は制御フローグラフに関する情報、右上はHIR、右下はソースプログラムである。それぞれ赤や青の色のついた部分が 対応している。この図の中央上のボタンが示すように、(1)HIRが生成された時、 (2)HIRでの最適化後、(3)LIRが生成された時、(4)LIRでの最適化後、 の4つの時点でこのような表示をすることが出来る。


図9-1 CoVisによる表示

9.1.1. CoVisの使い方

CoVisシステムでは、コンパイル時の情報をXMLファイルとして出力しておいたものを表示する。グラフの表示にはAT&T Labs-Research で開発されたフリーソフト Grappaを使っている。したがって、CoVisを使うためにはCoVisシステムと Grappaをインストールしておく必要がある。
使い方の詳しい説明は CoVisUsersGuide.pdfにある。 ここではその概略を説明する。

9.1.1.1. XMLファイルの作成

COINS の内部表現を XML ファイルにするには、COINS コンパイラ・オプションに以下 のものを指定する。
-coins:debuginfo,snapshot 
debuginfo オプションは、 ソースファイルの行番号情報を LIR に渡すためのオプション であり、 snapshot オプションは、 COINS 内部表現を XML として出力するためのオプションである。
このオプションを指定すると、 ソースファイルと同じディレクトリに, ソースファイル名の拡張子を ”.xml” に置換した名前のXMLファイルが出力される。
例えば、a.c をコンパイルした時の XML ファイルは、 a.xml となる。

出力される情報は、以下の4ヶ所での情報である。いずれも、 coins.driver.Driverのメソッドcompileの中で出力される。

  1. Generated HIR: メソッドmakeHirFromSourceを呼んだ直後
  2. Optimized HIR: メソッドmakeNewLirFromHirを呼ぶ直前
  3. Generated LIR: メソッドmakeCSourceFromLirを呼んだ直後
  4. Optimized LIR: メソッドunit.generateCodeを呼ぶ直前

9.1.1.2. XMLファイルの表示

CoVis は、java のプログラムである。CoVis をインストールしたディレクトリで javaコマンドでCoVisを起動すればよい。 インストールの仕方は CoVisUsersGuide.pdfに詳しく書かれている。そこに書かれているCoVisの本体はCoVis.tgzである。
起動の際に、入力ファイルとして XML ファイルを指定することができる。 起動後にXMLファイルをメニューで選択しても良い。
  java -classpath ./classes covis.CoVis [XML ファイル]
表示は関数単位で表示される。表示される内容は、ソースプログラム、制御フローグラフまたは支配木(dominator tree)、 制御フローグラフまたは支配木の中で選択されたノードに関する情報、 HIRまたはLIR(選択されたノードに対応する部分のハイライト)、LIRのC表現、 などである。何を表示するかは、タブ、あるいはボタンを使って選ぶことが出来る。

9.2. コード生成過程のトレース情報表示ツール

コード生成過程はコンパイラでも最も複雑な過程の一つであり、 デバッグにも困難が伴うので、それを助けるための可視化ツールが用意されている。 それは、バッグエンドの随所での変換過程を各種のリンク付きの htmlファイルとして出力するものである。

図9-2は、コード生成過程のトレース表示をしたものである。左の欄にはトレース情報 をとった時点の名前が入っている。右上にはソースプログラム、右下には ある時点でのトレース情報が表示されている。右下の下半分あたりにLIRと マシン命令記述とのパターンマッチングの様子が示されている。 右下の上半分あたりには、そのパターンマッチングの前の時点での ある基本ブロックの中のLIRの列が表示されている。

そこにある[<<]をクリックすると、その基本ブロックが一つ前の時点で どうなっていたかを見ることが出来る。また、[>>]をクリックすると、 その基本ブロックが一つ後の時点でどうなるかを見ることが出来る。


図9-2 コード生成過程のトレース表示

9.2.1. コード生成過程のトレース情報表示ツールの使い方

前節の表示をさせるためには、
  -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. コンパイラ・ドライバの使い方」の その他にあるが、ここで関係するものには以下のものがある。

-coins:trace=LIR[.number]
バックエンドの入口と出口で、LIRの内部状態を標準出力に表示する。 「.number」はなくても良い。numberは数値であり、その意味は以後の記述で説明される。
-coins:trace=TMD[.number]
コード生成部のトレース情報を標準出力に表示する。
-coins:trace=phasename[.number]
変換ステップの名前phasenameを指定して、その変換作業の前後のLIRの状態を表示する。 phasenameとしては、以下のものが指定出来る。

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

より詳しくは トレース情報表示ツールを参照されたい。