Testgen補足

YAPC::Asia Tokyo 2011 2日目レポート[随時更新]:YAPC::Asia Tokyo 2011 スペシャルレポート|gihyo.jp … 技術評論社


@さんが YAPC::Asia 2011で発表した Testgenの補足について.
コードは個人的にちょこちょこいじってましたが, 自分のプロダクトではないので
紹介は控えてましたけど, 公になったので書くことにしました.

コンパイラのテストとは

テストが重要なのは当然なのですが, コンパイラのテストは特に重要です.
コンパイラにバグがあると, ソースコードが間違っているのか, コンパイラ
誤っているかがわからなくなり, 開発どころではないからです.
小さなアプリケーションならまだいいんですけど, カーネルコンパイルする
ということになるともう絶望です.


なので完璧とはいきませんが, 標準的な最適化オプションをぐらいでコンパイル
したとき, 問題が起きない程度にはしておく必要があります.


そういうわけですから, お金にもなります. コンパイラのテストを専門的に
行っている会社もいくつかあります. そしてものすごい高価です. 最低価格が 200万円
ぐらいで, オプションを一つ追加で +20万円とかそんな世界です.


お金持ちの人ならいいんですけど, 小さい企業だと毎回毎回そのような有料テストを
行ってられません. Testgenはそういう人に使ってほしいツールです. Testgenでは
全然十分じゃないので有料のテストは絶対に通すべきなのですが, Testgenさえ通らない
というのは論外と言ってもいいレベルなので, 最低基準のテストという風に受け取って
もらえればよいかと思います. そうすることで必要となるお金もいくらか減ります.

他のコンパイラのテスト

コンパイラのテストは重要なんだったら, 他にないのかよと思うかもしれません.
もちろんあります. たいていのコンパイラには膨大な数のテストが付属しています.
ただそれらのテストは汎用的に作られているわけじゃなくて GCCだったら GCCみたいな
感じで他のコンパイラを使うということが想定されていません. また printfが
あることが前提等だったりします.

Testgenとは

関西学院大学 石浦研究室で開発している, コンパイラテストスイート生成ツール,
及びテスト実行, テストマージツールです. ベースは当時 SRAに在籍していた
引地さんという GCC, GDBのコントリビュータがで開発した方が開発した同様のツールです.
初期開発は私の同期の方が行い, それを研究室で継続して研究開発しています.

なぜ Perlなのか

もともとテスト生成ツールPerlで書いていたのですが, 実行スクリプトGCC
テスト同様 Dejagnuというフレームワークを使っていました. それには expectという
Tclのサブセット(方言?)を使う必要があるんですが, 情報が少ないため, メンテできない
ということで, すべて Perlで書きなおそうということになりました.

コード

オリジナル版testgen2 homepage
fork版syohex/p5-Testgen · GitHub

私が一番のヘビーユーザかと思うのですが, 気に入らないところがいくつか
あったので, forkして修正したり, 機能を追加したりしました.


主な改良点は以下のとおりです.

  • 32ビットマシンでしか動作しなかった問題の修正
  • 並列テスト実行対応
  • Windows対応


CPANモジュールを使えばもっと楽になるんですが, 全然 Perlを知らない人の利用も考え,
Pure Perl + 標準モジュールのみの構成になっています. Perl 5.8で動きます.
インストールも不要です.


私の fork版ベースになるとかならないとかという話が今出ているそうな.

使い方

fork版の使い方.

  % perl bin/tgen.pl --config=コンフィグファイル template/*.tt
  % cd testsuite
  % ./runtest.pl # テストの実行
  % ./merge.pl   # テストグループを一ファイルにマージする(テストの高速化のため)
コンフィグファイル

fork版では Amon2等の設定ファイルと同様に Perlのハッシュリファレンスにしました.
サンプルを以下に示します. 詳しくは READMEを参照してください.

+{
    compiler      => 'arm-elf-gcc',
    simulator     => 'arm-elf-run',
    c_flags       => [ '-Dunix' ],
    ld_flags      => [ '' ],
    options       => [ '-O0', '-O2' ],
    testdir       => 'testsuite_arm',
    compile_only  => 0,

    size => {
         char  => 8,
         short => 16,
         int   => 32,
         long  => 32,
         pointer => 32,
    },

    timeout       => 10,
    parallels     => 2,
    color         => 1,
};

改善すべき点

  • C99に対応していない

今時のコンパイラにこれがないのはわりとあれかなと思う. GCCは互換性の問題からか
"-std=c99"としないと C99として見てくれないわけですけど, clangのような現代的な
ものだと C99がデフォルトなので, これはいい加減対応した方がいいかなと思う.
もうすぐ新しい規格も出るわけだし, せめて C99はと思いますね.

  • テンプレートがいけてない

Text::Xslateのようなテンプレートモジュールと比較すると機能がしょぼい.
現状は標準モジュールのみで動作するようにしてますが, Text::Xslateをそのまま使った
方がメンテナンスするコード量も減るし, いいんじゃないかな思います.

  • マージ機能がいけてない.

現状はテストファイル郡を一つのファイルにまとめるというだけなのですが,
ジャンプの距離がかなり遠くなってしまうなどの変化があり, 同一のテストに
なっているかがそもそも疑問です. アーキテクチャによっては, そのあたりで
制限がありそうな気がするし, そのあたりをフレキシブルにマージできたら
いいかなと思います.

  • マージ機能に GCCを利用している

今のところは大丈夫だと思うんだけど, これから clangベースで GCCのない環境という
のも考えられるから, なんとかした方がいいかなと思います。


このあたりはきっと研究室のみなさんがなんとかしてくれるでしょう.
期待しています.

おわりに

Testgenについての補足を行いました.
私個人としては Windows対応を行ったので, 国内 CPU向けのコンパイラ作っている方に
ぜひ使ってほしいかなと思います.


あとやっぱり YAPCは面白そうですね. 最終日だけ行けないこともなかったんだけど,
今の仕事の状況的にいける気分ではありませんでした. 次は絶対に行きたいです.
Perlの有名人の方に, 私と話をしてみたいとか思ってもらえるように, モジュール
リリースしたり, バグレポート書いたり, ブログ書いたりしていこうと思います.

おまけ

プロセス間通信を Kazuho Okuさんの資料を元に修正しました。
その結果を示します。PIPEがネックになっていたんですね。