aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Option/OptTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Option/OptTable.cpp')
-rw-r--r--llvm/lib/Option/OptTable.cpp64
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});