196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===--- Option.cpp - Abstract Driver Options -----------------------------===//
296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//                     The LLVM Compiler Infrastructure
496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// This file is distributed under the University of Illinois Open Source
696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// License. See LICENSE.TXT for details.
796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===----------------------------------------------------------------------===//
996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
1096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/Option.h"
1196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/ADT/Twine.h"
1296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/Arg.h"
1396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/ArgList.h"
1496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Support/ErrorHandling.h"
1558a2cbef4aac9ee7d530dfb690c78d6fc11a2371Chandler Carruth#include "llvm/Support/raw_ostream.h"
1696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include <algorithm>
1796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include <cassert>
1896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
1996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerusing namespace llvm;
2096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerusing namespace llvm::opt;
2196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2296a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerOption::Option(const OptTable::Info *info, const OptTable *owner)
2396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  : Info(info), Owner(owner) {
2496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
256c7e78746e059916892f1df279b681d962a70954Hans Wennborg  // Multi-level aliases are not supported. This just simplifies option
266c7e78746e059916892f1df279b681d962a70954Hans Wennborg  // tracking, it is not an inherent limitation.
273f60fb86103f08b1d1da5f98d735fedb41f93f34Richard Trieu  assert((!Info || !getAlias().isValid() || !getAlias().getAlias().isValid()) &&
286c7e78746e059916892f1df279b681d962a70954Hans Wennborg         "Multi-level aliases are not supported.");
299dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg
309dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg  if (Info && getAliasArgs()) {
319dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg    assert(getAlias().isValid() && "Only alias options can have alias args.");
329dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg    assert(getKind() == FlagClass && "Only Flag aliases can have alias args.");
339dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg    assert(getAlias().getKind() != FlagClass &&
349dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg           "Cannot provide alias args to a flag option.");
359dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg  }
3696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
3796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
3896a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerOption::~Option() {
3996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
4096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
4196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid Option::dump() const {
4296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  llvm::errs() << "<";
4396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  switch (getKind()) {
4496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#define P(N) case N: llvm::errs() << #N; break
4596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    P(GroupClass);
4696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    P(InputClass);
4796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    P(UnknownClass);
4896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    P(FlagClass);
4996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    P(JoinedClass);
5096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    P(SeparateClass);
5196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    P(CommaJoinedClass);
5296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    P(MultiArgClass);
5396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    P(JoinedOrSeparateClass);
5496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    P(JoinedAndSeparateClass);
55af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg    P(RemainingArgsClass);
5696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#undef P
5796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
5896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
59b0a9ffaeb0cb3802da3611b95d3ea7f49f03f787Reid Kleckner  if (Info->Prefixes) {
60b0a9ffaeb0cb3802da3611b95d3ea7f49f03f787Reid Kleckner    llvm::errs() << " Prefixes:[";
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    for (const char * const *Pre = Info->Prefixes; *Pre != nullptr; ++Pre) {
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      llvm::errs() << '"' << *Pre << (*(Pre + 1) == nullptr ? "\"" : "\", ");
63b0a9ffaeb0cb3802da3611b95d3ea7f49f03f787Reid Kleckner    }
64b0a9ffaeb0cb3802da3611b95d3ea7f49f03f787Reid Kleckner    llvm::errs() << ']';
6596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
6696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
6796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  llvm::errs() << " Name:\"" << getName() << '"';
6896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
6996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  const Option Group = getGroup();
7096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (Group.isValid()) {
7196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    llvm::errs() << " Group:";
7296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Group.dump();
7396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
7496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
7596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  const Option Alias = getAlias();
7696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (Alias.isValid()) {
7796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    llvm::errs() << " Alias:";
7896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Alias.dump();
7996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
8096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
8196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (getKind() == MultiArgClass)
8296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    llvm::errs() << " NumArgs:" << getNumArgs();
8396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
8496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  llvm::errs() << ">\n";
8596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
8696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
8796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerbool Option::matches(OptSpecifier Opt) const {
8896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  // Aliases are never considered in matching, look through them.
8996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  const Option Alias = getAlias();
9096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (Alias.isValid())
9196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Alias.matches(Opt);
9296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
9396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  // Check exact match.
9496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (getID() == Opt.getID())
9596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return true;
9696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
9796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  const Option Group = getGroup();
9896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (Group.isValid())
9996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Group.matches(Opt);
10096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return false;
10196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
10296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
10396a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *Option::accept(const ArgList &Args,
10496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                    unsigned &Index,
10596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                    unsigned ArgSize) const {
10696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  const Option &UnaliasedOption = getUnaliasedOption();
10796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  StringRef Spelling;
10896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  // If the option was an alias, get the spelling from the unaliased one.
10996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (getID() == UnaliasedOption.getID()) {
11096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Spelling = StringRef(Args.getArgString(Index), ArgSize);
11196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  } else {
11296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Spelling = Args.MakeArgString(Twine(UnaliasedOption.getPrefix()) +
11396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                  Twine(UnaliasedOption.getName()));
11496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
11596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
11696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  switch (getKind()) {
1179dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg  case FlagClass: {
11896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (ArgSize != strlen(Args.getArgString(Index)))
119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
12096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
1219dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg    Arg *A = new Arg(UnaliasedOption, Spelling, Index++);
1229dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg    if (getAliasArgs()) {
1239dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg      const char *Val = getAliasArgs();
1249dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg      while (*Val != '\0') {
1259dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg        A->getValues().push_back(Val);
1269dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg
1279dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg        // Move past the '\0' to the next argument.
1289dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg        Val += strlen(Val) + 1;
1299dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg      }
1309dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg    }
1319dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg    return A;
1329dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg  }
13396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  case JoinedClass: {
13496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    const char *Value = Args.getArgString(Index) + ArgSize;
13596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return new Arg(UnaliasedOption, Spelling, Index++, Value);
13696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
13796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  case CommaJoinedClass: {
13896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // Always matches.
13996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    const char *Str = Args.getArgString(Index) + ArgSize;
14096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Arg *A = new Arg(UnaliasedOption, Spelling, Index++);
14196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
14296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // Parse out the comma separated values.
14396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    const char *Prev = Str;
14496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    for (;; ++Str) {
14596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      char c = *Str;
14696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
14796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      if (!c || c == ',') {
14896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        if (Prev != Str) {
14996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer          char *Value = new char[Str - Prev + 1];
15096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer          memcpy(Value, Prev, Str - Prev);
15196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer          Value[Str - Prev] = '\0';
15296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer          A->getValues().push_back(Value);
15396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        }
15496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
15596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        if (!c)
15696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer          break;
15796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
15896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        Prev = Str + 1;
15996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      }
16096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
16196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    A->setOwnsValues(true);
16296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
16396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return A;
16496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
16596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  case SeparateClass:
16696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // Matches iff this is an exact match.
16796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // FIXME: Avoid strlen.
16896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (ArgSize != strlen(Args.getArgString(Index)))
169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
17096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
17196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Index += 2;
17296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (Index > Args.getNumInputArgStrings())
173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
17496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
17596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return new Arg(UnaliasedOption, Spelling,
17696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                   Index - 2, Args.getArgString(Index - 1));
17796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  case MultiArgClass: {
17896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // Matches iff this is an exact match.
17996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // FIXME: Avoid strlen.
18096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (ArgSize != strlen(Args.getArgString(Index)))
181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
18296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
18396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Index += 1 + getNumArgs();
18496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (Index > Args.getNumInputArgStrings())
185dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
18696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
18796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Arg *A = new Arg(UnaliasedOption, Spelling, Index - 1 - getNumArgs(),
18896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                      Args.getArgString(Index - getNumArgs()));
18996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    for (unsigned i = 1; i != getNumArgs(); ++i)
19096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      A->getValues().push_back(Args.getArgString(Index - getNumArgs() + i));
19196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return A;
19296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
19396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  case JoinedOrSeparateClass: {
19496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // If this is not an exact match, it is a joined arg.
19596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // FIXME: Avoid strlen.
19696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (ArgSize != strlen(Args.getArgString(Index))) {
19796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      const char *Value = Args.getArgString(Index) + ArgSize;
19896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      return new Arg(*this, Spelling, Index++, Value);
19996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
20096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
20196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // Otherwise it must be separate.
20296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Index += 2;
20396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (Index > Args.getNumInputArgStrings())
204dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
20596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
20696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return new Arg(UnaliasedOption, Spelling,
20796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                   Index - 2, Args.getArgString(Index - 1));
20896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
20996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  case JoinedAndSeparateClass:
21096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // Always matches.
21196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Index += 2;
21296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (Index > Args.getNumInputArgStrings())
213dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
21496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
21596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return new Arg(UnaliasedOption, Spelling, Index - 2,
21696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                   Args.getArgString(Index - 2) + ArgSize,
21796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                   Args.getArgString(Index - 1));
218af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg  case RemainingArgsClass: {
219af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg    // Matches iff this is an exact match.
220af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg    // FIXME: Avoid strlen.
221af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg    if (ArgSize != strlen(Args.getArgString(Index)))
222dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return nullptr;
223af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg    Arg *A = new Arg(UnaliasedOption, Spelling, Index++);
224af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg    while (Index < Args.getNumInputArgStrings())
225af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg      A->getValues().push_back(Args.getArgString(Index++));
226af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg    return A;
227af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg  }
22896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  default:
22996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    llvm_unreachable("Invalid option kind!");
23096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
23196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
232