Index: llvm/lib/Option/Option.cpp =================================================================== --- llvm/lib/Option/Option.cpp +++ llvm/lib/Option/Option.cpp @@ -108,20 +108,21 @@ std::unique_ptr Option::acceptInternal(const ArgList &Args, StringRef Spelling, unsigned &Index) const { - size_t ArgSize = Spelling.size(); + size_t SpellingSize = Spelling.size(); + size_t ArgStringSize = StringRef(Args.getArgString(Index)).size(); switch (getKind()) { case FlagClass: { - if (ArgSize != strlen(Args.getArgString(Index))) + if (SpellingSize != ArgStringSize) return nullptr; return std::make_unique(*this, Spelling, Index++); } case JoinedClass: { - const char *Value = Args.getArgString(Index) + ArgSize; + const char *Value = Args.getArgString(Index) + SpellingSize; return std::make_unique(*this, Spelling, Index++, Value); } case CommaJoinedClass: { // Always matches. - const char *Str = Args.getArgString(Index) + ArgSize; + const char *Str = Args.getArgString(Index) + SpellingSize; auto A = std::make_unique(*this, Spelling, Index++); // Parse out the comma separated values. @@ -149,8 +150,7 @@ } case SeparateClass: // Matches iff this is an exact match. - // FIXME: Avoid strlen. - if (ArgSize != strlen(Args.getArgString(Index))) + if (SpellingSize != ArgStringSize) return nullptr; Index += 2; @@ -162,8 +162,7 @@ Args.getArgString(Index - 1)); case MultiArgClass: { // Matches iff this is an exact match. - // FIXME: Avoid strlen. - if (ArgSize != strlen(Args.getArgString(Index))) + if (SpellingSize != ArgStringSize) return nullptr; Index += 1 + getNumArgs(); @@ -178,9 +177,8 @@ } case JoinedOrSeparateClass: { // If this is not an exact match, it is a joined arg. - // FIXME: Avoid strlen. - if (ArgSize != strlen(Args.getArgString(Index))) { - const char *Value = Args.getArgString(Index) + ArgSize; + if (SpellingSize != ArgStringSize) { + const char *Value = Args.getArgString(Index) + SpellingSize; return std::make_unique(*this, Spelling, Index++, Value); } @@ -201,12 +199,11 @@ return nullptr; return std::make_unique(*this, Spelling, Index - 2, - Args.getArgString(Index - 2) + ArgSize, + Args.getArgString(Index - 2) + SpellingSize, Args.getArgString(Index - 1)); case RemainingArgsClass: { // Matches iff this is an exact match. - // FIXME: Avoid strlen. - if (ArgSize != strlen(Args.getArgString(Index))) + if (SpellingSize != ArgStringSize) return nullptr; auto A = std::make_unique(*this, Spelling, Index++); while (Index < Args.getNumInputArgStrings() && @@ -216,9 +213,9 @@ } case RemainingArgsJoinedClass: { auto A = std::make_unique(*this, Spelling, Index); - if (ArgSize != strlen(Args.getArgString(Index))) { + if (SpellingSize != ArgStringSize) { // An inexact match means there is a joined arg. - A->getValues().push_back(Args.getArgString(Index) + ArgSize); + A->getValues().push_back(Args.getArgString(Index) + SpellingSize); } Index++; while (Index < Args.getNumInputArgStrings() &&