Summary:
This patch is part of a patch series to add support for FileCheck
numeric expressions. This specific patch adds support for selecting a
matching format to match a numeric value against (ie. decimal, hex lower
case letters or hex upper case letters).
This commit allows to select what format a numeric value should be
matched against. The following formats are supported: decimal value,
lower case hex value and upper case hex value. Matching formats impact
both the format of numeric value to be matched as well as the format of
accepted numbers in a definition with empty numeric expression
constraint.
Default for absence of format is decimal value unless the numeric
expression constraint is non null and use a variable in which case the
format is the one used to define that variable. Conclict of format in
case of several variable being used is diagnosed and forces the user to
select a matching format explicitely.
This commit also enables immediates in numeric expressions to be in any
radix known to StringRef's GetAsInteger method, except for legacy
numeric expressions (ie [[@LINE+<offset>]] which only support decimal
immediates.
Copyright:
- Linaro (changes up to diff 183612 of revision D55940)
- GraphCore (changes in later versions of revision D55940 and
in new revision created off D55940)
Reviewers: jhenderson, chandlerc, jdenny, probinson, grimar, arichardson
Reviewed By: jhenderson, arichardson
Subscribers: daltenty, MaskRay, hiraditya, llvm-commits, probinson, dblaikie, grimar, arichardson, kristina, hfinkel, rogfer01, JonChesterfield
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D60389
374 lines
13 KiB
Plaintext
374 lines
13 KiB
Plaintext
RUN: FileCheck --input-file %s %s
|
|
|
|
; We use CHECK-NEXT directives to force a match on all lines with digits.
|
|
|
|
; Numeric variable definition with default matching format without spaces.
|
|
DEF DEFAULT FMT NO SPC
|
|
10
|
|
CHECK-LABEL: DEF DEFAULT FMT NO SPC
|
|
CHECK-NEXT: [[#VAR1:]]
|
|
|
|
; Numeric variable definition with default matching format with different
|
|
; spacing.
|
|
DEF DEFAULT FMT SPC
|
|
11
|
|
11
|
|
11
|
|
CHECK-LABEL: DEF DEFAULT FMT SPC
|
|
CHECK-NEXT: [[# VAR1a:]]
|
|
CHECK-NEXT: [[# VAR1b :]]
|
|
CHECK-NEXT: [[# VAR1c : ]]
|
|
|
|
; Numeric variable redefinition.
|
|
REDEF NO SPC
|
|
11
|
|
CHECK-LABEL: REDEF
|
|
CHECK-NEXT: [[#VAR1:]]
|
|
|
|
; Numeric variable definition with explicit matching format.
|
|
DEF FMT
|
|
c
|
|
D
|
|
CHECK-LABEL: DEF FMT
|
|
CHECK-NEXT: [[#%x,VAR2:]]
|
|
CHECK-NEXT: [[#%X,VAR3:]]
|
|
|
|
; Numeric variable definition with explicit matching format with different
|
|
; spacing.
|
|
DEF FMT SPC
|
|
c
|
|
CHECK-LABEL: DEF FMT SPC
|
|
CHECK-NEXT: [[# %x , VAR2a : ]]
|
|
|
|
; Numeric variable definition with unsupported matching format.
|
|
RUN: not FileCheck --check-prefixes ERR,INVALID-FMT-SPEC1 --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --check-prefix INVALID-FMT-SPEC-MSG1 --strict-whitespace %s
|
|
RUN: not FileCheck --check-prefixes ERR,INVALID-FMT-SPEC2 --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --check-prefix INVALID-FMT-SPEC-MSG2 --strict-whitespace %s
|
|
|
|
DEF INVALID FMT
|
|
INVVAR1=a
|
|
INVVAR2=11
|
|
ERR-LABEL: DEF INVALID FMT
|
|
INVALID-FMT-SPEC1-NEXT: INVVAR1=[[#%c,INVVAR1:]]
|
|
INVALID-FMT-SPEC2-NEXT: INVVAR2=[[#%hhd,INVVAR2:]]
|
|
INVALID-FMT-SPEC-MSG1: numeric-expression.txt:[[#@LINE-2]]:37: error: invalid format specifier in expression
|
|
INVALID-FMT-SPEC-MSG1-NEXT: {{I}}NVALID-FMT-SPEC1-NEXT: INVVAR1={{\[\[#%c,INVVAR1:\]\]}}
|
|
INVALID-FMT-SPEC-MSG1-NEXT: {{^}} ^{{$}}
|
|
INVALID-FMT-SPEC-MSG2: numeric-expression.txt:[[#@LINE-4]]:37: error: invalid format specifier in expression
|
|
INVALID-FMT-SPEC-MSG2-NEXT: {{I}}NVALID-FMT-SPEC2-NEXT: INVVAR2={{\[\[#%hhd,INVVAR2:\]\]}}
|
|
INVALID-FMT-SPEC-MSG2-NEXT: {{^}} ^{{$}}
|
|
|
|
; Numeric expressions in explicit matching format and default matching rule using
|
|
; variables defined on other lines without spaces.
|
|
USE DEF FMT IMPL MATCH
|
|
11
|
|
12
|
|
10
|
|
c
|
|
d
|
|
b
|
|
1a
|
|
D
|
|
E
|
|
C
|
|
1B
|
|
11
|
|
11
|
|
11
|
|
c
|
|
c
|
|
c
|
|
c
|
|
c
|
|
CHECK-LABEL: USE DEF FMT IMPL MATCH
|
|
CHECK-NEXT: [[#%u,VAR1]]
|
|
CHECK-NEXT: [[#%u,VAR1+1]]
|
|
CHECK-NEXT: [[#%u,VAR1-1]]
|
|
CHECK-NEXT: [[#%x,VAR2]]
|
|
CHECK-NEXT: [[#%x,VAR2+1]]
|
|
CHECK-NEXT: [[#%x,VAR2-1]]
|
|
CHECK-NEXT: [[#%x,VAR2+14]]
|
|
CHECK-NEXT: [[#%X,VAR3]]
|
|
CHECK-NEXT: [[#%X,VAR3+1]]
|
|
CHECK-NEXT: [[#%X,VAR3-1]]
|
|
CHECK-NEXT: [[#%X,VAR3+14]]
|
|
CHECK-NEXT: [[#%u,VAR1a]]
|
|
CHECK-NEXT: [[#%u,VAR1b]]
|
|
CHECK-NEXT: [[#%u,VAR1c]]
|
|
CHECK-NEXT: [[#%x,VAR2a]]
|
|
|
|
; Numeric expressions in explicit matching format and default matching rule using
|
|
; variables defined on other lines with different spacing.
|
|
USE EXPL FMT IMPL MATCH SPC
|
|
11
|
|
11
|
|
11
|
|
12
|
|
12
|
|
12
|
|
12
|
|
12
|
|
12
|
|
10
|
|
10
|
|
10
|
|
10
|
|
10
|
|
10
|
|
CHECK-LABEL: USE EXPL FMT IMPL MATCH SPC
|
|
CHECK-NEXT: [[#%u, VAR1]]
|
|
CHECK-NEXT: [[# %u, VAR1]]
|
|
CHECK-NEXT: [[# %u, VAR1 ]]
|
|
CHECK-NEXT: [[#%u, VAR1+1]]
|
|
CHECK-NEXT: [[# %u, VAR1+1]]
|
|
CHECK-NEXT: [[# %u , VAR1+1]]
|
|
CHECK-NEXT: [[# %u , VAR1 +1]]
|
|
CHECK-NEXT: [[# %u , VAR1 + 1]]
|
|
CHECK-NEXT: [[# %u , VAR1 + 1 ]]
|
|
CHECK-NEXT: [[#%u, VAR1-1]]
|
|
CHECK-NEXT: [[# %u, VAR1-1]]
|
|
CHECK-NEXT: [[# %u , VAR1-1]]
|
|
CHECK-NEXT: [[# %u , VAR1 -1]]
|
|
CHECK-NEXT: [[# %u , VAR1 - 1]]
|
|
CHECK-NEXT: [[# %u , VAR1 - 1 ]]
|
|
|
|
; Numeric expressions in implicit matching format and default matching rule using
|
|
; variables defined on other lines.
|
|
USE IMPL FMT IMPL MATCH
|
|
11
|
|
12
|
|
10
|
|
c
|
|
d
|
|
b
|
|
1a
|
|
D
|
|
E
|
|
C
|
|
1B
|
|
CHECK-LABEL: USE IMPL FMT IMPL MATCH
|
|
CHECK-NEXT: [[#VAR1]]
|
|
CHECK-NEXT: [[#VAR1+1]]
|
|
CHECK-NEXT: [[#VAR1-1]]
|
|
CHECK-NEXT: [[#VAR2]]
|
|
CHECK-NEXT: [[#VAR2+1]]
|
|
CHECK-NEXT: [[#VAR2-1]]
|
|
CHECK-NEXT: [[#VAR2+14]]
|
|
CHECK-NEXT: [[#VAR3]]
|
|
CHECK-NEXT: [[#VAR3+1]]
|
|
CHECK-NEXT: [[#VAR3-1]]
|
|
CHECK-NEXT: [[#VAR3+14]]
|
|
|
|
; Numeric expressions using variables defined on other lines and an immediate
|
|
; interpreted as an unsigned value.
|
|
; Note: 9223372036854775819 = 0x8000000000000000 + 11
|
|
USE IMPL FMT IMPL MATCH UNSIGNED IMM
|
|
9223372036854775819
|
|
CHECK-LABEL: USE IMPL FMT IMPL MATCH UNSIGNED IMM
|
|
CHECK-NEXT: [[#VAR1+0x8000000000000000]]
|
|
|
|
; Numeric expressions with matching format overriding the implicit format of
|
|
; variables defined on other lines.
|
|
USE CONV FMT IMPL MATCH
|
|
b
|
|
B
|
|
12
|
|
13
|
|
CHECK-LABEL: USE CONV FMT IMPL MATCH
|
|
CHECK-NEXT: [[# %x, VAR1]]
|
|
CHECK-NEXT: [[# %X, VAR1]]
|
|
CHECK-NEXT: [[# %u, VAR2]]
|
|
CHECK-NEXT: [[# %u, VAR3]]
|
|
|
|
; Conflicting implicit format.
|
|
RUN: not FileCheck --check-prefixes CHECK,FMT-CONFLICT --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix FMT-CONFLICT-MSG %s
|
|
|
|
VAR USE IMPL FMT CONFLICT
|
|
23
|
|
FMT-CONFLICT-LABEL: VAR USE IMPL FMT CONFLICT
|
|
FMT-CONFLICT-NEXT: [[#VAR1 + VAR2]]
|
|
FMT-CONFLICT-MSG: numeric-expression.txt:[[#@LINE-1]]:23: error: variables with conflicting format specifier: need an explicit one
|
|
FMT-CONFLICT-MSG-NEXT: {{F}}MT-CONFLICT-NEXT: {{\[\[#VAR1 \+ VAR2\]\]}}
|
|
FMT-CONFLICT-MSG-NEXT: {{^ \^$}}
|
|
|
|
; Explicitly specified format can override conflicting implicit formats.
|
|
VAR USE IMPL OVERRIDE FMT CONFLICT
|
|
23
|
|
CHECK-LABEL: VAR USE IMPL OVERRIDE FMT CONFLICT
|
|
CHECK-NEXT: [[# %u, VAR1 + VAR2]]
|
|
|
|
; Numeric expressions using more than one variable defined on other lines.
|
|
USE MULTI VAR
|
|
31
|
|
42
|
|
CHECK-LABEL: USE MULTI VAR
|
|
CHECK-NEXT: [[#VAR4:]]
|
|
CHECK-NEXT: [[#VAR1+VAR4]]
|
|
|
|
; Numeric expression using a variable defined from a numeric expression.
|
|
DEF EXPR GOOD MATCH
|
|
42
|
|
41
|
|
; CHECK-LABEL: DEF EXPR GOOD MATCH
|
|
; CHECK-NEXT: [[# VAR42:VAR1+31]]
|
|
; CHECK-NEXT: [[# VAR42-1]]
|
|
|
|
; Empty numeric expression.
|
|
EMPTY NUM EXPR
|
|
foo 104 bar
|
|
CHECK-LABEL: EMPTY NUM EXPR
|
|
CHECK-NEXT: foo [[#]] bar
|
|
|
|
; Numeric expression using undefined variables.
|
|
RUN: %ProtectFileCheckOutput \
|
|
RUN: not FileCheck --check-prefix UNDEF-USE --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix UNDEF-USE-MSG %s
|
|
|
|
UNDEF VAR USE
|
|
UNDEFVAR: 11
|
|
UNDEF-USE-LABEL: UNDEF VAR USE
|
|
UNDEF-USE-NEXT: UNDEFVAR: [[#UNDEFVAR1+UNDEFVAR2]]
|
|
UNDEF-USE-MSG: numeric-expression.txt:[[#@LINE-1]]:17: error: {{U}}NDEF-USE-NEXT: expected string not found in input
|
|
UNDEF-USE-MSG-NEXT: {{U}}NDEF-USE-NEXT: UNDEFVAR: {{\[\[#UNDEFVAR1\+UNDEFVAR2\]\]}}
|
|
UNDEF-USE-MSG-NEXT: {{^}} ^{{$}}
|
|
UNDEF-USE-MSG-NEXT: numeric-expression.txt:[[#@LINE-6]]:1: note: scanning from here
|
|
UNDEF-USE-MSG-NEXT: UNDEFVAR: 11
|
|
UNDEF-USE-MSG-NEXT: {{^}}^{{$}}
|
|
UNDEF-USE-MSG-NEXT: numeric-expression.txt:[[#@LINE-9]]:1: note: uses undefined variable(s): "UNDEFVAR1" "UNDEFVAR2"
|
|
UNDEF-USE-MSG-NEXT: UNDEFVAR: 11
|
|
UNDEF-USE-MSG-NEXT: {{^}}^{{$}}
|
|
|
|
; Numeric expression with unsupported operator.
|
|
RUN: %ProtectFileCheckOutput \
|
|
RUN: not FileCheck -D#NUMVAR=10 --check-prefix INVAL-OP \
|
|
RUN: --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix INVAL-OP-MSG %s
|
|
|
|
INVALID OPERATOR
|
|
NUMVAR*2: 22
|
|
INVAL-OP-LABEL: INVALID OPERATOR
|
|
INVAL-OP-NEXT: NUMVAR*2: [[#NUMVAR*2]]
|
|
INVAL-OP-MSG: numeric-expression.txt:[[#@LINE-1]]:35: error: unsupported operation '*'
|
|
INVAL-OP-MSG-NEXT: {{I}}NVAL-OP-NEXT: NUMVAR*2: {{\[\[#NUMVAR\*2\]\]}}
|
|
INVAL-OP-MSG-NEXT: {{^}} ^{{$}}
|
|
|
|
; Name conflict between Numeric variable definition and string variable
|
|
; definition whether from the command-line or input text.
|
|
RUN: %ProtectFileCheckOutput \
|
|
RUN: not FileCheck --check-prefixes CONFLICT,CONFLICT1,CONFLICT2 \
|
|
RUN: --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix INPUT-STR-CONFLICT %s
|
|
RUN: %ProtectFileCheckOutput \
|
|
RUN: not FileCheck -D#NUMVAR=42 --check-prefixes CONFLICT,CONFLICT2 \
|
|
RUN: --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix INPUT-STR-CONFLICT %s
|
|
RUN: %ProtectFileCheckOutput \
|
|
RUN: not FileCheck -D#NUMVAR=42 -DNUMVAR=foobar --check-prefix CONFLICT \
|
|
RUN: --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix CLI-STR-CONFLICT %s
|
|
RUN: %ProtectFileCheckOutput \
|
|
RUN: not FileCheck --check-prefixes CONFLICT,CONFLICT3,CONFLICT4 \
|
|
RUN: --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix INPUT-NUM-CONFLICT %s
|
|
RUN: %ProtectFileCheckOutput \
|
|
RUN: not FileCheck -DSTRVAR=foobar --check-prefixes CONFLICT,CONFLICT4 \
|
|
RUN: --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix INPUT-NUM-CONFLICT %s
|
|
RUN: %ProtectFileCheckOutput \
|
|
RUN: not FileCheck -DSTRVAR=foobar -D#STRVAR=42 --check-prefix CONFLICT \
|
|
RUN: --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix CLI-NUM-CONFLICT %s
|
|
|
|
STRVAR NUMVAR CONFLICT
|
|
redef1 42
|
|
foobar
|
|
redef2 42
|
|
CONFLICT-LABEL: STRVAR NUMVAR CONFLICT
|
|
CONFLICT1-NEXT: redef1 [[#NUMVAR:]]
|
|
CONFLICT2: [[NUMVAR:foo.*]]
|
|
CONFLICT3: [[STRVAR:foo.*]]
|
|
CONFLICT4: redef2 [[#STRVAR:]]
|
|
INPUT-STR-CONFLICT: numeric-expression.txt:[[#@LINE-3]]:14: error: numeric variable with name 'NUMVAR' already exists
|
|
INPUT-STR-CONFLICT-NEXT: {{C}}ONFLICT2: {{\[\[NUMVAR:foo\.\*\]\]}}
|
|
INPUT-STR-CONFLICT-NEXT: {{^}} ^{{$}}
|
|
CLI-STR-CONFLICT: Global defines:2:19: error: numeric variable with name 'NUMVAR' already exists
|
|
CLI-STR-CONFLICT-NEXT: Global define #2: NUMVAR=foobar
|
|
CLI-STR-CONFLICT-NEXT: {{^}} ^{{$}}
|
|
INPUT-NUM-CONFLICT: numeric-expression.txt:[[#@LINE-7]]:22: error: string variable with name 'STRVAR' already exists
|
|
INPUT-NUM-CONFLICT-NEXT: CONFLICT4: redef2 {{\[\[#STRVAR:\]\]}}
|
|
INPUT-NUM-CONFLICT-NEXT: {{^}} ^{{$}}
|
|
CLI-NUM-CONFLICT: Global defines:2:45: error: string variable with name 'STRVAR' already exists
|
|
CLI-NUM-CONFLICT-NEXT: Global define #2: #STRVAR=42 (parsed as: {{\[\[#STRVAR:42\]\]}})
|
|
CLI-NUM-CONFLICT-NEXT: {{^}} ^{{$}}
|
|
|
|
; Numeric variable definition with too big value.
|
|
RUN: %ProtectFileCheckOutput \
|
|
RUN: not FileCheck --check-prefix BIGVAL --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix BIGVAL-MSG %s
|
|
|
|
BIG VALUE
|
|
NUMVAR: 10000000000000000000000
|
|
BIGVAL-LABEL: BIG VALUE
|
|
BIGVAL-NEXT: NUMVAR: [[#NUMVAR:]]
|
|
BIGVAL-MSG: numeric-expression.txt:[[#@LINE-3]]:9: error: unable to represent numeric value
|
|
BIGVAL-MSG-NEXT: {{N}}UMVAR: 10000000000000000000000
|
|
BIGVAL-MSG-NEXT: {{^}} ^{{$}}
|
|
|
|
; Verify that when a variable is set to an expression the expression is still
|
|
; checked.
|
|
RUN: %ProtectFileCheckOutput \
|
|
RUN: not FileCheck --check-prefix DEF-EXPR-FAIL --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix DEF-EXPR-FAIL-MSG %s
|
|
|
|
DEF EXPR WRONG MATCH
|
|
20
|
|
43
|
|
DEF-EXPR-FAIL-LABEL: DEF EXPR WRONG MATCH
|
|
DEF-EXPR-FAIL-NEXT: [[# VAR20:]]
|
|
DEF-EXPR-FAIL-NEXT: [[# VAR42: VAR20+22]]
|
|
DEF-EXPR-FAIL-MSG: numeric-expression.txt:[[#@LINE-1]]:21: error: {{D}}EF-EXPR-FAIL-NEXT: is not on the line after the previous match
|
|
DEF-EXPR-FAIL-MSG-NEXT: {{D}}EF-EXPR-FAIL-NEXT: {{\[\[# VAR42: VAR20\+22\]\]}}
|
|
DEF-EXPR-FAIL-MSG-NEXT: {{^}} ^{{$}}
|
|
|
|
; Verify that using a numeric variable defined on the same line (whether from
|
|
; input or from an expression) is rejected.
|
|
RUN: %ProtectFileCheckOutput \
|
|
RUN: not FileCheck --check-prefix SAME-LINE-USE1 --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix SAME-LINE-USE-MSG1 %s
|
|
RUN: %ProtectFileCheckOutput \
|
|
RUN: not FileCheck --check-prefix SAME-LINE-USE2 --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix SAME-LINE-USE-MSG2 %s
|
|
|
|
SAME LINE USE
|
|
3
|
|
4 5
|
|
SAME-LINE-USE1-LABEL: SAME LINE USE
|
|
SAME-LINE-USE1-NEXT: [[#]]
|
|
SAME-LINE-USE1-NEXT: [[#VAR1:]] [[#VAR1+1]]
|
|
SAME-LINE-USE-MSG1: numeric-expression.txt:[[#@LINE-1]]:36: error: numeric variable 'VAR1' defined earlier in the same CHECK directive
|
|
SAME-LINE-USE-MSG1-NEXT: {{S}}AME-LINE-USE1-NEXT: {{\[\[#VAR1:\]\] \[\[#VAR1\+1\]\]}}
|
|
SAME-LINE-USE-MSG1-NEXT: {{^}} ^{{$}}
|
|
|
|
SAME-LINE-USE2-LABEL: SAME LINE USE
|
|
SAME-LINE-USE2-NEXT: [[#VAR1:]]
|
|
SAME-LINE-USE2-NEXT: [[#VAR2:VAR1+1]] [[#VAR2+1]]
|
|
SAME-LINE-USE-MSG2: numeric-expression.txt:[[#@LINE-1]]:42: error: numeric variable 'VAR2' defined earlier in the same CHECK directive
|
|
SAME-LINE-USE-MSG2-NEXT: {{S}}AME-LINE-USE2-NEXT: {{\[\[#VAR2:VAR1\+1\]\] \[\[#VAR2\+1\]\]}}
|
|
SAME-LINE-USE-MSG2-NEXT: {{^}} ^{{$}}
|
|
|
|
; Invalid change of format in variable redefinition.
|
|
RUN: not FileCheck --check-prefix REDEF-NEW-FMT --input-file %s %s 2>&1 \
|
|
RUN: | FileCheck --strict-whitespace --check-prefix REDEF-NEW-FMT-MSG %s
|
|
|
|
VAR REDEF FMT CHANGE
|
|
22
|
|
DC
|
|
REDEF-NEW-FMT-LABEL: VAR REDEF FMT CHANGE
|
|
REDEF-NEW-FMT-NEXT: [[#VAR1:]]
|
|
REDEF-NEW-FMT-NEXT: [[#%X,VAR1:]]
|
|
REDEF-NEW-FMT-MSG: numeric-expression.txt:[[#@LINE-1]]:31: error: format different from previous variable definition
|
|
REDEF-NEW-FMT-MSG-NEXT: {{R}}EDEF-NEW-FMT-NEXT: {{\[\[#%X,VAR1:\]\]}}
|
|
REDEF-NEW-FMT-MSG-NEXT: {{^ \^$}}
|