test-suite Makefile ガイド (非推奨)

概要

まず、すべてのテストは LLVM オブジェクトディレクトリツリー内で実行されます。LLVM ソースツリー内では実行されません。これは、テストスイートが実行中に一時ファイルを作成するためです。

テストスイートを実行するには、次の手順に従う必要があります。

  1. 次のコマンドで test-suite モジュールをチェックアウトします。

    % git clone https://github.com/llvm/llvm-test-suite.git test-suite
    
  2. FIXME: これらの指示は古く、機能しません。正しい対処法を調べて、ここに記述してください。

  3. llvm を構成してビルドします。

  4. llvm-gcc を構成してビルドします。

  5. llvm-gcc をどこかにインストールします。

  6. テストスイートを実行したい各ビルドツリー (LLVM オブジェクトディレクトリツリー) の最上位から、LLVM をビルドする前と同様に llvm再構成します。

    再構成中には、次のいずれかを実行する必要があります。(1) ビルドしたばかりの llvm-gcc がパスに含まれているか、(2) ビルドしたばかりの llvm-gcc がインストールされているディレクトリを --with-llvmgccdir=$LLVM_GCC_DIR を使用して指定します。

    また、テストスイートが利用可能であることを構成機構に伝える必要があります。これにより、ビルドツリー用に構成できます。

    % cd $LLVM_OBJ_ROOT ; $LLVM_SRC_ROOT/configure [--with-llvmgccdir=$LLVM_GCC_DIR]
    

    [$LLVM_GCC_DIR は、llvm-gcc の src または obj ディレクトリではなく、インストールしたディレクトリであることに注意してください。]

  7. これで、次のようにビルドツリーからテストスイートを実行できます。

    % cd $LLVM_OBJ_ROOT/projects/test-suite
    % make
    

2 番目と 3 番目の手順は、1 回だけ実行する必要があります。スイートをチェックアウトして構成したら、(テストコードまたは構成スクリプトが変更されない限り) 再び実行する必要はありません。

外部テストの設定

test-suite モジュールで外部テストを実行するには、–with-externals を指定する必要があります。これは、再構成ステップ (上記を参照) 中に行う必要があり、llvm の再構成は、以前にビルドされた llvm-gcc を認識する必要があります。これらのいずれかが欠落または無視された場合、外部テストは機能しません。

  • –with-externals

  • –with-externals=<directory>

これは、外部テストを見つける場所を LLVM に指示します。それらは、<directory> の特定の名前のサブディレクトリにあることが想定されています。directory が指定されていない場合、configure はデフォルト値 /home/vadve/shared/benchmarks/speccpu2000/benchspec を使用します。LLVM が認識しているサブディレクトリ名には、以下が含まれます。

  • spec95

  • speccpu2000

  • speccpu2006

  • povray31

その他は随時追加されており、configure から決定できます。

異なるテストの実行

通常の「プログラム全体」のテストに加えて、test-suite モジュールは、さまざまな方法でプログラムをコンパイルするメカニズムも提供します。gmake コマンドラインで変数 TEST が定義されている場合、テストシステムは TEST.<TEST 変数の値>.Makefile という名前の Makefile を含めます。この Makefile は、ビルドルールを変更して異なる結果を生成できます。

たとえば、LLVM ナイトリーテスターは、TEST.nightly.Makefile を使用して、ナイトリーテストレポートを作成します。ナイトリーテストを実行するには、gmake TEST=nightly を実行します。

ツリー内には、いくつかの TEST Makefile が用意されています。それらの一部は、内部 LLVM 研究用に設計されており、LLVM 研究グループ外では機能しません。ただし、LLVM で開発する最適化または解析パス用の独自の TEST Makefile を作成するためのガイドとして、依然として価値がある可能性があります。

テスト出力の生成

テストを実行して出力を生成する方法は多数あります。最も簡単なのは、引数なしで gmake を実行することです。これにより、ツリー内のすべてのプログラムがさまざまな方法でコンパイルおよび実行され、結果が比較されます。失敗は出力に報告されますが、他の出力に埋もれる可能性があります。合格は明示的に報告されません。

やや良いのは、gmake TEST=sometest test を実行することです。これにより、指定されたテストが実行され、通常、出力にプログラムごとの概要が追加されます (使用する sometest によって異なります)。たとえば、nightly テストは、各プログラムの後、すべてのテストに対して TEST-PASS または TEST-FAIL を明示的に出力します。これらの行はまだ出力に埋もれていますが、Output ディレクトリの出力ログを grep するのは簡単です。

さらに良いのは、report および report.format ターゲット (ここで、format は、htmlcsvtext、または graphs のいずれか) です。レポートの正確な内容は、実行している TEST に依存しますが、テキスト結果は常に実行の最後に表示され、結果は常に report.<type>.format ファイルに保存されます (TEST=<type> を指定して実行した場合)。また、report は、テスト実行全体からの出力を含む report.<type>.raw.out というファイルも生成します。

test-suite 用のカスタムテストの作成

テストスイートを実行できると仮定すると (たとえば、"gmake TEST=nightly report" が機能するはずです)、ツリー内のすべてのプログラムに対して最適化またはコードジェネレーターコンポーネントを簡単に実行し、統計を収集したり、正当性に関するカスタムチェックを実行したりできます。基本的には、これがナイトリーテスターの仕組みです。これは、一般的なフレームワークの単なる 1 つの例です。

LLVM 最適化パスがあり、それがトリガーされる回数を確認したいとします。最初にすべきことは、パスに LLVM 統計を追加することです。これにより、関心のある事項の数が集計されます。

これに続いて、これらを収集し、表示しやすいようにフォーマットするテストとレポートを設定できます。これは、2 つのファイルで構成されます。「test-suite/TEST.XXX.Makefile」フラグメント (ここで、XXX はテストの名前) と、出力をテーブルにフォーマットする方法を示す「test-suite/TEST.XXX.report」ファイルです。テストスイートには、さまざまなレベルの洗練度を持つレポートの例が多数含まれており、フレームワークは非常に一般的です。

最適化パスのテストに関心がある場合は、「libcalls」テストを例として確認してください。次のように実行できます。

% cd llvm/projects/test-suite/MultiSource/Benchmarks  # or some other level
% make TEST=libcalls report

これにより、さまざまな処理が実行され、最終的に次のようなテーブルが出力されます。

Name                                  | total | #exit |
...
FreeBench/analyzer/analyzer           | 51    | 6     |
FreeBench/fourinarow/fourinarow       | 1     | 1     |
FreeBench/neural/neural               | 19    | 9     |
FreeBench/pifft/pifft                 | 5     | 3     |
MallocBench/cfrac/cfrac               | 1     | *     |
MallocBench/espresso/espresso         | 52    | 12    |
MallocBench/gs/gs                     | 4     | *     |
Prolangs-C/TimberWolfMC/timberwolfmc  | 302   | *     |
Prolangs-C/agrep/agrep                | 33    | 12    |
Prolangs-C/allroots/allroots          | *     | *     |
Prolangs-C/assembler/assembler        | 47    | *     |
Prolangs-C/bison/mybison              | 74    | *     |
...

これは基本的に、-stats 出力を grep し、テーブルに表示します。「TEST=libcalls report.html」ターゲットを使用して、テーブルを HTML 形式で取得したり、report.csv や report.tex についても同様に取得したりできます。

このソースは test-suite/TEST.libcalls.* にあります。形式は非常に単純です。Makefile はテストの実行方法を示し (この場合は、"opt -simplify-libcalls -stats")、レポートには出力の各列に 1 行が含まれています。最初の値は列のヘッダーであり、2 番目の値はコマンドの出力を grep するための正規表現です。高度な処理を実行できるレポートの例は多数あります。