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"
11dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/STLExtras.h"
12ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/ADT/SmallString.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"
16f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Support/Debug.h"
1796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Support/raw_ostream.h"
1896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
1996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerusing namespace llvm;
2096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerusing namespace llvm::opt;
2196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid arg_iterator::SkipToNextArg() {
2396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (; Current != Args.end(); ++Current) {
2496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // Done if there are no filters.
2596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (!Id0.isValid())
2696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      break;
2796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    // Otherwise require a match.
2996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    const Option &O = (*Current)->getOption();
3096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (O.matches(Id0) ||
3196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (Id1.isValid() && O.matches(Id1)) ||
3296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (Id2.isValid() && O.matches(Id2)))
3396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      break;
3496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
3596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
3696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
3796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::append(Arg *A) {
3896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  Args.push_back(A);
3996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
4096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
4196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::eraseArg(OptSpecifier Id) {
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Args.erase(std::remove_if(begin(), end(),
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                            [=](Arg *A) { return A->getOption().matches(Id); }),
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines             end());
4596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
4696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
4796a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArgNoClaim(OptSpecifier Id) const {
4896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  // FIXME: Make search efficient?
4996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
5096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id))
5196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      return *it;
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return nullptr;
5396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
5496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesArg *ArgList::getLastArgNoClaim(OptSpecifier Id0, OptSpecifier Id1) const {
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // FIXME: Make search efficient?
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
5837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if ((*it)->getOption().matches(Id0) ||
5937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        (*it)->getOption().matches(Id1))
6037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return *it;
6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return nullptr;
6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarArg *ArgList::getLastArgNoClaim(OptSpecifier Id0, OptSpecifier Id1,
654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                OptSpecifier Id2) const {
664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // FIXME: Make search efficient?
674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    if ((*it)->getOption().matches(Id0) || (*it)->getOption().matches(Id1) ||
694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        (*it)->getOption().matches(Id2))
704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return *it;
714c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return nullptr;
724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarArg *ArgList::getLastArgNoClaim(OptSpecifier Id0, OptSpecifier Id1,
754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                OptSpecifier Id2, OptSpecifier Id3) const {
764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // FIXME: Make search efficient?
774c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    if ((*it)->getOption().matches(Id0) || (*it)->getOption().matches(Id1) ||
794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        (*it)->getOption().matches(Id2) || (*it)->getOption().matches(Id3))
804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return *it;
814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return nullptr;
824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
8496a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id) 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(Id)) {
8896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
8996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
9096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
9196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
9296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
9396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
9496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
9596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
9696a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1) const {
97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
9896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
9996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
10096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1)) {
10196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
10296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
10396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
10496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
10596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
10696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
10796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
10896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
10996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
11096a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
11196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id2) const {
112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
11396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
11496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
11596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1) ||
11696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id2)) {
11796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
11896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
11996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
12096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
12196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
12296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
12396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
12496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
12596a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
12696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id2, OptSpecifier Id3) const {
127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
12896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
12996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
13096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1) ||
13196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id2) ||
13296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id3)) {
13396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
13496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
13596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
13696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
13796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
13896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
13996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
14096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
14196a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
14296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id2, OptSpecifier Id3,
14396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id4) const {
144dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
14596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
14696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
14796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1) ||
14896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id2) ||
14996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id3) ||
15096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id4)) {
15196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
15296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
15396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
15496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
15596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
15696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
15796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
15896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
15996a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
16096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id2, OptSpecifier Id3,
16196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id4, OptSpecifier Id5) const {
162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
16396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
16496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
16596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1) ||
16696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id2) ||
16796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id3) ||
16896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id4) ||
16996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id5)) {
17096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
17196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
17296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
17396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
17496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
17596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
17696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
17796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
17896a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
17996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id2, OptSpecifier Id3,
18096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id4, OptSpecifier Id5,
18196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id6) const {
182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
18396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
18496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
18596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1) ||
18696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id2) ||
18796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id3) ||
18896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id4) ||
18996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id5) ||
19096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id6)) {
19196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
19296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
19396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
19496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
19596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
19696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
19796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
19896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
19996a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
20096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id2, OptSpecifier Id3,
20196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id4, OptSpecifier Id5,
20296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id6, OptSpecifier Id7) const {
203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Arg *Res = nullptr;
20496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
20596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if ((*it)->getOption().matches(Id0) ||
20696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id1) ||
20796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id2) ||
20896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id3) ||
20996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id4) ||
21096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id5) ||
21196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id6) ||
21296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer        (*it)->getOption().matches(Id7)) {
21396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res = *it;
21496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Res->claim();
21596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
21696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
21796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
21896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Res;
21996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
22096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
22196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerbool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const {
22296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (Arg *A = getLastArg(Pos, Neg))
22396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return A->getOption().matches(Pos);
22496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Default;
22596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
22696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2271ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Klecknerbool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier PosAlias, OptSpecifier Neg,
2281ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner                      bool Default) const {
2291ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner  if (Arg *A = getLastArg(Pos, PosAlias, Neg))
2301ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner    return A->getOption().matches(Pos) || A->getOption().matches(PosAlias);
2311ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner  return Default;
2321ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner}
2331ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner
23496a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerStringRef ArgList::getLastArgValue(OptSpecifier Id,
23596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                         StringRef Default) const {
23696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (Arg *A = getLastArg(Id))
23796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return A->getValue();
23896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Default;
23996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
24096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
24196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerstd::vector<std::string> ArgList::getAllArgValues(OptSpecifier Id) const {
24296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  SmallVector<const char *, 16> Values;
24396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  AddAllArgValues(Values, Id);
24496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return std::vector<std::string>(Values.begin(), Values.end());
24596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
24696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
24796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id) const {
24896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (Arg *A = getLastArg(Id)) {
24996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    A->claim();
25096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    A->render(*this, Output);
25196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
25296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
25396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
2541ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Klecknervoid ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id0,
2551ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner                         OptSpecifier Id1) const {
2561ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner  if (Arg *A = getLastArg(Id0, Id1)) {
2571ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner    A->claim();
2581ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner    A->render(*this, Output);
2591ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner  }
2601ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner}
2611ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner
262f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid ArgList::AddAllArgs(ArgStringList &Output,
263f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                         ArrayRef<OptSpecifier> Ids) const {
264f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (const Arg *Arg : Args) {
265f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    for (OptSpecifier Id : Ids) {
266f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (Arg->getOption().matches(Id)) {
267f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        Arg->claim();
268f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        Arg->render(*this, Output);
269f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
270f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      }
271f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
272f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
273f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
274f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
275f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// This 3-opt variant of AddAllArgs could be eliminated in favor of one
276f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// that accepts a single specifier, given the above which accepts any number.
27796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
27896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                         OptSpecifier Id1, OptSpecifier Id2) const {
279c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  for (auto Arg: filtered(Id0, Id1, Id2)) {
280c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Arg->claim();
281c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Arg->render(*this, Output);
28296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
28396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
28496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
28596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0,
28696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                              OptSpecifier Id1, OptSpecifier Id2) const {
287c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  for (auto Arg : filtered(Id0, Id1, Id2)) {
288c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Arg->claim();
289ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    const auto &Values = Arg->getValues();
290ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Output.append(Values.begin(), Values.end());
29196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
29296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
29396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
29496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0,
29596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                   const char *Translation,
29696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                   bool Joined) const {
297c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  for (auto Arg: filtered(Id0)) {
298c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Arg->claim();
29996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
30096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (Joined) {
30196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Output.push_back(MakeArgString(StringRef(Translation) +
302c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                     Arg->getValue(0)));
30396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    } else {
30496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Output.push_back(Translation);
305c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      Output.push_back(Arg->getValue(0));
30696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
30796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
30896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
30996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
31096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::ClaimAllArgs(OptSpecifier Id0) const {
311c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  for (auto Arg : filtered(Id0))
312c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Arg->claim();
31396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
31496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
31596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::ClaimAllArgs() const {
31696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  for (const_iterator it = begin(), ie = end(); it != ie; ++it)
31796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (!(*it)->isClaimed())
31896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      (*it)->claim();
31996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
32096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
32196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerconst char *ArgList::GetOrMakeJoinedArgString(unsigned Index,
32296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                              StringRef LHS,
32396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                              StringRef RHS) const {
32496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  StringRef Cur = getArgString(Index);
32596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  if (Cur.size() == LHS.size() + RHS.size() &&
32696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      Cur.startswith(LHS) && Cur.endswith(RHS))
32796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Cur.data();
32896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
32996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return MakeArgString(LHS + RHS);
33096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
33196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
332f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid ArgList::print(raw_ostream &O) const {
333f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (Arg *A : *this) {
334f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    O << "* ";
335f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    A->print(O);
336f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
337f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
338f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
339f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarLLVM_DUMP_METHOD void ArgList::dump() const { print(dbgs()); }
340f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
34196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
34296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
343f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid InputArgList::releaseMemory() {
344f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // An InputArgList always owns its arguments.
345f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (Arg *A : *this)
346f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    delete A;
347f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
348f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
34996a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerInputArgList::InputArgList(const char* const *ArgBegin,
35096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                           const char* const *ArgEnd)
35196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  : NumInputArgStrings(ArgEnd - ArgBegin) {
35296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  ArgStrings.append(ArgBegin, ArgEnd);
35396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
35496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
35596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerunsigned InputArgList::MakeIndex(StringRef String0) const {
35696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned Index = ArgStrings.size();
35796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
35896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  // Tuck away so we have a reliable const char *.
359f73f80975639a7413bee66391556f7ea51f83423Reid Kleckner  SynthesizedStrings.push_back(String0);
360f73f80975639a7413bee66391556f7ea51f83423Reid Kleckner  ArgStrings.push_back(SynthesizedStrings.back().c_str());
36196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
36296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Index;
36396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
36496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
36596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerunsigned InputArgList::MakeIndex(StringRef String0,
36696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                 StringRef String1) const {
36796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned Index0 = MakeIndex(String0);
36896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned Index1 = MakeIndex(String1);
36996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!");
37096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  (void) Index1;
37196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return Index0;
37296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
37396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
3744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarconst char *InputArgList::MakeArgStringRef(StringRef Str) const {
37596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return getArgString(MakeIndex(Str));
37696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
37796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
37896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//
37996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
3804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarDerivedArgList::DerivedArgList(const InputArgList &BaseArgs)
3814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    : BaseArgs(BaseArgs) {}
38296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
3834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarconst char *DerivedArgList::MakeArgStringRef(StringRef Str) const {
38496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  return BaseArgs.MakeArgString(Str);
38596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
38696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
387dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DerivedArgList::AddSynthesizedArg(Arg *A) {
388dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SynthesizedArgs.push_back(std::unique_ptr<Arg>(A));
389dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
390dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
39196a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *DerivedArgList::MakeFlagArg(const Arg *BaseArg, const Option Opt) const {
392c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  SynthesizedArgs.push_back(
393c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      make_unique<Arg>(Opt, MakeArgString(Opt.getPrefix() + Opt.getName()),
394c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                       BaseArgs.MakeIndex(Opt.getName()), BaseArg));
395dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return SynthesizedArgs.back().get();
39696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
39796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
39896a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option Opt,
39996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                       StringRef Value) const {
40096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned Index = BaseArgs.MakeIndex(Value);
401c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  SynthesizedArgs.push_back(
402c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      make_unique<Arg>(Opt, MakeArgString(Opt.getPrefix() + Opt.getName()),
403c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                       Index, BaseArgs.getArgString(Index), BaseArg));
404dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return SynthesizedArgs.back().get();
40596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
40696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
40796a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option Opt,
40896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                     StringRef Value) const {
40996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned Index = BaseArgs.MakeIndex(Opt.getName(), Value);
410c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  SynthesizedArgs.push_back(
411c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      make_unique<Arg>(Opt, MakeArgString(Opt.getPrefix() + Opt.getName()),
412c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                       Index, BaseArgs.getArgString(Index + 1), BaseArg));
413dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return SynthesizedArgs.back().get();
41496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
41596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
41696a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option Opt,
41796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                                   StringRef Value) const {
4180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  unsigned Index = BaseArgs.MakeIndex((Opt.getName() + Value).str());
419dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SynthesizedArgs.push_back(make_unique<Arg>(
420c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      Opt, MakeArgString(Opt.getPrefix() + Opt.getName()), Index,
421c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      BaseArgs.getArgString(Index) + Opt.getName().size(), BaseArg));
422dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return SynthesizedArgs.back().get();
42396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}
424