diff options
Diffstat (limited to 'llvm/lib/Option/OptTable.cpp')
-rw-r--r-- | llvm/lib/Option/OptTable.cpp | 64 |
1 files changed, 39 insertions, 25 deletions
diff --git a/llvm/lib/Option/OptTable.cpp b/llvm/lib/Option/OptTable.cpp index f5bf166e9e65..37c2fcbab181 100644 --- a/llvm/lib/Option/OptTable.cpp +++ b/llvm/lib/Option/OptTable.cpp @@ -104,11 +104,11 @@ OptTable::OptTable(ArrayRef<Info> OptionInfos, bool IgnoreCase) for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { unsigned Kind = getInfo(i + 1).Kind; if (Kind == Option::InputClass) { - assert(!TheInputOptionID && "Cannot have multiple input options!"); - TheInputOptionID = getInfo(i + 1).ID; + assert(!InputOptionID && "Cannot have multiple input options!"); + InputOptionID = getInfo(i + 1).ID; } else if (Kind == Option::UnknownClass) { - assert(!TheUnknownOptionID && "Cannot have multiple unknown options!"); - TheUnknownOptionID = getInfo(i + 1).ID; + assert(!UnknownOptionID && "Cannot have multiple unknown options!"); + UnknownOptionID = getInfo(i + 1).ID; } else if (Kind != Option::GroupClass) { FirstSearchableIndex = i; break; @@ -337,13 +337,14 @@ bool OptTable::addValues(const char *Option, const char *Values) { // GroupedShortOptions is true, -a matches "-abc" and the argument in Args will // be updated to "-bc". This overload does not support // FlagsToInclude/FlagsToExclude or case insensitive options. -Arg *OptTable::parseOneArgGrouped(InputArgList &Args, unsigned &Index) const { +std::unique_ptr<Arg> OptTable::parseOneArgGrouped(InputArgList &Args, + unsigned &Index) const { // Anything that doesn't start with PrefixesUnion is an input, as is '-' // itself. const char *CStr = Args.getArgString(Index); StringRef Str(CStr); if (isInput(PrefixesUnion, Str)) - return new Arg(getOption(TheInputOptionID), Str, Index++, CStr); + return std::make_unique<Arg>(getOption(InputOptionID), Str, Index++, CStr); const Info *End = OptionInfos.data() + OptionInfos.size(); StringRef Name = Str.ltrim(PrefixChars); @@ -359,8 +360,9 @@ Arg *OptTable::parseOneArgGrouped(InputArgList &Args, unsigned &Index) const { continue; Option Opt(Start, this); - if (Arg *A = Opt.accept(Args, StringRef(Args.getArgString(Index), ArgSize), - false, Index)) + if (std::unique_ptr<Arg> A = + Opt.accept(Args, StringRef(Args.getArgString(Index), ArgSize), + /*GroupedShortOption=*/false, Index)) return A; // If Opt is a Flag of length 2 (e.g. "-a"), we know it is a prefix of @@ -375,28 +377,39 @@ Arg *OptTable::parseOneArgGrouped(InputArgList &Args, unsigned &Index) const { } if (Fallback) { Option Opt(Fallback, this); - if (Arg *A = Opt.accept(Args, Str.substr(0, 2), true, Index)) { - if (Str.size() == 2) - ++Index; - else - Args.replaceArgString(Index, Twine('-') + Str.substr(2)); + // Check that the last option isn't a flag wrongly given an argument. + if (Str[2] == '=') + return std::make_unique<Arg>(getOption(UnknownOptionID), Str, Index++, + CStr); + + if (std::unique_ptr<Arg> A = Opt.accept( + Args, Str.substr(0, 2), /*GroupedShortOption=*/true, Index)) { + Args.replaceArgString(Index, Twine('-') + Str.substr(2)); return A; } } - return new Arg(getOption(TheUnknownOptionID), Str, Index++, CStr); + // In the case of an incorrect short option extract the character and move to + // the next one. + if (Str[1] != '-') { + CStr = Args.MakeArgString(Str.substr(0, 2)); + Args.replaceArgString(Index, Twine('-') + Str.substr(2)); + return std::make_unique<Arg>(getOption(UnknownOptionID), CStr, Index, CStr); + } + + return std::make_unique<Arg>(getOption(UnknownOptionID), Str, Index++, CStr); } -Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index, - unsigned FlagsToInclude, - unsigned FlagsToExclude) const { +std::unique_ptr<Arg> OptTable::ParseOneArg(const ArgList &Args, unsigned &Index, + unsigned FlagsToInclude, + unsigned FlagsToExclude) const { unsigned Prev = Index; const char *Str = Args.getArgString(Index); // Anything that doesn't start with PrefixesUnion is an input, as is '-' // itself. if (isInput(PrefixesUnion, Str)) - return new Arg(getOption(TheInputOptionID), Str, Index++, Str); + return std::make_unique<Arg>(getOption(InputOptionID), Str, Index++, Str); const Info *Start = OptionInfos.data() + FirstSearchableIndex; const Info *End = OptionInfos.data() + OptionInfos.size(); @@ -430,8 +443,9 @@ Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index, continue; // See if this option matches. - if (Arg *A = Opt.accept(Args, StringRef(Args.getArgString(Index), ArgSize), - false, Index)) + if (std::unique_ptr<Arg> A = + Opt.accept(Args, StringRef(Args.getArgString(Index), ArgSize), + /*GroupedShortOption=*/false, Index)) return A; // Otherwise, see if this argument was missing values. @@ -442,9 +456,9 @@ Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index, // If we failed to find an option and this arg started with /, then it's // probably an input path. if (Str[0] == '/') - return new Arg(getOption(TheInputOptionID), Str, Index++, Str); + return std::make_unique<Arg>(getOption(InputOptionID), Str, Index++, Str); - return new Arg(getOption(TheUnknownOptionID), Str, Index++, Str); + return std::make_unique<Arg>(getOption(UnknownOptionID), Str, Index++, Str); } InputArgList OptTable::ParseArgs(ArrayRef<const char *> ArgArr, @@ -472,7 +486,7 @@ InputArgList OptTable::ParseArgs(ArrayRef<const char *> ArgArr, } unsigned Prev = Index; - Arg *A = GroupedShortOptions + std::unique_ptr<Arg> A = GroupedShortOptions ? parseOneArgGrouped(Args, Index) : ParseOneArg(Args, Index, FlagsToInclude, FlagsToExclude); assert((Index > Prev || GroupedShortOptions) && @@ -487,7 +501,7 @@ InputArgList OptTable::ParseArgs(ArrayRef<const char *> ArgArr, break; } - Args.append(A); + Args.append(A.release()); } return Args; @@ -654,7 +668,7 @@ void OptTable::printHelp(raw_ostream &OS, const char *Usage, const char *Title, HelpText = getOptionHelpText(Alias.getID()); } - if (HelpText) { + if (HelpText && (strlen(HelpText) != 0)) { const char *HelpGroup = getOptionHelpGroup(*this, Id); const std::string &OptName = getOptionHelpName(*this, Id); GroupedOptionHelp[HelpGroup].push_back({OptName, HelpText}); |