ArgList.cpp revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===--- ArgList.cpp - Argument List Management ---------------------------===//
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/ArgList.h"
1196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/ADT/SmallString.h"
12dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/STLExtras.h"
1396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/ADT/Twine.h"
1496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/Arg.h"
1596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/Option.h"
1696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Support/raw_ostream.h"
1796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
1896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerusing namespace llvm;
1996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerusing namespace llvm::opt;
2096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid arg_iterator::SkipToNextArg() {
2296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (; Current != Args.end(); ++Current) {
2396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // Done if there are no filters.
2496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (!Id0.isValid())
2596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      break;
2696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // Otherwise require a match.
2896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    const Option &O = (*Current)->getOption();
2996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (O.matches(Id0) ||
3096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (Id1.isValid() && O.matches(Id1)) ||
3196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (Id2.isValid() && O.matches(Id2)))
3296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      break;
3396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
3496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
3596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
3696a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArgList::~ArgList() {
3796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
3896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
3996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::append(Arg *A) {
4096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  Args.push_back(A);
4196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
4296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
4396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::eraseArg(OptSpecifier Id) {
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Args.erase(std::remove_if(begin(), end(),
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                            [=](Arg *A) { return A->getOption().matches(Id); }),
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             end());
4796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
4896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
4996a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArgNoClaim(OptSpecifier Id) const {
5096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  // FIXME: Make search efficient?
5196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
5296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id))
5396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      return *it;
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
5596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
5696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
5796a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id) const {
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
5996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
6096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id)) {
6196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
6296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
6396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
6496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
6596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
6696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
6796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
6896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
6996a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1) const {
70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
7196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
7296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
7396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1)) {
7496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
7596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
7696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
7796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
7896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
7996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
8096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
8196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
8296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
8396a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
8496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id2) const {
85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
8696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
8796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
8896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1) ||
8996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id2)) {
9096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
9196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
9296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
9396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
9496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
9596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
9696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
9796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
9896a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
9996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id2, OptSpecifier Id3) const {
100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
10196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
10296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
10396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1) ||
10496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id2) ||
10596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id3)) {
10696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
10796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
10896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
10996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
11096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
11196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
11296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
11396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
11496a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
11596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id2, OptSpecifier Id3,
11696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id4) const {
117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
11896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
11996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
12096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1) ||
12196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id2) ||
12296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id3) ||
12396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id4)) {
12496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
12596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
12696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
12796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
12896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
12996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
13096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
13196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
13296a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
13396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id2, OptSpecifier Id3,
13496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id4, OptSpecifier Id5) const {
135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
13696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
13796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
13896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1) ||
13996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id2) ||
14096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id3) ||
14196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id4) ||
14296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id5)) {
14396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
14496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
14596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
14696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
14796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
14896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
14996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
15096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
15196a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
15296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id2, OptSpecifier Id3,
15396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id4, OptSpecifier Id5,
15496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id6) const {
155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
15696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
15796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
15896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1) ||
15996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id2) ||
16096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id3) ||
16196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id4) ||
16296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id5) ||
16396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id6)) {
16496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
16596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
16696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
16796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
16896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
16996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
17096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
17196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
17296a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
17396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id2, OptSpecifier Id3,
17496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id4, OptSpecifier Id5,
17596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id6, OptSpecifier Id7) const {
176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
17796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
17896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
17996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1) ||
18096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id2) ||
18196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id3) ||
18296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id4) ||
18396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id5) ||
18496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id6) ||
18596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id7)) {
18696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
18796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
18896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
18996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
19096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
19196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
19296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
19396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
19496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerbool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const {
19596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (Arg *A = getLastArg(Pos, Neg))
19696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return A->getOption().matches(Pos);
19796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Default;
19896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
19996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2001ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Klecknerbool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier PosAlias, OptSpecifier Neg,
2011ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner                      bool Default) const {
2021ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner  if (Arg *A = getLastArg(Pos, PosAlias, Neg))
2031ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner    return A->getOption().matches(Pos) || A->getOption().matches(PosAlias);
2041ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner  return Default;
2051ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner}
2061ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner
20796a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerStringRef ArgList::getLastArgValue(OptSpecifier Id,
20896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                         StringRef Default) const {
20996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (Arg *A = getLastArg(Id))
21096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return A->getValue();
21196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Default;
21296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
21396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
21496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerstd::vector<std::string> ArgList::getAllArgValues(OptSpecifier Id) const {
21596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  SmallVector<const char *, 16> Values;
21696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  AddAllArgValues(Values, Id);
21796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return std::vector<std::string>(Values.begin(), Values.end());
21896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
21996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
22096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id) const {
22196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (Arg *A = getLastArg(Id)) {
22296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    A->claim();
22396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    A->render(*this, Output);
22496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
22596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
22696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2271ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Klecknervoid ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id0,
2281ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner                         OptSpecifier Id1) const {
2291ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner  if (Arg *A = getLastArg(Id0, Id1)) {
2301ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner    A->claim();
2311ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner    A->render(*this, Output);
2321ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner  }
2331ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner}
2341ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner
23596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
23696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id1, OptSpecifier Id2) const {
23796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (arg_iterator it = filtered_begin(Id0, Id1, Id2),
23896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer         ie = filtered_end(); it != ie; ++it) {
23996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    (*it)->claim();
24096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    (*it)->render(*this, Output);
24196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
24296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
24396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
24496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0,
24596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                              OptSpecifier Id1, OptSpecifier Id2) const {
24696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (arg_iterator it = filtered_begin(Id0, Id1, Id2),
24796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer         ie = filtered_end(); it != ie; ++it) {
24896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    (*it)->claim();
24996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
25096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Output.push_back((*it)->getValue(i));
25196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
25296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
25396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
25496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0,
25596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                   const char *Translation,
25696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                   bool Joined) const {
25796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (arg_iterator it = filtered_begin(Id0),
25896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer         ie = filtered_end(); it != ie; ++it) {
25996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    (*it)->claim();
26096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
26196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (Joined) {
26296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Output.push_back(MakeArgString(StringRef(Translation) +
26396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                     (*it)->getValue(0)));
26496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    } else {
26596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Output.push_back(Translation);
26696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Output.push_back((*it)->getValue(0));
26796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
26896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
26996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
27096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
27196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::ClaimAllArgs(OptSpecifier Id0) const {
27296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (arg_iterator it = filtered_begin(Id0),
27396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer         ie = filtered_end(); it != ie; ++it)
27496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    (*it)->claim();
27596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
27696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
27796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::ClaimAllArgs() const {
27896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it)
27996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (!(*it)->isClaimed())
28096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      (*it)->claim();
28196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
28296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
28396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerconst char *ArgList::MakeArgString(const Twine &T) const {
28496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  SmallString<256> Str;
28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return MakeArgString(T.toStringRef(Str));
28696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
28796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
28896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerconst char *ArgList::GetOrMakeJoinedArgString(unsigned Index,
28996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                              StringRef LHS,
29096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                              StringRef RHS) const {
29196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  StringRef Cur = getArgString(Index);
29296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (Cur.size() == LHS.size() + RHS.size() &&
29396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Cur.startswith(LHS) && Cur.endswith(RHS))
29496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Cur.data();
29596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
29696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return MakeArgString(LHS + RHS);
29796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
29896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
29996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
30096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
30196a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerInputArgList::InputArgList(const char* const *ArgBegin,
30296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                           const char* const *ArgEnd)
30396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  : NumInputArgStrings(ArgEnd - ArgBegin) {
30496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  ArgStrings.append(ArgBegin, ArgEnd);
30596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
30696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
30796a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerInputArgList::~InputArgList() {
30896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  // An InputArgList always owns its arguments.
30996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (iterator it = begin(), ie = end(); it != ie; ++it)
31096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    delete *it;
31196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
31296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
31396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerunsigned InputArgList::MakeIndex(StringRef String0) const {
31496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned Index = ArgStrings.size();
31596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
31696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  // Tuck away so we have a reliable const char *.
317f73f80975639a7413bee66391556f7ea51f83423Reid Kleckner  SynthesizedStrings.push_back(String0);
318f73f80975639a7413bee66391556f7ea51f83423Reid Kleckner  ArgStrings.push_back(SynthesizedStrings.back().c_str());
31996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
32096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Index;
32196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
32296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
32396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerunsigned InputArgList::MakeIndex(StringRef String0,
32496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                 StringRef String1) const {
32596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned Index0 = MakeIndex(String0);
32696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned Index1 = MakeIndex(String1);
32796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!");
32896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  (void) Index1;
32996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Index0;
33096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
33196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
33296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerconst char *InputArgList::MakeArgString(StringRef Str) const {
33396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return getArgString(MakeIndex(Str));
33496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
33596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
33696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
33796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
33896a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerDerivedArgList::DerivedArgList(const InputArgList &_BaseArgs)
33996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  : BaseArgs(_BaseArgs) {
34096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
34196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
342dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDerivedArgList::~DerivedArgList() {}
34396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
34496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerconst char *DerivedArgList::MakeArgString(StringRef Str) const {
34596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return BaseArgs.MakeArgString(Str);
34696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
34796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
348dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DerivedArgList::AddSynthesizedArg(Arg *A) {
349dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SynthesizedArgs.push_back(std::unique_ptr<Arg>(A));
350dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
351dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
35296a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *DerivedArgList::MakeFlagArg(const Arg *BaseArg, const Option Opt) const {
353dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SynthesizedArgs.push_back(make_unique<Arg>(
354dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      Opt,
355dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      ArgList::MakeArgString(Twine(Opt.getPrefix()) + Twine(Opt.getName())),
356dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      BaseArgs.MakeIndex(Opt.getName()), BaseArg));
357dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return SynthesizedArgs.back().get();
35896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
35996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
36096a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option Opt,
36196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                       StringRef Value) const {
36296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned Index = BaseArgs.MakeIndex(Value);
363dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SynthesizedArgs.push_back(make_unique<Arg>(
364dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      Opt,
365dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      ArgList::MakeArgString(Twine(Opt.getPrefix()) + Twine(Opt.getName())),
366dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      Index, BaseArgs.getArgString(Index), BaseArg));
367dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return SynthesizedArgs.back().get();
36896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
36996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
37096a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option Opt,
37196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                     StringRef Value) const {
37296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned Index = BaseArgs.MakeIndex(Opt.getName(), Value);
373dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SynthesizedArgs.push_back(make_unique<Arg>(
374dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      Opt,
375dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      ArgList::MakeArgString(Twine(Opt.getPrefix()) + Twine(Opt.getName())),
376dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      Index, BaseArgs.getArgString(Index + 1), BaseArg));
377dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return SynthesizedArgs.back().get();
37896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
37996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
38096a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option Opt,
38196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                   StringRef Value) const {
38296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned Index = BaseArgs.MakeIndex(Opt.getName().str() + Value.str());
383dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SynthesizedArgs.push_back(make_unique<Arg>(
384dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      Opt,
385dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      ArgList::MakeArgString(Twine(Opt.getPrefix()) + Twine(Opt.getName())),
386dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      Index, BaseArgs.getArgString(Index) + Opt.getName().size(), BaseArg));
387dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return SynthesizedArgs.back().get();
38896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
389