Bugpoint 再設計¶
著者: Diego Treviño (diegotf@google.com)
日付: 2019-06-05
ステータス: 下書き
はじめに¶
bugpoint の利用が増加するにつれて、長年の使用を通じて、いくつかの改善点(使いにくい、遅い、常に高品質のテストケースを生成するわけではないなど)が特定されてきました。このドキュメントでは、より焦点を絞った新しいアプローチ、つまり IR テストケースの最小化を提案します。
提案された新しい設計¶
焦点を絞る: テストケースの縮小¶
主な焦点は、元のテストケースと同じプロパティを持つ、はるかに小さなテストケースを取得するためのコード削減戦略です。これは、従来のデルタデバッグと、既存のものと類似した、より詳細な最小化によるいくつかの IR 固有の削減(例えば、グローバルの置換、未使用の命令の削除など)によって行われます。
もしコミュニティがこの提案に反対する場合、レガシーコードはツール内に残される可能性がありますが、デルタ削減に向けてドキュメント化および設計されているという注意が必要です。
コマンドラインオプション¶
bugpoint の多くのオプションを、興味深いテストとそのテストの引数の2つだけに減らすことを提案しています。これは、CReduce、Delta、Lithium などの他のデルタ削減ツールと同様です。ツールは煩雑でなくなり、操作方法に関する不確実性もなくなります。
コードを削減するために実行される興味深いテストは、名前で指定されます。 --test=<test_name>
--test
オプションが指定されていない場合、プログラムは終了します。このオプションは、ユーザーがカスタムスクリプトを実行できるようにする bugpoint の現在の -compile-custom
オプションに似ています。
興味深いテストは、IRがユーザー定義の動作(例えば、clangでのコンパイル失敗)を達成した場合に0を返し、そうでない場合は0以外の値を返すスクリプトとして定義されます。これにより、ツールにとって何が興味深いかをユーザーが自由に決定できるようになり、テストケースを削減するプロセスが合理化されます。
テストが(入力 ll/bc ファイルを除く)引数を受け入れる場合、それらは次のフラグで指定されます。 --test_args=<test_arguments>
指定されていない場合、テストはそのまま実行されます。入力ファイルは、-compile-custom
が現在動作しているのと同じように、テストへのパラメータとして渡されることに注意してください。
実装¶
このツールは、指定されたテストケースを最小化しようとするパスのリストを持つという点で、CReduce の機能と同様に動作します。ツールの動作をモジュール化できるだけでなく、保守と拡張を容易にする必要があります。
この再設計の最初のバージョンでは、次のことを試みます。
興味深いテストに影響を与えない関数、命令、メタデータを破棄する
関数から未使用のパラメータを削除する
訪問されていない条件付きパスを削除する
変数をより規則的なもの(例えば、「a」、「b」、「c」など)に名前変更する
これらのパスが実装されたら、IR をさらに削減するために、より意味のある削減(例えば、型削減)がツールに追加されます。
過去の bugpoint の問題の背景¶
根本原因分析¶
現在、bugpoint は、入力に対してさまざまな戦略を実行してバグを分類しようとするため、特定の IR ファイルでソースの問題を見つけるのに長い時間がかかります。これにより、入力に対して複数のオプティマイザーとコンパイルパスが実行されるため、多くの時間がかかります。さらに、IR がクラッシュすると、一部の最適ではないパス(例えば、多くの到達不能なブロック)を実行して削減を試み、場合によってはまったく最小化に失敗することもあります。
「奇妙な」インターフェース¶
bugpoint の現在のインターフェースは、ユーザーを圧倒し混乱させます。ヘルプ画面だけでも、ガイダンスを提供するというより混乱を招きます。また、多数の機能とオプションがあるだけでなく、一部は予期しない方法で動作し、ほとんどの場合、ユーザーはカスタムスクリプトを使用することになります。ツールをより汎用的に役立つようにし、保守を容易にするために、インターフェースの剪定と簡素化を検討する価値があります。