英語フランス語スペイン語

Ad


OnWorksファビコン

FileCheck-3.6 - クラウド上のオンライン

Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターを介して、OnWorks の無料ホスティング プロバイダーで FileCheck-3.6 を実行します。

これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの 3.6 つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド FileCheck-XNUMX です。

プログラム:

NAME


FileCheck - 柔軟なパターン マッチング ファイル検証ツール

SYNOPSIS


ファイルチェック 一致ファイル名 [--check-prefix=XXX] [--strict-whitespace]

DESCRIPTION


ファイルチェック XNUMX つのファイルを読み取ります (XNUMX つは標準入力から、もう XNUMX つはコマンドラインで指定)
一方を使用してもう一方を検証します。 この動作は、テストスイートで特に役立ちます。
何らかのツールの出力を検証したい(例: LLC) 期待される内容が含まれています
情報 (たとえば、esp の movsd などの興味深いもの)。 これも似ています
使用します grepただし、XNUMX つのファイル内の複数の異なる入力を照合するように最適化されています。
特定の順序。

  一致ファイル名 file は、照合するパターンを含むファイルを指定します。 ファイル
検証するのは、 - 入力ファイル オプションが使用されます。

OPTIONS


-助けて コマンドラインオプションの概要を出力します。

--チェックプレフィックス 接頭辞
FileCheck は、次の内容を検索します。 一致ファイル名 パターンを一致させるため。 による
デフォルトでは、これらのパターンには接頭辞「」が付きます。小切手:". を使用したい場合は、
異なるプレフィックス (たとえば、同じ入力ファイルが複数の異なるをチェックしているため)
ツールまたはオプション)、 --チェックプレフィックス 引数では XNUMX つ以上を指定できます
一致するプレフィックス。 複数のプレフィックスは、変更される可能性のあるテストに役立ちます。
実行オプションは異なりますが、ほとんどの行は同じままです。

- 入力ファイル ファイル名
チェックするファイル (デフォルトは標準入力)。

--strict-whitespace
デフォルトでは、FileCheck は入力された水平方向の空白 (スペースとタブ) を正規化します。
そのため、これらの違いは無視されます (スペースはタブと一致します)。 の
--strict-whitespace 引数はこの動作を無効にします。 行末シーケンスは次のとおりです。
UNIX スタイルに正規化 \n すべてのモードで。

-- 暗黙のチェックしない チェック柄
ポジティブ チェックの間に、指定されたパターンの暗黙的なネガティブ チェックを追加します。
このオプションを使用すると、テストを詰め込むことなく、より厳密なテストを作成できます。 チェックしないでくださいs.

例えば、 "-- 暗黙のチェックしない 警告:" 診断をテストするときに役立ちます
次のようなオプションがないツールからのメッセージ 打ち鳴らします -確認。 これとともに
オプション FileCheck は、入力に対象外の警告が含まれていないことを検証します。
どれか 小切手: パターン。

-バージョン
このプログラムのバージョン番号を表示します。

EXIT ステータス


If ファイルチェック ファイルが予期した内容と一致することを確認すると、0 で終了します。
それ以外の場合、またはエラーが発生した場合は、ゼロ以外の値で終了します。

チュートリアル


FileCheck は通常、LLVM 回帰テストから使用され、ファイルの RUN 行で呼び出されます。
テスト。 RUN 行から FileCheck を使用する簡単な例は次のようになります。

; 実行: llvm-as < %s | llc -march=x86-64 | ファイルチェック %s

この構文は、現在のファイルをパイプ処理することを示しています ("%s")に llvm-as、それをパイプします LLCをタップし、その後、
の出力をパイプ処理します LLCファイルチェック。 これは、FileCheck がそのファイルを検証することを意味します。
指定されたファイル名引数 (元のファイル名) に対する標準入力 (llc 出力) 。NS
"で指定されたファイル%s")。これがどのように機能するかを確認するために、残りの部分を見てみましょう。 。NS file
(RUN 行の後):

void @sub1(i32* %p, i32 %v) {を定義します。
エントリ:
; チェック: サブ1:
; チェック:サブル
%0 = 末尾呼び出し i32 @llvm.atomic.load i32.p0i32(i32* %p, i32 %v)
無効にする
}

void @inc4(i64* %p) {を定義します
エントリ:
; チェック: Inc4:
; チェック: incq
%0 = 末尾呼び出し i64 @llvm.atomic.load.add.i64.p0i64(i64* %p, i64 1)
無効にする
}

ここでいくつかの「小切手:コメントで指定された行。これで、ファイルがどのように編集されるかを確認できます。
パイプで接続されています llvm-asをタップし、その後、 LLCであり、マシンコードの出力が検証対象です。
FileCheck はマシンコード出力をチェックして、それが「小切手:"行
特定。

の構文は、小切手:" 行は非常に単純です。これらは、必ず出現する固定文字列です。
注文。 FileCheck はデフォルトで水平方向の空白の違いを無視します (たとえば、空白は
タブとの一致は許可されます)、それ以外の場合は、「小切手:"行は必須です
テストファイル内の何かと正確に一致します。

FileCheck の優れた点 (grep と比較して) の XNUMX つは、テスト ケースをマージできることです。
論理グループにまとめます。 たとえば、上記のテストでは次のことをチェックしているため、
"サブ1:"と"inc4:" ラベル、がない限り一致しません。"サブル「それらの間で
ラベル。 ファイル内の別の場所に存在する場合、それはカウントされません: "grep サブル"
「」の場合に一致しますサブル" はファイル内のどこにでも存在します。

  ファイルチェック -チェックプレフィックス オプション
ファイルチェック -チェックプレフィックス オプションを使用すると、複数のテスト構成を実行できます
XNUMXつ 。NS ファイル。 これは、さまざまなテストなど、さまざまな状況で役立ちます。
アーキテクチャのバリエーション LLC。 簡単な例を次に示します。

; 実行: llvm-as < %s | llc -mtriple=i686-apple-darwin9 -mattr=sse41 \
; 実行: | ファイルチェック %s -check-prefix=X32
; 実行: llvm-as < %s | llc -mtriple=x86_64-apple-darwin9 -mattr=sse41 \
; 実行: | ファイルチェック %s -check-prefix=X64

定義 <4 x i32> @pinsrd_1(i32 %s, <4 x i32> %tmp) nounwind {
%tmp1 = 挿入要素 <4 x i32>; %tmp、i32 %s、i32 1
ret <4 x i32> %tmp1
; X32:ピンRD_1:
; X32: ピンサード $1、4(%esp)、%xmm0

; X64:ピンRD_1:
; X64: ピンサード $1、%edi、%xmm0
}

この場合、32 ビットと XNUMX ビットの両方で期待どおりのコードが生成されることをテストしています。
64ビットコード生成。

  次のチェック: 指令
行を一致させ、一致が正確に発生することを確認したい場合があります。
間に他の行がない連続した行。 この場合、「」を使用できます。小切手:"
と "次のチェック:" ディレクティブを使用してこれを指定します。カスタム チェック プレフィックスを指定した場合、
ただ「」を使ってください-次:たとえば、次のようなものは期待どおりに機能します。

定義 void @t2(<2 x double>* %r, <2 x double>* %A, double %B) {
%tmp3 = ロード <2 x double>* %A、位置合わせ 16
%tmp7 = insertelement <2 x double> undef、double %B、i32 0
%tmp9 = シャッフルベクトル <2 x double> %tmp3,
<2 x double> %tmp7,
<2×i32> <i32 0、i32 2>
ストア <2 x double> %tmp9, <2 x double>* %r, align 16
無効にする

; チェック: t2:
; チェック: movl 8(%esp)、%eax
; 次のチェック: movapd (%eax)、%xmm0
; 次のチェック: movhpd 12(%esp)、%xmm0
; 次のチェック: movl 4(%esp)、%eax
; 次のチェック: movapd %xmm0, (%eax)
; 次のチェック: ret
}

"次のチェック:" ディレクティブは、間に改行が XNUMX つだけ存在しない限り、入力を拒否します。
そして前のディレクティブ。 「」次のチェック:" をファイル内の最初のディレクティブにすることはできません。

  チェックしないでください: 指令
チェックしないでください:" ディレクティブは、XNUMX つの文字列の間に文字列が出現しないことを確認するために使用されます。
一致 (または最初の一致の前、または最後の一致の後)。 たとえば、それを確認するには
負荷が変換によって除去される場合は、次のようなテストを使用できます。

i8 @coerce_offset0(i32 %V, i32* %P) {を定義します。
ストア i32 %V、i32* %P

%P2 = ビットキャスト i32* %P から i8*
%P3 = getelementptr i8* %P2, i32 2

%A = ロード i8* %P3
ret i8 %A
; チェック: @coerce_offset0
; チェックしないでください: ロード
; チェック: ret i8
}

  チェックマーク: 指令
厳密に連続した順序で出現しない文字列を照合する必要がある場合は、
"チェックマーク:" を使用して、XNUMX つの試合の間 (または最初の試合の前、
または最後の試合の後)。 たとえば、clang は vtable グローバルを逆の順序で出力します。 使用する
チェックマーク:、チェックを自然な順序で維持できます。

// 実行: %clang_cc1 %s -emit-llvm -o - | ファイルチェック %s

struct Foo { 仮想 void メソッド(); };
ふーふ; // vtable を出力する
// チェックダグ: @_ZTV3Foo =

struct Bar { 仮想 void メソッド(); };
バーb;
// チェックダグ: @_ZTV3Bar =

チェックしないでください: ディレクティブを混在させることができます チェックマーク: 間の文字列を除外するディレクティブ
周囲 チェックマーク: 指令。 その結果、周囲は、 チェックマーク: ディレクティブ
並べ替えることはできません。つまり、すべての出現が一致します チェックマーク: チェックしないでください: してはいけません
一致するオカレンスに遅れる チェックマーク: After チェックしないでください:。 例えば、

; チェックマーク: 前
; チェックノット: いいえ
; チェックマーク: 後

この場合、入力文字列は拒否されます。 BEFORE 後に発生 AFTER.

キャプチャされた変数を使用して、 チェックマーク: DAG の有効なトポロジ順序を一致させることができます
変数の定義から使用までをエッジで説明します。 たとえば、次のような場合に便利です。
テスト ケースは、命令スケジューラからのさまざまな出力シーケンスと一致する必要があります。 のために
例、

; CHECK-DAG: [[REG1:r[0-9]+]]、r1、r2 を追加
; CHECK-DAG: [[REG2:r[0-9]+]]、r3、r4 を追加
; チェック: mul r5、[[REG1]]、[[REG2]]

この場合、その XNUMX つの順序はどちらでも構いません。 加えます 指示は許されるだろう。

定義している場合 & 同じ中で変数を使用する チェックマーク: ブロックする場合は、次のことに注意してください。
定義ルールは一致する可能性があります After その使用。

したがって、たとえば、以下のコードは合格します。

; チェック DAG: vmov.32 [[REG2:d[0-9]+]][0]
; チェック DAG: vmov.32 [[REG2]][1]
vmov.32 d0[1]
vmov.32 d0[0]

この他のコードでは次のことは行われません。

; チェック DAG: vmov.32 [[REG2:d[0-9]+]][0]
; チェック DAG: vmov.32 [[REG2]][1]
vmov.32 d1[1]
vmov.32 d0[0]

これは非常に便利ですが、危険でもあります。
シーケンスには、強い順序 (書き込みの前に読み取り、使用前にコピーなど) が必要です。 もし
テストが探している定義が一致しません (コンパイラのバグのため)。
使用から遠く離れたところで一致し、実際のバグを隠してしまう可能性があります。

このような場合、順序を強制するには、DAG ブロック間で非 DAG ディレクティブを使用します。

  チェックラベル: 指令
場合によっては、論理ブロックに分割された複数のテストを含むファイル内に、XNUMX つ以上のテストが含まれることがあります。
小切手: ディレクティブは、後のブロック内の行と一致することで誤って成功する可能性があります。 ながら
通常、エラーは最終的に生成されますが、エラーの原因としてフラグが立てられたチェックは実行されない場合があります。
実際には、問題の実際の原因と何らかの関係があります。

このような場合に、より適切なエラー メッセージを生成するには、「チェックラベル:「ディレクティブは、
利用される。 通常と同様に扱われます チェック FileCheck が作成するものを除くディレクティブ
ディレクティブと一致する行は、ディレクティブでも一致できないという追加の仮定
存在する他のチェック 一致ファイル名; これは行に使用することを目的としています
ラベルまたはその他の一意の識別子が含まれています。 概念的には、 チェックラベル
入力ストリームを個別のブロックに分割し、それぞれが独立して処理されます。
を防ぐ 小切手: あるブロック内のディレクティブが別のブロック内の行と一致する。 例えば、

%struct.C* を定義 @C_ctor_base(%struct.C* %this, i32 %x) {
エントリ:
; チェックラベル: C_ctor_base:
; チェック: mov [[SAVETHIS:r[0-9]+]], r0
; チェック: bl A_ctor_base
; チェック: mov r0、[[保存]]
%0 = %struct.C* %this を %struct.A* にビットキャストします
%call = 末尾呼び出し %struct.A* @A_ctor_base(%struct.A* %0)
%1 = %struct.C* %this を %struct.B* にビットキャストします
%call2 = 末尾呼び出し %struct.B* @B_ctor_base(%struct.B* %1, i32 %x)
ret %struct.C* %this
}

%struct.D* を定義 @D_ctor_base(%struct.D* %this, i32 %x) {
エントリ:
; チェックラベル: D_ctor_base:

の用法 チェックラベル: この場合のディレクティブは、次の XNUMX つのことを保証します。 小切手: ディレクティブ
の本文に対応する行のみを受け入れます。 @C_ctor_base 機能があったとしても、
パターンは、ファイル内で後から見つかった行と一致します。 さらに、この3つのうちのどれか一つでもあれば、 小切手:
ディレクティブが失敗した場合、FileCheck は次のブロックに進むことで回復し、複数のディレクティブを許可します。
テストの失敗は XNUMX 回の呼び出しで検出されます。

の要件はありません チェックラベル: ディレクティブには、以下に対応する文字列が含まれます。
ソース言語または出力言語の実際の構文ラベル: 単に一意に一致する必要があります。
検証中のファイル内の XNUMX 行。

チェックラベル: ディレクティブには変数の定義や使用を含めることはできません。

ファイルチェック パターン マッチング 構文
小切手:"と"チェックしないでください:" ディレクティブはどちらも一致するパターンを取ります。
FileCheck、固定文字列の一致は完全に十分です。 いくつかのことについては、もっと
マッチングの柔軟な形態が望まれます。 これをサポートするために、FileCheck では次を指定できます。
二重中括弧で囲まれた、一致する文字列内の正規表現: {{yourregex}}.
私たちが行うことの大部分で固定文字列マッチングを使用したいので、FileCheck には
通常の固定文字列マッチングとの混合およびマッチングをサポートするように設計されています。
式。 これにより、次のようなものを書くことができます。

; チェック: movhpd {{[0-9]+}}(%esp)、{{%xmm[0-7]}}

この場合、ESP レジスタからのオフセットはすべて許可され、xmm レジスタはすべて許可されます。
許可されている。

正規表現は二重中括弧で囲まれているため、視覚的に区別できます。
また、C のように二重中括弧内でエスケープ文字を使用する必要はありません。
まれに、入力から二重中括弧を明示的に一致させたい場合は、次のようにすることができます。
次のような醜いものを使用します {{[{][{]}} あなたのパターンとして。

ファイルチェック Variables
多くの場合、パターンを照合し、後でそのパターンが再び発生することを確認すると便利です。
ファイル。 codegen テストの場合、これは任意のレジスタを許可するのに役立ちますが、
register は後で一貫して使用されます。 これをする、 ファイルチェック 名前付き変数を許可します
定義してパターンに置き換えます。 簡単な例を次に示します。

; チェック: テスト5:
; チェック: 今 [[登録:%[az]+]]
; チェック: andw {{.*}}[[登録]]

最初のチェック行は正規表現と一致します %[az]+ そしてそれを変数にキャプチャします 参加申し込み.
XNUMX 行目は、その内容が何かを検証します。 参加申し込み ファイルの後半で発生します。
"そしてw". ファイルチェック 変数参照は常に以下に含まれます。 [[ ]] ペアとその
名前は正規表現を使用して形成できます [a-zA-Z][a-zA-Z0-9]*。 名前の後にコロンが続く場合、
次に、それは変数の定義です。 それ以外の場合は、それは使用です。

ファイルチェック 変数は複数回定義でき、常に最新の値を取得します。
変数は、定義した同じ行で後から使用することもできます。 例えば:

; チェック: op [[REG:r[0-9]+]]、[[REG]]

のオペランドが必要な場合に便利です。 op 同じレジスタであっても構いません
それがどのレジスタであるかを正確に示します。

ファイルチェック
場合によっては、一致ファイルの行番号を参照する出力を検証する必要がある場合があります。
たとえば、コンパイラ診断をテストするときなどです。 これにより、試合にある種の脆弱性が生じます
ファイル構造、「」小切手:" 行には、同じファイル内の絶対行番号が含まれます。
テキストの追加または削除により行番号が変更されるたびに更新する必要があります。

このケースをサポートするために、FileCheck では次の使用が許可されています。 [[@ライン]], [[@LINE+ ]],
[[@ライン- ]] パターンでの表現。 これらの式は次の数に拡張されます。
パターンが配置されている行 (オプションの整数オフセット付き)。

このようにして、一致パターンを関連するテスト ラインの近くに配置し、相対ラインを含めることができます。
数値参照。例:

// チェック: test.cpp:[[@LINE+4]]:6: エラー: 予期された ';' 最上位の宣言子の後
// 次のチェック: {{^int a}}
// 次のチェック: {{^ \^}}
// 次のチェック: {{^ ;}}
整数

onworks.net サービスを使用してオンラインで FileCheck-3.6 を使用する


無料のサーバーとワークステーション

Windows と Linux のアプリをダウンロード

Linuxコマンド

Ad