From fdde18a7c3e5ae62f458fb83230ec340bf658668 Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Tue, 3 Dec 2019 10:13:00 -0500 Subject: [FileCheck] Given multiple -dump-input, prefer most verbose Problem: `FILECHECK_OPTS` was implemented so that a test runner, such as a bot, can specify FileCheck debugging options, such as `-dump-input=fail`. However, some existing test suites have FileCheck calls that already specify `-dump-input=fail` or `-dump-input=always`. Without this patch, such tests fail under such a test runner because FileCheck doesn't accept multiple occurrences of `-dump-input`. Solution: This patch permits multiple occurrences of `-dump-input` by assigning precedence to its values in the following descending order: `help`, `always`, `fail`, and `never`. That is, any occurrence of `help` always obtains help, and otherwise the behavior is similar to `-v` vs. `-vv` in that the option specifying the greatest verbosity has precedence. Rationale: My justification for the new behavior is as follows. I have not experienced use cases where, either as a test runner or as a test author, I want to **limit** the permitted debugging verbosity (except as a test author in FileCheck's or lit's test suites where the FileCheck debugging output itself is under test, but the solution there is `env FILECHECK_OPTS=`, and I imagine we should use the same solution anywhere else this need might occur). Of course, as either a test runner or test author, it is useful to **increase** debugging verbosity. Reviewed By: probinson Differential Revision: https://reviews.llvm.org/D70784 --- llvm/utils/FileCheck/FileCheck.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'llvm/utils/FileCheck') diff --git a/llvm/utils/FileCheck/FileCheck.cpp b/llvm/utils/FileCheck/FileCheck.cpp index 44d5be13751..6f5791354ec 100644 --- a/llvm/utils/FileCheck/FileCheck.cpp +++ b/llvm/utils/FileCheck/FileCheck.cpp @@ -108,24 +108,28 @@ static cl::opt DumpInputOnFailure( "FILECHECK_DUMP_INPUT_ON_FAILURE environment variable.\n" "This option is deprecated in favor of -dump-input=fail.\n")); +// The order of DumpInputValue members affects their precedence, as documented +// for -dump-input below. enum DumpInputValue { DumpInputDefault, - DumpInputHelp, DumpInputNever, DumpInputFail, - DumpInputAlways + DumpInputAlways, + DumpInputHelp }; -static cl::opt DumpInput( - "dump-input", cl::init(DumpInputDefault), +static cl::list DumpInputs( + "dump-input", cl::desc("Dump input to stderr, adding annotations representing\n" - " currently enabled diagnostics\n"), + "currently enabled diagnostics. When there are multiple\n" + "occurrences of this option, the that appears earliest\n" + "in the list below has precedence.\n"), cl::value_desc("mode"), cl::values(clEnumValN(DumpInputHelp, "help", "Explain dump format and quit"), - clEnumValN(DumpInputNever, "never", "Never dump input"), + clEnumValN(DumpInputAlways, "always", "Always dump input"), clEnumValN(DumpInputFail, "fail", "Dump input on failure"), - clEnumValN(DumpInputAlways, "always", "Always dump input"))); + clEnumValN(DumpInputNever, "never", "Never dump input"))); typedef cl::list::const_iterator prefix_iterator; @@ -516,6 +520,10 @@ int main(int argc, char **argv) { InitLLVM X(argc, argv); cl::ParseCommandLineOptions(argc, argv, /*Overview*/ "", /*Errs*/ nullptr, "FILECHECK_OPTS"); + DumpInputValue DumpInput = + DumpInputs.empty() + ? DumpInputDefault + : *std::max_element(DumpInputs.begin(), DumpInputs.end()); if (DumpInput == DumpInputHelp) { DumpInputAnnotationHelp(outs()); return 0; -- cgit v1.2.3