From 2f5b2ea6cd854edfa2722ae0b5acf604a333e785 Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Tue, 20 Jul 2021 11:17:50 -0400 Subject: [PATCH] [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 --- .../Inputs/global-value-regex.c | 8 ++++++++ .../Inputs/global-value-regex.c.expected | 21 ++++++++++++++++++++ .../update_cc_test_checks/global-value-regex.test | 18 +++++++++++++++++ llvm/utils/UpdateTestChecks/common.py | 23 +++++++++++++++++++--- 4 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 clang/test/utils/update_cc_test_checks/Inputs/global-value-regex.c create mode 100644 clang/test/utils/update_cc_test_checks/Inputs/global-value-regex.c.expected create mode 100644 clang/test/utils/update_cc_test_checks/global-value-regex.test diff --git a/clang/test/utils/update_cc_test_checks/Inputs/global-value-regex.c b/clang/test/utils/update_cc_test_checks/Inputs/global-value-regex.c new file mode 100644 index 0000000..cacaac6 --- /dev/null +++ b/clang/test/utils/update_cc_test_checks/Inputs/global-value-regex.c @@ -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; +} diff --git a/clang/test/utils/update_cc_test_checks/Inputs/global-value-regex.c.expected b/clang/test/utils/update_cc_test_checks/Inputs/global-value-regex.c.expected new file mode 100644 index 0000000..b0f74c5 --- /dev/null +++ b/clang/test/utils/update_cc_test_checks/Inputs/global-value-regex.c.expected @@ -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; +} diff --git a/clang/test/utils/update_cc_test_checks/global-value-regex.test b/clang/test/utils/update_cc_test_checks/global-value-regex.test new file mode 100644 index 0000000..33103e1 --- /dev/null +++ b/clang/test/utils/update_cc_test_checks/global-value-regex.test @@ -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 diff --git a/llvm/utils/UpdateTestChecks/common.py b/llvm/utils/UpdateTestChecks/common.py index ff48e3b..29d2240 100644 --- a/llvm/utils/UpdateTestChecks/common.py +++ b/llvm/utils/UpdateTestChecks/common.py @@ -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 -- 2.7.4