[UpdateCCTestChecks] Implement --global-value-regex

`--check-globals` activates checks for all global values, and
`--global-value-regex` filters them.  For example, I'd like to use it
in OpenMP offload codegen tests to check only global variables like
`.offload_maptypes*`.

Reviewed By: jdoerfert

Differential Revision: https://reviews.llvm.org/D104742
This commit is contained in:
Joel E. Denny
2021-07-20 11:17:50 -04:00
parent 7cefcd9230
commit 2f5b2ea6cd
4 changed files with 67 additions and 3 deletions

View File

@@ -0,0 +1,8 @@
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s | FileCheck %s
void foo() {
static int i, j;
}
void bar() {
static int i, j;
}

View File

@@ -0,0 +1,21 @@
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals --global-value-regex "foo\.."
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s | FileCheck %s
//.
// CHECK: @foo.i = internal global i32 0, align 4
// CHECK: @foo.j = internal global i32 0, align 4
//.
// CHECK-LABEL: @foo(
// CHECK-NEXT: entry:
// CHECK-NEXT: ret void
//
void foo() {
static int i, j;
}
// CHECK-LABEL: @bar(
// CHECK-NEXT: entry:
// CHECK-NEXT: ret void
//
void bar() {
static int i, j;
}

View File

@@ -0,0 +1,18 @@
RUN: rm -rf %t && mkdir %t
# Check --global-value-regex.
RUN: cp %S/Inputs/global-value-regex.c %t/test.c
RUN: %update_cc_test_checks %t/test.c --check-globals \
RUN: --global-value-regex "foo\.."
RUN: diff -u %S/Inputs/global-value-regex.c.expected %t/test.c
# Check that the generated directives actually work correctly.
RUN: cp %S/Inputs/lit.cfg.example %t/lit.cfg
# Show lit failures while avoiding confusing FileCheck input dump nesting.
RUN: %lit %t
# Lit was successful. Sanity-check the results with deterministic test order.
RUN: rm %t/.lit_test_times.txt
RUN: %lit %t 2>&1 | FileCheck %s
CHECK: Testing: 1 tests
CHECK: PASS: {{.*}} test.c

View File

@@ -36,9 +36,12 @@ def parse_commandline_args(parser):
help='List of regular expressions to replace matching value names')
parser.add_argument('--prefix-filecheck-ir-name', default='',
help='Add a prefix to FileCheck IR value names to avoid conflicts with scripted names')
parser.add_argument('--global-value-regex', nargs='+', default=[],
help='List of regular expressions that a global value declaration must match to generate a check (has no effect if checking globals is not enabled)')
args = parser.parse_args()
global _verbose
global _verbose, _global_value_regex
_verbose = args.verbose
_global_value_regex = args.global_value_regex
return args
@@ -796,13 +799,27 @@ def add_global_checks(glob_val_dict, comment_marker, prefix_list, output_lines,
if not glob_val_dict[checkprefix][nameless_value.check_prefix]:
continue
output_lines.append(comment_marker + SEPARATOR)
check_lines = []
global_vars_seen_before = [key for key in global_vars_seen.keys()]
for line in glob_val_dict[checkprefix][nameless_value.check_prefix]:
if _global_value_regex:
matched = False
for regex in _global_value_regex:
if re.match('^@' + regex + ' = ', line):
matched = True
break
if not matched:
continue
tmp = generalize_check_lines([line], is_analyze, set(), global_vars_seen)
check_line = '%s %s: %s' % (comment_marker, checkprefix, tmp[0])
check_lines.append(check_line)
if not check_lines:
continue
output_lines.append(comment_marker + SEPARATOR)
for check_line in check_lines:
output_lines.append(check_line)
printed_prefixes.add((checkprefix, nameless_value.check_prefix))
# Remembe new global variables we have not seen before