diff options
author | Nikita Popov <npopov@redhat.com> | 2023-01-27 14:53:33 +0100 |
---|---|---|
committer | Nikita Popov <npopov@redhat.com> | 2023-01-30 09:57:26 +0100 |
commit | 5375b638be874b5438e98bd8a435e198af3ef2d0 (patch) | |
tree | 924464d95e2376475278b26bfb87efb56ff8f96e | |
parent | bfe63ed1fe922f0b7366eeda44649954c9631e24 (diff) | |
download | llvm-5375b638be874b5438e98bd8a435e198af3ef2d0.zip llvm-5375b638be874b5438e98bd8a435e198af3ef2d0.tar.gz llvm-5375b638be874b5438e98bd8a435e198af3ef2d0.tar.bz2 |
[UTC] Add --version argument
We have a number of pending changes to update_test_checks.py
(and friends) that are essentially blocked on test churn:
If the output of UTC for an existing flag combination changes,
then the next time a test is regenerated, it will contain many
spurious changes. This makes changes to UTC default
behavior essentially impossible.
Examples of such changes are:
* D133943/D142373 want --function-signature to also check the
return type/attributes.
* D139006/D140212 want to make --function-signature the default
behavior.
* D142452 wants to add wildcards for block labels.
This patch tries to resolve this issue by adding a --version
argument, which works as follows:
* When regenerating an old test, the default version is 1.
* When generating a new test, the default version is the newest.
When an explicit version is specified, that of course wins.
This means that any currently existing tests will keep using
--version 1 format, while any new tests will automatically embed
--version N where N is the latest version, and then keep using
that test format from then on.
This patch only implements the --version flag without bumping
the default version, so it does not have any visible behavior
change by itself.
Differential Revision: https://reviews.llvm.org/D142473
-rw-r--r-- | clang/test/utils/update_cc_test_checks/lit.local.cfg | 4 | ||||
-rw-r--r-- | llvm/test/tools/UpdateTestChecks/lit.local.cfg | 4 | ||||
-rw-r--r-- | llvm/utils/UpdateTestChecks/common.py | 25 |
3 files changed, 29 insertions, 4 deletions
diff --git a/clang/test/utils/update_cc_test_checks/lit.local.cfg b/clang/test/utils/update_cc_test_checks/lit.local.cfg index b78c4ff..b461878 100644 --- a/clang/test/utils/update_cc_test_checks/lit.local.cfg +++ b/clang/test/utils/update_cc_test_checks/lit.local.cfg @@ -26,6 +26,10 @@ else: extra_args = '--clang ' + shell_quote(clang_path) opt_path = os.path.join(config.llvm_tools_dir, 'opt') extra_args += ' --opt ' + shell_quote(opt_path) + # Specify an explicit default version in UTC tests, so that the --version + # embedded in UTC_ARGS does not change in all test expectations every time + # the default is bumped. + extra_args += ' --version=1' script_path = os.path.join(config.llvm_src_root, 'utils', 'update_cc_test_checks.py') assert os.path.isfile(script_path) diff --git a/llvm/test/tools/UpdateTestChecks/lit.local.cfg b/llvm/test/tools/UpdateTestChecks/lit.local.cfg index d9d11b5..cdaf1b3 100644 --- a/llvm/test/tools/UpdateTestChecks/lit.local.cfg +++ b/llvm/test/tools/UpdateTestChecks/lit.local.cfg @@ -15,6 +15,10 @@ def add_update_script_substition(name, python_exe=config.python_executable, assert name.startswith('%') script_path = os.path.join(config.llvm_src_root, 'utils', name[1:] + '.py') assert os.path.isfile(script_path) + # Specify an explicit default version in UTC tests, so that the --version + # embedded in UTC_ARGS does not change in all test expectations every time + # the default is bumped. + extra_args += ' --version=1' config.substitutions.append( (name, "'%s' %s %s" % (python_exe, script_path, extra_args))) diff --git a/llvm/utils/UpdateTestChecks/common.py b/llvm/utils/UpdateTestChecks/common.py index cf382c0..7e538d7 100644 --- a/llvm/utils/UpdateTestChecks/common.py +++ b/llvm/utils/UpdateTestChecks/common.py @@ -18,6 +18,13 @@ from typing import List _verbose = False _prefix_filecheck_ir_name = '' +""" +Version changelog: + +1: Initial version, used by tests that don't specify --version explicitly. +""" +DEFAULT_VERSION = 1 + class Regex(object): """Wrap a compiled regular expression object to allow deep copy of a regexp. This is required for the deep copy done in do_scrub. @@ -138,6 +145,10 @@ def parse_commandline_args(parser): dest='gen_unused_prefix_body', default=True, help='Generate a function body that always matches for unused prefixes. This is useful when unused prefixes are desired, and it avoids needing to annotate each FileCheck as allowing them.') + # This is the default when regenerating existing tests. The default when + # generating new tests is determined by DEFAULT_VERSION. + parser.add_argument('--version', type=int, default=1, + help='The version of output format') args = parser.parse_args() global _verbose, _global_value_regex, _global_hex_value_regex _verbose = args.verbose @@ -226,12 +237,18 @@ def itertests(test_patterns, parser, script_name, comment_prefix=None, argparse_ for test in tests_list: with open(test) as f: input_lines = [l.rstrip() for l in f] - args = parser.parse_args() + first_line = input_lines[0] if input_lines else "" + is_regenerate = UTC_ADVERT in first_line + + # If we're generating a new test, set the default version to the latest. + argv = sys.argv[:] + if not is_regenerate: + argv.insert(1, '--version=' + str(DEFAULT_VERSION)) + + args = parser.parse_args(argv[1:]) if argparse_callback is not None: argparse_callback(args) - argv = sys.argv[:] - first_line = input_lines[0] if input_lines else "" - if UTC_ADVERT in first_line: + if is_regenerate: if script_name not in first_line and not args.force_update: warn("Skipping test which wasn't autogenerated by " + script_name, test) continue |