blob: 49db57161810dd15ed546a1cc8ac7e333b8e86e7 [file] [log] [blame]
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +00001FileCheck - Flexible pattern matching file verifier
2===================================================
3
4.. program:: FileCheck
5
6SYNOPSIS
7--------
8
9:program:`FileCheck` *match-filename* [*--check-prefix=XXX*] [*--strict-whitespace*]
10
11DESCRIPTION
12-----------
13
14:program:`FileCheck` reads two files (one from standard input, and one
15specified on the command line) and uses one to verify the other. This
16behavior is particularly useful for the testsuite, which wants to verify that
17the output of some tool (e.g. :program:`llc`) contains the expected information
18(for example, a movsd from esp or whatever is interesting). This is similar to
19using :program:`grep`, but it is optimized for matching multiple different
20inputs in one file in a specific order.
21
22The ``match-filename`` file specifies the file that contains the patterns to
23match. The file to verify is read from standard input unless the
24:option:`--input-file` option is used.
25
26OPTIONS
27-------
28
29Options are parsed from the environment variable ``FILECHECK_OPTS``
30and from the command line.
31
32.. option:: -help
33
34 Print a summary of command line options.
35
36.. option:: --check-prefix prefix
37
38 FileCheck searches the contents of ``match-filename`` for patterns to
39 match. By default, these patterns are prefixed with "``CHECK:``".
40 If you'd like to use a different prefix (e.g. because the same input
41 file is checking multiple different tool or options), the
42 :option:`--check-prefix` argument allows you to specify one or more
43 prefixes to match. Multiple prefixes are useful for tests which might
44 change for different run options, but most lines remain the same.
45
46.. option:: --check-prefixes prefix1,prefix2,...
47
48 An alias of :option:`--check-prefix` that allows multiple prefixes to be
49 specified as a comma separated list.
50
51.. option:: --input-file filename
52
53 File to check (defaults to stdin).
54
55.. option:: --match-full-lines
56
57 By default, FileCheck allows matches of anywhere on a line. This
58 option will require all positive matches to cover an entire
59 line. Leading and trailing whitespace is ignored, unless
60 :option:`--strict-whitespace` is also specified. (Note: negative
61 matches from ``CHECK-NOT`` are not affected by this option!)
62
63 Passing this option is equivalent to inserting ``{{^ *}}`` or
64 ``{{^}}`` before, and ``{{ *$}}`` or ``{{$}}`` after every positive
65 check pattern.
66
67.. option:: --strict-whitespace
68
69 By default, FileCheck canonicalizes input horizontal whitespace (spaces and
70 tabs) which causes it to ignore these differences (a space will match a tab).
71 The :option:`--strict-whitespace` argument disables this behavior. End-of-line
72 sequences are canonicalized to UNIX-style ``\n`` in all modes.
73
Kai Nacke5b5b2fd2019-10-11 11:59:14 +000074.. option:: --ignore-case
75
76 By default, FileCheck uses case-sensitive matching. This option causes
77 FileCheck to use case-insensitive matching.
78
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +000079.. option:: --implicit-check-not check-pattern
80
81 Adds implicit negative checks for the specified patterns between positive
82 checks. The option allows writing stricter tests without stuffing them with
83 ``CHECK-NOT``\ s.
84
85 For example, "``--implicit-check-not warning:``" can be useful when testing
86 diagnostic messages from tools that don't have an option similar to ``clang
87 -verify``. With this option FileCheck will verify that input does not contain
88 warnings not covered by any ``CHECK:`` patterns.
89
90.. option:: --dump-input <mode>
91
92 Dump input to stderr, adding annotations representing currently enabled
93 diagnostics. Do this either 'always', on 'fail', or 'never'. Specify 'help'
94 to explain the dump format and quit.
95
96.. option:: --dump-input-on-failure
97
98 When the check fails, dump all of the original input. This option is
99 deprecated in favor of `--dump-input=fail`.
100
101.. option:: --enable-var-scope
102
103 Enables scope for regex variables.
104
105 Variables with names that start with ``$`` are considered global and
106 remain set throughout the file.
107
108 All other variables get undefined after each encountered ``CHECK-LABEL``.
109
110.. option:: -D<VAR=VALUE>
111
112 Sets a filecheck pattern variable ``VAR`` with value ``VALUE`` that can be
113 used in ``CHECK:`` lines.
114
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000115.. option:: -D#<FMT>,<NUMVAR>=<NUMERIC EXPRESSION>
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000116
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000117 Sets a filecheck numeric variable ``NUMVAR`` of matching format ``FMT`` to
118 the result of evaluating ``<NUMERIC EXPRESSION>`` that can be used in
119 ``CHECK:`` lines. See section
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000120 ``FileCheck Numeric Variables and Expressions`` for details on supported
121 numeric expressions.
122
123.. option:: -version
124
125 Show the version number of this program.
126
127.. option:: -v
128
129 Print good directive pattern matches. However, if ``-input-dump=fail`` or
130 ``-input-dump=always``, add those matches as input annotations instead.
131
132.. option:: -vv
133
134 Print information helpful in diagnosing internal FileCheck issues, such as
135 discarded overlapping ``CHECK-DAG:`` matches, implicit EOF pattern matches,
136 and ``CHECK-NOT:`` patterns that do not have matches. Implies ``-v``.
137 However, if ``-input-dump=fail`` or ``-input-dump=always``, just add that
138 information as input annotations instead.
139
140.. option:: --allow-deprecated-dag-overlap
141
142 Enable overlapping among matches in a group of consecutive ``CHECK-DAG:``
143 directives. This option is deprecated and is only provided for convenience
144 as old tests are migrated to the new non-overlapping ``CHECK-DAG:``
145 implementation.
146
147.. option:: --color
148
149 Use colors in output (autodetected by default).
150
151EXIT STATUS
152-----------
153
154If :program:`FileCheck` verifies that the file matches the expected contents,
155it exits with 0. Otherwise, if not, or if an error occurs, it will exit with a
156non-zero value.
157
158TUTORIAL
159--------
160
161FileCheck is typically used from LLVM regression tests, being invoked on the RUN
162line of the test. A simple example of using FileCheck from a RUN line looks
163like this:
164
165.. code-block:: llvm
166
167 ; RUN: llvm-as < %s | llc -march=x86-64 | FileCheck %s
168
169This syntax says to pipe the current file ("``%s``") into ``llvm-as``, pipe
170that into ``llc``, then pipe the output of ``llc`` into ``FileCheck``. This
171means that FileCheck will be verifying its standard input (the llc output)
172against the filename argument specified (the original ``.ll`` file specified by
173"``%s``"). To see how this works, let's look at the rest of the ``.ll`` file
174(after the RUN line):
175
176.. code-block:: llvm
177
178 define void @sub1(i32* %p, i32 %v) {
179 entry:
180 ; CHECK: sub1:
181 ; CHECK: subl
182 %0 = tail call i32 @llvm.atomic.load.sub.i32.p0i32(i32* %p, i32 %v)
183 ret void
184 }
185
186 define void @inc4(i64* %p) {
187 entry:
188 ; CHECK: inc4:
189 ; CHECK: incq
190 %0 = tail call i64 @llvm.atomic.load.add.i64.p0i64(i64* %p, i64 1)
191 ret void
192 }
193
194Here you can see some "``CHECK:``" lines specified in comments. Now you can
195see how the file is piped into ``llvm-as``, then ``llc``, and the machine code
196output is what we are verifying. FileCheck checks the machine code output to
197verify that it matches what the "``CHECK:``" lines specify.
198
199The syntax of the "``CHECK:``" lines is very simple: they are fixed strings that
200must occur in order. FileCheck defaults to ignoring horizontal whitespace
201differences (e.g. a space is allowed to match a tab) but otherwise, the contents
202of the "``CHECK:``" line is required to match some thing in the test file exactly.
203
204One nice thing about FileCheck (compared to grep) is that it allows merging
205test cases together into logical groups. For example, because the test above
206is checking for the "``sub1:``" and "``inc4:``" labels, it will not match
207unless there is a "``subl``" in between those labels. If it existed somewhere
208else in the file, that would not count: "``grep subl``" matches if "``subl``"
209exists anywhere in the file.
210
211The FileCheck -check-prefix option
212~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
213
214The FileCheck `-check-prefix` option allows multiple test
215configurations to be driven from one `.ll` file. This is useful in many
216circumstances, for example, testing different architectural variants with
217:program:`llc`. Here's a simple example:
218
219.. code-block:: llvm
220
221 ; RUN: llvm-as < %s | llc -mtriple=i686-apple-darwin9 -mattr=sse41 \
222 ; RUN: | FileCheck %s -check-prefix=X32
223 ; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin9 -mattr=sse41 \
224 ; RUN: | FileCheck %s -check-prefix=X64
225
226 define <4 x i32> @pinsrd_1(i32 %s, <4 x i32> %tmp) nounwind {
227 %tmp1 = insertelement <4 x i32>; %tmp, i32 %s, i32 1
228 ret <4 x i32> %tmp1
229 ; X32: pinsrd_1:
230 ; X32: pinsrd $1, 4(%esp), %xmm0
231
232 ; X64: pinsrd_1:
233 ; X64: pinsrd $1, %edi, %xmm0
234 }
235
236In this case, we're testing that we get the expected code generation with
237both 32-bit and 64-bit code generation.
238
239The "CHECK-NEXT:" directive
240~~~~~~~~~~~~~~~~~~~~~~~~~~~
241
242Sometimes you want to match lines and would like to verify that matches
243happen on exactly consecutive lines with no other lines in between them. In
244this case, you can use "``CHECK:``" and "``CHECK-NEXT:``" directives to specify
245this. If you specified a custom check prefix, just use "``<PREFIX>-NEXT:``".
246For example, something like this works as you'd expect:
247
248.. code-block:: llvm
249
250 define void @t2(<2 x double>* %r, <2 x double>* %A, double %B) {
251 %tmp3 = load <2 x double>* %A, align 16
252 %tmp7 = insertelement <2 x double> undef, double %B, i32 0
253 %tmp9 = shufflevector <2 x double> %tmp3,
254 <2 x double> %tmp7,
255 <2 x i32> < i32 0, i32 2 >
256 store <2 x double> %tmp9, <2 x double>* %r, align 16
257 ret void
258
259 ; CHECK: t2:
260 ; CHECK: movl 8(%esp), %eax
261 ; CHECK-NEXT: movapd (%eax), %xmm0
262 ; CHECK-NEXT: movhpd 12(%esp), %xmm0
263 ; CHECK-NEXT: movl 4(%esp), %eax
264 ; CHECK-NEXT: movapd %xmm0, (%eax)
265 ; CHECK-NEXT: ret
266 }
267
268"``CHECK-NEXT:``" directives reject the input unless there is exactly one
269newline between it and the previous directive. A "``CHECK-NEXT:``" cannot be
270the first directive in a file.
271
272The "CHECK-SAME:" directive
273~~~~~~~~~~~~~~~~~~~~~~~~~~~
274
275Sometimes you want to match lines and would like to verify that matches happen
276on the same line as the previous match. In this case, you can use "``CHECK:``"
277and "``CHECK-SAME:``" directives to specify this. If you specified a custom
278check prefix, just use "``<PREFIX>-SAME:``".
279
280"``CHECK-SAME:``" is particularly powerful in conjunction with "``CHECK-NOT:``"
281(described below).
282
283For example, the following works like you'd expect:
284
285.. code-block:: llvm
286
287 !0 = !DILocation(line: 5, scope: !1, inlinedAt: !2)
288
289 ; CHECK: !DILocation(line: 5,
290 ; CHECK-NOT: column:
291 ; CHECK-SAME: scope: ![[SCOPE:[0-9]+]]
292
293"``CHECK-SAME:``" directives reject the input if there are any newlines between
294it and the previous directive. A "``CHECK-SAME:``" cannot be the first
295directive in a file.
296
297The "CHECK-EMPTY:" directive
298~~~~~~~~~~~~~~~~~~~~~~~~~~~~
299
300If you need to check that the next line has nothing on it, not even whitespace,
301you can use the "``CHECK-EMPTY:``" directive.
302
303.. code-block:: llvm
304
305 declare void @foo()
306
307 declare void @bar()
308 ; CHECK: foo
309 ; CHECK-EMPTY:
310 ; CHECK-NEXT: bar
311
312Just like "``CHECK-NEXT:``" the directive will fail if there is more than one
313newline before it finds the next blank line, and it cannot be the first
314directive in a file.
315
316The "CHECK-NOT:" directive
317~~~~~~~~~~~~~~~~~~~~~~~~~~
318
319The "``CHECK-NOT:``" directive is used to verify that a string doesn't occur
320between two matches (or before the first match, or after the last match). For
321example, to verify that a load is removed by a transformation, a test like this
322can be used:
323
324.. code-block:: llvm
325
326 define i8 @coerce_offset0(i32 %V, i32* %P) {
327 store i32 %V, i32* %P
328
329 %P2 = bitcast i32* %P to i8*
330 %P3 = getelementptr i8* %P2, i32 2
331
332 %A = load i8* %P3
333 ret i8 %A
334 ; CHECK: @coerce_offset0
335 ; CHECK-NOT: load
336 ; CHECK: ret i8
337 }
338
339The "CHECK-COUNT:" directive
340~~~~~~~~~~~~~~~~~~~~~~~~~~~~
341
342If you need to match multiple lines with the same pattern over and over again
343you can repeat a plain ``CHECK:`` as many times as needed. If that looks too
344boring you can instead use a counted check "``CHECK-COUNT-<num>:``", where
345``<num>`` is a positive decimal number. It will match the pattern exactly
346``<num>`` times, no more and no less. If you specified a custom check prefix,
347just use "``<PREFIX>-COUNT-<num>:``" for the same effect.
348Here is a simple example:
349
350.. code-block:: text
351
352 Loop at depth 1
353 Loop at depth 1
354 Loop at depth 1
355 Loop at depth 1
356 Loop at depth 2
357 Loop at depth 3
358
359 ; CHECK-COUNT-6: Loop at depth {{[0-9]+}}
360 ; CHECK-NOT: Loop at depth {{[0-9]+}}
361
362The "CHECK-DAG:" directive
363~~~~~~~~~~~~~~~~~~~~~~~~~~
364
365If it's necessary to match strings that don't occur in a strictly sequential
366order, "``CHECK-DAG:``" could be used to verify them between two matches (or
367before the first match, or after the last match). For example, clang emits
368vtable globals in reverse order. Using ``CHECK-DAG:``, we can keep the checks
369in the natural order:
370
371.. code-block:: c++
372
373 // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
374
375 struct Foo { virtual void method(); };
376 Foo f; // emit vtable
377 // CHECK-DAG: @_ZTV3Foo =
378
379 struct Bar { virtual void method(); };
380 Bar b;
381 // CHECK-DAG: @_ZTV3Bar =
382
383``CHECK-NOT:`` directives could be mixed with ``CHECK-DAG:`` directives to
384exclude strings between the surrounding ``CHECK-DAG:`` directives. As a result,
385the surrounding ``CHECK-DAG:`` directives cannot be reordered, i.e. all
386occurrences matching ``CHECK-DAG:`` before ``CHECK-NOT:`` must not fall behind
387occurrences matching ``CHECK-DAG:`` after ``CHECK-NOT:``. For example,
388
389.. code-block:: llvm
390
391 ; CHECK-DAG: BEFORE
392 ; CHECK-NOT: NOT
393 ; CHECK-DAG: AFTER
394
395This case will reject input strings where ``BEFORE`` occurs after ``AFTER``.
396
397With captured variables, ``CHECK-DAG:`` is able to match valid topological
398orderings of a DAG with edges from the definition of a variable to its use.
399It's useful, e.g., when your test cases need to match different output
400sequences from the instruction scheduler. For example,
401
402.. code-block:: llvm
403
404 ; CHECK-DAG: add [[REG1:r[0-9]+]], r1, r2
405 ; CHECK-DAG: add [[REG2:r[0-9]+]], r3, r4
406 ; CHECK: mul r5, [[REG1]], [[REG2]]
407
408In this case, any order of that two ``add`` instructions will be allowed.
409
410If you are defining `and` using variables in the same ``CHECK-DAG:`` block,
411be aware that the definition rule can match `after` its use.
412
413So, for instance, the code below will pass:
414
415.. code-block:: text
416
417 ; CHECK-DAG: vmov.32 [[REG2:d[0-9]+]][0]
418 ; CHECK-DAG: vmov.32 [[REG2]][1]
419 vmov.32 d0[1]
420 vmov.32 d0[0]
421
422While this other code, will not:
423
424.. code-block:: text
425
426 ; CHECK-DAG: vmov.32 [[REG2:d[0-9]+]][0]
427 ; CHECK-DAG: vmov.32 [[REG2]][1]
428 vmov.32 d1[1]
429 vmov.32 d0[0]
430
431While this can be very useful, it's also dangerous, because in the case of
432register sequence, you must have a strong order (read before write, copy before
433use, etc). If the definition your test is looking for doesn't match (because
434of a bug in the compiler), it may match further away from the use, and mask
435real bugs away.
436
437In those cases, to enforce the order, use a non-DAG directive between DAG-blocks.
438
439A ``CHECK-DAG:`` directive skips matches that overlap the matches of any
440preceding ``CHECK-DAG:`` directives in the same ``CHECK-DAG:`` block. Not only
441is this non-overlapping behavior consistent with other directives, but it's
442also necessary to handle sets of non-unique strings or patterns. For example,
443the following directives look for unordered log entries for two tasks in a
444parallel program, such as the OpenMP runtime:
445
446.. code-block:: text
447
448 // CHECK-DAG: [[THREAD_ID:[0-9]+]]: task_begin
449 // CHECK-DAG: [[THREAD_ID]]: task_end
450 //
451 // CHECK-DAG: [[THREAD_ID:[0-9]+]]: task_begin
452 // CHECK-DAG: [[THREAD_ID]]: task_end
453
454The second pair of directives is guaranteed not to match the same log entries
455as the first pair even though the patterns are identical and even if the text
456of the log entries is identical because the thread ID manages to be reused.
457
458The "CHECK-LABEL:" directive
459~~~~~~~~~~~~~~~~~~~~~~~~~~~~
460
461Sometimes in a file containing multiple tests divided into logical blocks, one
462or more ``CHECK:`` directives may inadvertently succeed by matching lines in a
463later block. While an error will usually eventually be generated, the check
464flagged as causing the error may not actually bear any relationship to the
465actual source of the problem.
466
467In order to produce better error messages in these cases, the "``CHECK-LABEL:``"
468directive can be used. It is treated identically to a normal ``CHECK``
469directive except that FileCheck makes an additional assumption that a line
470matched by the directive cannot also be matched by any other check present in
471``match-filename``; this is intended to be used for lines containing labels or
472other unique identifiers. Conceptually, the presence of ``CHECK-LABEL`` divides
473the input stream into separate blocks, each of which is processed independently,
474preventing a ``CHECK:`` directive in one block matching a line in another block.
475If ``--enable-var-scope`` is in effect, all local variables are cleared at the
476beginning of the block.
477
478For example,
479
480.. code-block:: llvm
481
482 define %struct.C* @C_ctor_base(%struct.C* %this, i32 %x) {
483 entry:
484 ; CHECK-LABEL: C_ctor_base:
485 ; CHECK: mov [[SAVETHIS:r[0-9]+]], r0
486 ; CHECK: bl A_ctor_base
487 ; CHECK: mov r0, [[SAVETHIS]]
488 %0 = bitcast %struct.C* %this to %struct.A*
489 %call = tail call %struct.A* @A_ctor_base(%struct.A* %0)
490 %1 = bitcast %struct.C* %this to %struct.B*
491 %call2 = tail call %struct.B* @B_ctor_base(%struct.B* %1, i32 %x)
492 ret %struct.C* %this
493 }
494
495 define %struct.D* @D_ctor_base(%struct.D* %this, i32 %x) {
496 entry:
497 ; CHECK-LABEL: D_ctor_base:
498
499The use of ``CHECK-LABEL:`` directives in this case ensures that the three
500``CHECK:`` directives only accept lines corresponding to the body of the
501``@C_ctor_base`` function, even if the patterns match lines found later in
502the file. Furthermore, if one of these three ``CHECK:`` directives fail,
503FileCheck will recover by continuing to the next block, allowing multiple test
504failures to be detected in a single invocation.
505
506There is no requirement that ``CHECK-LABEL:`` directives contain strings that
507correspond to actual syntactic labels in a source or output language: they must
508simply uniquely match a single line in the file being verified.
509
510``CHECK-LABEL:`` directives cannot contain variable definitions or uses.
511
512FileCheck Regex Matching Syntax
513~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
514
515All FileCheck directives take a pattern to match.
516For most uses of FileCheck, fixed string matching is perfectly sufficient. For
517some things, a more flexible form of matching is desired. To support this,
518FileCheck allows you to specify regular expressions in matching strings,
519surrounded by double braces: ``{{yourregex}}``. FileCheck implements a POSIX
520regular expression matcher; it supports Extended POSIX regular expressions
521(ERE). Because we want to use fixed string matching for a majority of what we
522do, FileCheck has been designed to support mixing and matching fixed string
523matching with regular expressions. This allows you to write things like this:
524
525.. code-block:: llvm
526
527 ; CHECK: movhpd {{[0-9]+}}(%esp), {{%xmm[0-7]}}
528
529In this case, any offset from the ESP register will be allowed, and any xmm
530register will be allowed.
531
532Because regular expressions are enclosed with double braces, they are
533visually distinct, and you don't need to use escape characters within the double
534braces like you would in C. In the rare case that you want to match double
535braces explicitly from the input, you can use something ugly like
536``{{[}][}]}}`` as your pattern. Or if you are using the repetition count
537syntax, for example ``[[:xdigit:]]{8}`` to match exactly 8 hex digits, you
538would need to add parentheses like this ``{{([[:xdigit:]]{8})}}`` to avoid
539confusion with FileCheck's closing double-brace.
540
541FileCheck String Substitution Blocks
542~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
543
544It is often useful to match a pattern and then verify that it occurs again
545later in the file. For codegen tests, this can be useful to allow any
546register, but verify that that register is used consistently later. To do
547this, :program:`FileCheck` supports string substitution blocks that allow
548string variables to be defined and substituted into patterns. Here is a simple
549example:
550
551.. code-block:: llvm
552
553 ; CHECK: test5:
554 ; CHECK: notw [[REGISTER:%[a-z]+]]
555 ; CHECK: andw {{.*}}[[REGISTER]]
556
557The first check line matches a regex ``%[a-z]+`` and captures it into the
558string variable ``REGISTER``. The second line verifies that whatever is in
559``REGISTER`` occurs later in the file after an "``andw``". :program:`FileCheck`
560string substitution blocks are always contained in ``[[ ]]`` pairs, and string
561variable names can be formed with the regex ``[a-zA-Z_][a-zA-Z0-9_]*``. If a
562colon follows the name, then it is a definition of the variable; otherwise, it
563is a substitution.
564
565:program:`FileCheck` variables can be defined multiple times, and substitutions
566always get the latest value. Variables can also be substituted later on the
567same line they were defined on. For example:
568
569.. code-block:: llvm
570
571 ; CHECK: op [[REG:r[0-9]+]], [[REG]]
572
573Can be useful if you want the operands of ``op`` to be the same register,
574and don't care exactly which register it is.
575
576If ``--enable-var-scope`` is in effect, variables with names that
577start with ``$`` are considered to be global. All others variables are
578local. All local variables get undefined at the beginning of each
579CHECK-LABEL block. Global variables are not affected by CHECK-LABEL.
580This makes it easier to ensure that individual tests are not affected
581by variables set in preceding tests.
582
583FileCheck Numeric Substitution Blocks
584~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
585
586:program:`FileCheck` also supports numeric substitution blocks that allow
587defining numeric variables and checking for numeric values that satisfy a
588numeric expression constraint based on those variables via a numeric
589substitution. This allows ``CHECK:`` directives to verify a numeric relation
590between two numbers, such as the need for consecutive registers to be used.
591
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000592The syntax to define a numeric variable is ``[[#%<fmtspec>,<NUMVAR>:]]`` where:
593
594* ``%<fmtspec>`` is an optional scanf-style matching format specifier to
595 indicate what number format to match (e.g. hex number). Currently accepted
596 format specifiers are ``%u``, ``%x`` and ``%X``. If absent, the format
597 specifier defaults to ``%u``.
598
599* ``<NUMVAR>`` is the name of the numeric variable to define to the matching
600 value.
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000601
602For example:
603
604.. code-block:: llvm
605
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000606 ; CHECK: mov r[[#REG:]], 0x[[#%X,IMM:]]
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000607
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000608would match ``mov r5, 0xF0F0`` and set ``REG`` to the value ``5`` and ``IMM``
609to the value ``0xF0F0``.
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000610
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000611The syntax of a numeric substitution is ``[[#%<fmtspec>,<expr>]]`` where:
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000612
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000613* ``%<fmtspec>`` is the same matching format specifier as for defining numeric
614 variables but acting as a printf-style format to indicate how a numeric
615 expression value should be matched against. If absent, the format specifier
616 is inferred from the matching format of the numeric variable(s) used by the
617 expression constraint if any, and defaults to ``%u`` if no numeric variable
618 is used. In case of conflict between matching formats of several numeric
619 variables the format specifier is mandatory.
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000620
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000621* ``<expr>`` is an expression. An expression is in turn recursively defined
622 as:
623
624 * a numeric operand, or
625 * an expression followed by an operator and a numeric operand.
626
627 A numeric operand is a previously defined numeric variable, or an integer
628 literal. The supported operators are ``+`` and ``-``. Spaces are accepted
629 before, after and between any of these elements.
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000630
631For example:
632
633.. code-block:: llvm
634
635 ; CHECK: load r[[#REG:]], [r0]
636 ; CHECK: load r[[#REG+1]], [r1]
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000637 ; CHECK: Loading from 0x[[#%x,ADDR:] to 0x[[#ADDR + 7]]
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000638
639The above example would match the text:
640
641.. code-block:: gas
642
643 load r5, [r0]
644 load r6, [r1]
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000645 Loading from 0xa0463440 to 0xa0463447
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000646
647but would not match the text:
648
649.. code-block:: gas
650
651 load r5, [r0]
652 load r7, [r1]
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000653 Loading from 0xa0463440 to 0xa0463443
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000654
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000655Due to ``7`` being unequal to ``5 + 1`` and ``a0463443`` being unequal to
656``a0463440 + 7``.
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000657
658The syntax also supports an empty expression, equivalent to writing {{[0-9]+}},
659for cases where the input must contain a numeric value but the value itself
660does not matter:
661
662.. code-block:: gas
663
664 ; CHECK-NOT: mov r0, r[[#]]
665
666to check that a value is synthesized rather than moved around.
667
668A numeric variable can also be defined to the result of a numeric expression,
669in which case the numeric expression is checked and if verified the variable is
670assigned to the value. The unified syntax for both defining numeric variables
Thomas Preud'homme8e966972019-03-05 23:20:29 +0000671and checking a numeric expression is thus ``[[#%<fmtspec>,<NUMVAR>: <expr>]]``
672with each element as described previously. One can use this syntax to make a
673testcase more self-describing by using variables instead of values:
674
675.. code-block:: gas
676
677 ; CHECK: mov r[[#REG_OFFSET:]], 0x[[#%X,FIELD_OFFSET:12]]
678 ; CHECK-NEXT: load r[[#]], [r[[#REG_BASE:]], r[[#REG_OFFSET]]]
679
680which would match:
681
682.. code-block:: gas
683
684 mov r4, 0xC
685 load r6, [r5, r4]
Dmitri Gribenkod3aed7f2019-10-10 14:27:14 +0000686
687The ``--enable-var-scope`` option has the same effect on numeric variables as
688on string variables.
689
690Important note: In its current implementation, an expression cannot use a
691numeric variable defined earlier in the same CHECK directive.
692
693FileCheck Pseudo Numeric Variables
694~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
695
696Sometimes there's a need to verify output that contains line numbers of the
697match file, e.g. when testing compiler diagnostics. This introduces a certain
698fragility of the match file structure, as "``CHECK:``" lines contain absolute
699line numbers in the same file, which have to be updated whenever line numbers
700change due to text addition or deletion.
701
702To support this case, FileCheck expressions understand the ``@LINE`` pseudo
703numeric variable which evaluates to the line number of the CHECK pattern where
704it is found.
705
706This way match patterns can be put near the relevant test lines and include
707relative line number references, for example:
708
709.. code-block:: c++
710
711 // CHECK: test.cpp:[[# @LINE + 4]]:6: error: expected ';' after top level declarator
712 // CHECK-NEXT: {{^int a}}
713 // CHECK-NEXT: {{^ \^}}
714 // CHECK-NEXT: {{^ ;}}
715 int a
716
717To support legacy uses of ``@LINE`` as a special string variable,
718:program:`FileCheck` also accepts the following uses of ``@LINE`` with string
719substitution block syntax: ``[[@LINE]]``, ``[[@LINE+<offset>]]`` and
720``[[@LINE-<offset>]]`` without any spaces inside the brackets and where
721``offset`` is an integer.
722
723Matching Newline Characters
724~~~~~~~~~~~~~~~~~~~~~~~~~~~
725
726To match newline characters in regular expressions the character class
727``[[:space:]]`` can be used. For example, the following pattern:
728
729.. code-block:: c++
730
731 // CHECK: DW_AT_location [DW_FORM_sec_offset] ([[DLOC:0x[0-9a-f]+]]){{[[:space:]].*}}"intd"
732
733matches output of the form (from llvm-dwarfdump):
734
735.. code-block:: text
736
737 DW_AT_location [DW_FORM_sec_offset] (0x00000233)
738 DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000c9] = "intd")
739
740letting us set the :program:`FileCheck` variable ``DLOC`` to the desired value
741``0x00000233``, extracted from the line immediately preceding "``intd``".