diff --git a/clang/test/Driver/clang-offload-bundler.c b/clang/test/Driver/clang-offload-bundler.c --- a/clang/test/Driver/clang-offload-bundler.c +++ b/clang/test/Driver/clang-offload-bundler.c @@ -74,10 +74,10 @@ // CK-ERR6: error: invalid file type specified. // RUN: not clang-offload-bundler 2>&1 | FileCheck %s --check-prefix CK-ERR7 -// CK-ERR7-DAG: clang-offload-bundler: for the -type option: must be specified at least once! -// CK-ERR7-DAG: clang-offload-bundler: for the -inputs option: must be specified at least once! -// CK-ERR7-DAG: clang-offload-bundler: for the -outputs option: must be specified at least once! -// CK-ERR7-DAG: clang-offload-bundler: for the -targets option: must be specified at least once! +// CK-ERR7-DAG: clang-offload-bundler: for the --type option: must be specified at least once! +// CK-ERR7-DAG: clang-offload-bundler: for the --inputs option: must be specified at least once! +// CK-ERR7-DAG: clang-offload-bundler: for the --outputs option: must be specified at least once! +// CK-ERR7-DAG: clang-offload-bundler: for the --targets option: must be specified at least once! // RUN: not clang-offload-bundler -type=i -targets=hxst-powerpcxxle-ibm-linux-gnu,openxp-pxxerpc64le-ibm-linux-gnu,xpenmp-x86_xx-pc-linux-gnu -inputs=%t.i,%t.tgt1,%t.tgt2 -outputs=%t.bundle.i 2>&1 | FileCheck %s --check-prefix CK-ERR8 // CK-ERR8: error: invalid target 'hxst-powerpcxxle-ibm-linux-gnu', unknown offloading kind 'hxst', unknown target triple 'powerpcxxle-ibm-linux-gnu'. diff --git a/llvm/include/llvm/Support/CommandLine.h b/llvm/include/llvm/Support/CommandLine.h --- a/llvm/include/llvm/Support/CommandLine.h +++ b/llvm/include/llvm/Support/CommandLine.h @@ -1205,7 +1205,11 @@ }; template <> struct applicator { - static void opt(MiscFlags MF, Option &O) { O.setMiscFlag(MF); } + static void opt(MiscFlags MF, Option &O) { + assert((MF != Grouping || O.ArgStr.size() == 1) && + "cl::Grouping can only apply to single charater Options."); + O.setMiscFlag(MF); + } }; // apply method - Apply modifiers to an option in a type safe way. diff --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp --- a/llvm/lib/Support/CommandLine.cpp +++ b/llvm/lib/Support/CommandLine.cpp @@ -88,6 +88,22 @@ //===----------------------------------------------------------------------===// +static StringRef ArgPrefix = " -"; +static StringRef ArgPrefixLong = " --"; +static StringRef ArgHelpPrefix = " - "; + +static size_t argPrefixesSize(size_t len) { + if (len == 1) + return ArgPrefix.size() + ArgHelpPrefix.size(); + return ArgPrefixLong.size() + ArgHelpPrefix.size(); +} + +static StringRef argPrefix(size_t len) { + if (len == 1) + return ArgPrefix; + return ArgPrefixLong; +} + namespace { class CommandLineParser { @@ -392,6 +408,8 @@ GlobalParser->updateArgStr(this, S); assert((S.empty() || S[0] != '-') && "Option can't start with '-"); ArgStr = S; + if (ArgStr.size() == 1) + setMiscFlag(Grouping); } void Option::reset() { @@ -1339,12 +1357,13 @@ if (!Handler) { if (SinkOpts.empty()) { *Errs << ProgramName << ": Unknown command line argument '" << argv[i] - << "'. Try: '" << argv[0] << " -help'\n"; + << "'. Try: '" << argv[0] << " --help'\n"; if (NearestHandler) { // If we know a near match, report it as well. - *Errs << ProgramName << ": Did you mean '-" << NearestHandlerString - << "'?\n"; + *Errs << ProgramName << ": Did you mean '" + << argPrefix(NearestHandler->ArgStr.size()) + << NearestHandlerString << "'?\n"; } ErrorParsing = true; @@ -1378,14 +1397,14 @@ << ": Not enough positional command line arguments specified!\n" << "Must specify at least " << NumPositionalRequired << " positional argument" << (NumPositionalRequired > 1 ? "s" : "") - << ": See: " << argv[0] << " -help\n"; + << ": See: " << argv[0] << " --help\n"; ErrorParsing = true; } else if (!HasUnlimitedPositionals && PositionalVals.size() > PositionalOpts.size()) { *Errs << ProgramName << ": Too many positional arguments specified!\n" << "Can specify at most " << PositionalOpts.size() - << " positional arguments: See: " << argv[0] << " -help\n"; + << " positional arguments: See: " << argv[0] << " --help\n"; ErrorParsing = true; } else if (!ConsumeAfterOpt) { @@ -1498,7 +1517,8 @@ if (ArgName.empty()) Errs << HelpStr; // Be nice for positional arguments else - Errs << GlobalParser->ProgramName << ": for the -" << ArgName; + Errs << GlobalParser->ProgramName << ": for the " + << argPrefix(ArgName.size()) << ArgName; Errs << " option: " << Message << "\n"; return true; @@ -1536,16 +1556,14 @@ return O.ValueStr; } -static StringRef ArgPrefix = " -"; -static StringRef ArgHelpPrefix = " - "; -static size_t ArgPrefixesSize = ArgPrefix.size() + ArgHelpPrefix.size(); - //===----------------------------------------------------------------------===// // cl::alias class implementation // // Return the width of the option tag for printing... -size_t alias::getOptionWidth() const { return ArgStr.size() + ArgPrefixesSize; } +size_t alias::getOptionWidth() const { + return ArgStr.size() + argPrefixesSize(ArgStr.size()); +} void Option::printHelpStr(StringRef HelpStr, size_t Indent, size_t FirstLineIndentedBy) { @@ -1561,8 +1579,9 @@ // Print out the option for the alias. void alias::printOptionInfo(size_t GlobalWidth) const { - outs() << ArgPrefix << ArgStr; - printHelpStr(HelpStr, GlobalWidth, ArgStr.size() + ArgPrefixesSize); + outs() << argPrefix(ArgStr.size()) << ArgStr; + printHelpStr(HelpStr, GlobalWidth, + ArgStr.size() + argPrefixesSize(ArgStr.size())); } //===----------------------------------------------------------------------===// @@ -1583,7 +1602,7 @@ Len += getValueStr(O, ValName).size() + FormattingLen; } - return Len + ArgPrefixesSize; + return Len + argPrefixesSize(O.ArgStr.size()); } // printOptionInfo - Print out information about this option. The @@ -1591,7 +1610,7 @@ // void basic_parser_impl::printOptionInfo(const Option &O, size_t GlobalWidth) const { - outs() << ArgPrefix << O.ArgStr; + outs() << argPrefix(O.ArgStr.size()) << O.ArgStr; auto ValName = getValueName(); if (!ValName.empty()) { @@ -1607,7 +1626,7 @@ void basic_parser_impl::printOptionName(const Option &O, size_t GlobalWidth) const { - outs() << ArgPrefix << O.ArgStr; + outs() << argPrefix(O.ArgStr.size()) << O.ArgStr; outs().indent(GlobalWidth - O.ArgStr.size()); } @@ -1739,7 +1758,8 @@ // Return the width of the option tag for printing... size_t generic_parser_base::getOptionWidth(const Option &O) const { if (O.hasArgStr()) { - size_t Size = O.ArgStr.size() + ArgPrefixesSize + EqValue.size(); + size_t Size = + O.ArgStr.size() + argPrefixesSize(O.ArgStr.size()) + EqValue.size(); for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { StringRef Name = getOption(i); if (!shouldPrintOption(Name, getDescription(i), O)) @@ -1767,17 +1787,19 @@ if (O.getValueExpectedFlag() == ValueOptional) { for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { if (getOption(i).empty()) { - outs() << ArgPrefix << O.ArgStr; + outs() << argPrefix(O.ArgStr.size()) << O.ArgStr; Option::printHelpStr(O.HelpStr, GlobalWidth, - O.ArgStr.size() + ArgPrefixesSize); + O.ArgStr.size() + + argPrefixesSize(O.ArgStr.size())); break; } } } - outs() << ArgPrefix << O.ArgStr << EqValue; + outs() << argPrefix(O.ArgStr.size()) << O.ArgStr << EqValue; Option::printHelpStr(O.HelpStr, GlobalWidth, - O.ArgStr.size() + EqValue.size() + ArgPrefixesSize); + O.ArgStr.size() + EqValue.size() + + argPrefixesSize(O.ArgStr.size())); for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { StringRef OptionName = getOption(i); StringRef Description = getDescription(i); @@ -1799,8 +1821,8 @@ if (!O.HelpStr.empty()) outs() << " " << O.HelpStr << '\n'; for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { - auto Option = getOption(i); - outs() << " -" << Option; + StringRef Option = getOption(i); + outs() << " " << argPrefix(Option.size()) << Option; Option::printHelpStr(getDescription(i), GlobalWidth, Option.size() + 8); } } @@ -1814,7 +1836,7 @@ void generic_parser_base::printGenericOptionDiff( const Option &O, const GenericOptionValue &Value, const GenericOptionValue &Default, size_t GlobalWidth) const { - outs() << " -" << O.ArgStr; + outs() << " " << argPrefix(O.ArgStr.size()) << O.ArgStr; outs().indent(GlobalWidth - O.ArgStr.size()); unsigned NumOpts = getNumOptions(); @@ -2034,7 +2056,7 @@ printSubCommands(Subs, MaxSubLen); outs() << "\n"; outs() << " Type \"" << GlobalParser->ProgramName - << " -help\" to get more help on a specific " + << " --help\" to get more help on a specific " "subcommand"; } @@ -2111,7 +2133,7 @@ Category = SortedCategories.begin(), E = SortedCategories.end(); Category != E; ++Category) { - // Hide empty categories for -help, but show for -help-hidden. + // Hide empty categories for --help, but show for --help-hidden. const auto &CategoryOptions = CategorizedOptions[*Category]; bool IsEmptyCategory = CategoryOptions.empty(); if (!ShowHidden && IsEmptyCategory) @@ -2127,7 +2149,7 @@ else outs() << "\n"; - // When using -help-hidden explicitly state if the category has no + // When using --help-hidden explicitly state if the category has no // options associated with it. if (IsEmptyCategory) { outs() << " This option category has no options.\n"; @@ -2177,11 +2199,11 @@ static cl::OptionCategory GenericCategory("Generic Options"); // Define uncategorized help printers. -// -help-list is hidden by default because if Option categories are being used -// then -help behaves the same as -help-list. +// --help-list is hidden by default because if Option categories are being used +// then --help behaves the same as --help-list. static cl::opt> HLOp( "help-list", - cl::desc("Display list of available options (-help-list-hidden for more)"), + cl::desc("Display list of available options (--help-list-hidden for more)"), cl::location(UncategorizedNormalPrinter), cl::Hidden, cl::ValueDisallowed, cl::cat(GenericCategory), cl::sub(*AllSubCommands)); @@ -2195,11 +2217,11 @@ // behaviour at runtime depending on whether one or more Option categories have // been declared. static cl::opt> - HOp("help", cl::desc("Display available options (-help-hidden for more)"), + HOp("help", cl::desc("Display available options (--help-hidden for more)"), cl::location(WrappedNormalPrinter), cl::ValueDisallowed, cl::cat(GenericCategory), cl::sub(*AllSubCommands)); -static cl::alias HOpA("h", cl::desc("Alias for -help"), cl::aliasopt(HOp), +static cl::alias HOpA("h", cl::desc("Alias for --help"), cl::aliasopt(HOp), cl::DefaultOption); static cl::opt> @@ -2226,7 +2248,7 @@ // registered then it is useful to show the categorized help instead of // uncategorized help. if (GlobalParser->RegisteredOptionCategories.size() > 1) { - // unhide -help-list option so user can have uncategorized output if they + // unhide --help-list option so user can have uncategorized output if they // want it. HLOp.setHiddenFlag(NotHidden); diff --git a/llvm/test/FileCheck/dump-input-enable.txt b/llvm/test/FileCheck/dump-input-enable.txt --- a/llvm/test/FileCheck/dump-input-enable.txt +++ b/llvm/test/FileCheck/dump-input-enable.txt @@ -26,7 +26,7 @@ ; RUN: not FileCheck -dump-input=foobar 2>&1 \ ; RUN: | FileCheck %s -match-full-lines -check-prefix=BADVAL -BADVAL: {{F|f}}ile{{C|c}}heck{{.*}}: for the -dump-input option: Cannot find option named 'foobar'! +BADVAL: {{F|f}}ile{{C|c}}heck{{.*}}: for the --dump-input option: Cannot find option named 'foobar'! ;-------------------------------------------------- ; Check -dump-input=help. diff --git a/llvm/test/Support/check-default-options.txt b/llvm/test/Support/check-default-options.txt --- a/llvm/test/Support/check-default-options.txt +++ b/llvm/test/Support/check-default-options.txt @@ -1,18 +1,18 @@ -# RUN: llvm-objdump -help-hidden %t | FileCheck --check-prefix=CHECK-OBJDUMP %s -# RUN: llvm-readobj -help-hidden %t | FileCheck --check-prefix=CHECK-READOBJ %s -# RUN: llvm-tblgen -help-hidden %t | FileCheck --check-prefix=CHECK-TBLGEN %s -# RUN: llvm-opt-report -help-hidden %t | FileCheck --check-prefix=CHECK-OPT-RPT %s -# RUN: llvm-dwarfdump -help-hidden %t | FileCheck --check-prefix=CHECK-DWARF %s +# RUN: llvm-objdump --help-hidden %t | FileCheck --check-prefix=CHECK-OBJDUMP %s +# RUN: llvm-readobj --help-hidden %t | FileCheck --check-prefix=CHECK-READOBJ %s +# RUN: llvm-tblgen --help-hidden %t | FileCheck --check-prefix=CHECK-TBLGEN %s +# RUN: llvm-opt-report --help-hidden %t | FileCheck --check-prefix=CHECK-OPT-RPT %s +# RUN: llvm-dwarfdump --help-hidden %t | FileCheck --check-prefix=CHECK-DWARF %s # RUN: llvm-dwarfdump -h %t | FileCheck --check-prefix=CHECK-DWARF-H %s # CHECK-OBJDUMP: -h - Alias for --section-headers # CHECK-READOBJ: -h - Alias for --file-headers -# CHECK-TBLGEN: -h - Alias for -help -# CHECK-OPT-RPT: -h - Alias for -help +# CHECK-TBLGEN: -h - Alias for --help +# CHECK-OPT-RPT: -h - Alias for --help # CHECK-DWARF: -h - Alias for -help # llvm-dwarfdump declares `-h` option and prints special help in that case, # which is weird, but makes for a good test, i.e., shows the default `-h` # wasn't used. -# CHECK-DWARF-H-NOT: -help-list - Display list of available options (-help-list-hidden for more) +# CHECK-DWARF-H-NOT: --help-list - Display list of available options (--help-list-hidden for more) diff --git a/llvm/test/tools/llvm-readobj/merged.test b/llvm/test/tools/llvm-readobj/merged.test --- a/llvm/test/tools/llvm-readobj/merged.test +++ b/llvm/test/tools/llvm-readobj/merged.test @@ -10,4 +10,4 @@ RUN: not llvm-readobj -aeWhSrnudlVgIs %p/Inputs/trivial.obj.elf-i386 2>&1 | FileCheck %s --check-prefix=UNKNOWN CHECK-NOT: Unknown command line argument -UNKNOWN: Unknown command line argument +UNKNOWN: for the --section-headers option: may only occur zero or one times!