[llvm] r230612 - FileCheck: Add CHECK-SAME
Sean Silva
chisophugis at gmail.com
Wed Mar 4 21:20:28 PST 2015
Please add a section to CommandGuide/FileCheck.rst like the other
directives.
-- Sean Silva
On Wed, Feb 25, 2015 at 8:53 PM, Duncan P. N. Exon Smith <
dexonsmith at apple.com> wrote:
> Author: dexonsmith
> Date: Wed Feb 25 22:53:00 2015
> New Revision: 230612
>
> URL: http://llvm.org/viewvc/llvm-project?rev=230612&view=rev
> Log:
> FileCheck: Add CHECK-SAME
>
> Add `CHECK-SAME`, which requires that the pattern matches on the *same*
> line as the previous `CHECK`/`CHECK-NEXT` -- in other words, no newline
> is allowed in the skipped region. This is similar to `CHECK-NEXT`,
> which requires exactly 1 newline in the skipped region.
>
> My motivation is to simplify checking the long lines of LLVM assembly
> for the new debug info hierarchy. This allows CHECK sequences like the
> following:
>
> CHECK: ![[REF]] = !SomeMDNode(
> CHECK-SAME: file: ![[FILE:[0-9]+]]
> CHECK-SAME: otherField: 93{{[,)]}}
>
> which is equivalent to:
>
> CHECK: ![[REF]] = !SomeMDNode({{.*}}file:
> ![[FILE:[0-9]+]]{{.*}}otherField: 93{{[,)]}}
>
> While this example just has two fields, many nodes in debug info have
> more than that. `CHECK-SAME` will keep the logic easy to follow.
>
> Morever, it enables interleaving `CHECK-NOT`s without allowing newlines.
> Consider the following:
>
> CHECK: ![[REF]] = !SomeMDNode(
> CHECK-SAME: file: ![[FILE:[0-9]+]]
> CHECK-NOT: unexpectedField:
> CHECK-SAME: otherField: 93{{[,)]}}
> CHECK-NOT: otherUnexpectedField:
> CHECK-SAME: )
>
> which doesn't seem to have an equivalent `CHECK` line.
>
> Added:
> llvm/trunk/test/FileCheck/same.txt
> Modified:
> llvm/trunk/utils/FileCheck/FileCheck.cpp
>
> Added: llvm/trunk/test/FileCheck/same.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/FileCheck/same.txt?rev=230612&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/FileCheck/same.txt (added)
> +++ llvm/trunk/test/FileCheck/same.txt Wed Feb 25 22:53:00 2015
> @@ -0,0 +1,23 @@
> +foo bat bar
> +baz
> +
> +RUN: FileCheck --input-file=%s --check-prefix=PASS1 %s
> +PASS1: foo
> +PASS1-SAME: bat
> +PASS1-SAME: bar
> +PASS1-NEXT: baz
> +
> +RUN: FileCheck --input-file=%s --check-prefix=PASS2 %s
> +PASS2: foo
> +PASS2-NOT: baz
> +PASS2-SAME: bar
> +PASS2-NEXT: baz
> +
> +RUN: not FileCheck --input-file=%s --check-prefix=FAIL1 %s
> +FAIL1: foo
> +FAIL1-SAME: baz
> +
> +RUN: not FileCheck --input-file=%s --check-prefix=FAIL2 %s
> +FAIL2: foo
> +FAIL2-NOT: bat
> +FAIL2-SAME: bar
>
> Modified: llvm/trunk/utils/FileCheck/FileCheck.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/FileCheck/FileCheck.cpp?rev=230612&r1=230611&r2=230612&view=diff
>
> ==============================================================================
> --- llvm/trunk/utils/FileCheck/FileCheck.cpp (original)
> +++ llvm/trunk/utils/FileCheck/FileCheck.cpp Wed Feb 25 22:53:00 2015
> @@ -73,6 +73,7 @@ namespace Check {
> CheckNone = 0,
> CheckPlain,
> CheckNext,
> + CheckSame,
> CheckNot,
> CheckDAG,
> CheckLabel,
> @@ -620,6 +621,9 @@ struct CheckString {
> /// CheckNext - Verify there is a single line in the given buffer.
> bool CheckNext(const SourceMgr &SM, StringRef Buffer) const;
>
> + /// CheckSame - Verify there is no newline in the given buffer.
> + bool CheckSame(const SourceMgr &SM, StringRef Buffer) const;
> +
> /// CheckNot - Verify there's no "not strings" in the given buffer.
> bool CheckNot(const SourceMgr &SM, StringRef Buffer,
> const std::vector<const Pattern *> &NotStrings,
> @@ -683,6 +687,9 @@ static size_t CheckTypeSize(Check::Check
> case Check::CheckNext:
> return sizeof("-NEXT:") - 1;
>
> + case Check::CheckSame:
> + return sizeof("-SAME:") - 1;
> +
> case Check::CheckNot:
> return sizeof("-NOT:") - 1;
>
> @@ -713,6 +720,9 @@ static Check::CheckType FindCheckType(St
> if (Rest.startswith("NEXT:"))
> return Check::CheckNext;
>
> + if (Rest.startswith("SAME:"))
> + return Check::CheckSame;
> +
> if (Rest.startswith("NOT:"))
> return Check::CheckNot;
>
> @@ -919,10 +929,12 @@ static bool ReadCheckFile(SourceMgr &SM,
> Buffer = Buffer.substr(EOL);
>
> // Verify that CHECK-NEXT lines have at least one CHECK line before
> them.
> - if ((CheckTy == Check::CheckNext) && CheckStrings.empty()) {
> + if ((CheckTy == Check::CheckNext || CheckTy == Check::CheckSame) &&
> + CheckStrings.empty()) {
> + StringRef Type = CheckTy == Check::CheckNext ? "NEXT" : "SAME";
> SM.PrintMessage(SMLoc::getFromPointer(UsedPrefixStart),
> SourceMgr::DK_Error,
> - "found '" + UsedPrefix + "-NEXT:' without previous
> '"
> + "found '" + UsedPrefix + "-" + Type + "' without
> previous '"
> + UsedPrefix + ": line");
> return true;
> }
> @@ -1053,6 +1065,11 @@ size_t CheckString::Check(const SourceMg
> if (CheckNext(SM, SkippedRegion))
> return StringRef::npos;
>
> + // If this check is a "CHECK-SAME", verify that the previous match
> was on
> + // the same line (i.e. that there is no newline between them).
> + if (CheckSame(SM, SkippedRegion))
> + return StringRef::npos;
> +
> // If this match had "not strings", verify that they don't exist in
> the
> // skipped region.
> if (CheckNot(SM, SkippedRegion, NotStrings, VariableTable))
> @@ -1098,6 +1115,34 @@ bool CheckString::CheckNext(const Source
> return true;
> }
>
> + return false;
> +}
> +
> +bool CheckString::CheckSame(const SourceMgr &SM, StringRef Buffer) const {
> + if (CheckTy != Check::CheckSame)
> + return false;
> +
> + // Count the number of newlines between the previous match and this one.
> + assert(Buffer.data() !=
> + SM.getMemoryBuffer(SM.FindBufferContainingLoc(
> + SMLoc::getFromPointer(Buffer.data())))
> + ->getBufferStart() &&
> + "CHECK-SAME can't be the first check in a file");
> +
> + const char *FirstNewLine = nullptr;
> + unsigned NumNewLines = CountNumNewlinesBetween(Buffer, FirstNewLine);
> +
> + if (NumNewLines != 0) {
> + SM.PrintMessage(Loc, SourceMgr::DK_Error,
> + Prefix +
> + "-SAME: is not on the same line as the previous
> match");
> + SM.PrintMessage(SMLoc::getFromPointer(Buffer.end()),
> SourceMgr::DK_Note,
> + "'next' match was here");
> + SM.PrintMessage(SMLoc::getFromPointer(Buffer.data()),
> SourceMgr::DK_Note,
> + "previous match ended here");
> + return true;
> + }
> +
> return false;
> }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150304/eee34aa7/attachment.html>
More information about the llvm-commits
mailing list