ArgList.cpp revision 47e879dfa735f81472a51b1bd69cc4eb9159db39
16ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar//===--- ArgList.cpp - Argument List Management -------------------------*-===//
26ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar//
36ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar//                     The LLVM Compiler Infrastructure
46ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar//
56ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar// This file is distributed under the University of Illinois Open Source
66ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar// License. See LICENSE.TXT for details.
76ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar//
86ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar//===----------------------------------------------------------------------===//
96ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar
106ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar#include "clang/Driver/ArgList.h"
116ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar#include "clang/Driver/Arg.h"
1203e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
139358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbar#include "clang/Driver/Option.h"
146ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar
1516484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar#include "llvm/ADT/SmallString.h"
1616484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar#include "llvm/ADT/Twine.h"
1716484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar#include "llvm/Support/raw_ostream.h"
1816484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar
19a5ddbcac1e784d3e438fc6233a9e0f5516dc35efBenjamin Kramerusing namespace clang;
206ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbarusing namespace clang::driver;
216ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar
223b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbarvoid arg_iterator::SkipToNextArg() {
233b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (; Current != Args.end(); ++Current) {
243b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    // Done if there are no filters.
253b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    if (!Id0.isValid())
263b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar      break;
273b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar
283b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    // Otherwise require a match.
293b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    const Option &O = (*Current)->getOption();
303b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    if (O.matches(Id0) ||
313b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar        (Id1.isValid() && O.matches(Id1)) ||
323b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar        (Id2.isValid() && O.matches(Id2)))
333b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar      break;
343b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  }
353b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar}
363b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar
373b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar//
383b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar
393612bc80fabcdd337f6d1df06e69b38c2c5f5a32Daniel DunbarArgList::ArgList() {
406ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar}
416ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar
426ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel DunbarArgList::~ArgList() {
436ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar}
449358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbar
459358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbarvoid ArgList::append(Arg *A) {
469358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbar  Args.push_back(A);
479358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbar}
48d8cadd4f250d1b69373fc80477f67375d2c54820Daniel Dunbar
499e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArgNoClaim(OptSpecifier Id) const {
50d8cadd4f250d1b69373fc80477f67375d2c54820Daniel Dunbar  // FIXME: Make search efficient?
51e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
52e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    if ((*it)->getOption().matches(Id))
530c562a23a6560b5736077226ab31d6a9a216ccd3Daniel Dunbar      return *it;
540c562a23a6560b5736077226ab31d6a9a216ccd3Daniel Dunbar  return 0;
55d8cadd4f250d1b69373fc80477f67375d2c54820Daniel Dunbar}
56bca58cb5100a4fdff63165af6a1742f5160ec73bDaniel Dunbar
579e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id) const {
58e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  Arg *A = getLastArgNoClaim(Id);
59e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  if (A)
60e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    A->claim();
61e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  return A;
62e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar}
63e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar
649e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1) const {
65fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar  Arg *Res = 0;
66fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar  for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it) {
67fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar    if ((*it)->getOption().matches(Id0) ||
68fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar        (*it)->getOption().matches(Id1)) {
69fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar      Res = *it;
70fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar      break;
71fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar    }
72fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar  }
73cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar
74e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  if (Res)
75cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar    Res->claim();
76cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar
77cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar  return Res;
78cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar}
79cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar
809e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
819e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                         OptSpecifier Id2) const {
8245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  Arg *Res = 0;
83fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar  for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it) {
84fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar    if ((*it)->getOption().matches(Id0) ||
85fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar        (*it)->getOption().matches(Id1) ||
86fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar        (*it)->getOption().matches(Id2)) {
87fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar      Res = *it;
88fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar      break;
89fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar    }
9045483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  }
9145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
92e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  if (Res)
9345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    Res->claim();
9445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
9545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  return Res;
9645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling}
9745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
9847e879dfa735f81472a51b1bd69cc4eb9159db39Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
9947e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar                         OptSpecifier Id2, OptSpecifier Id3) const {
10047e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  Arg *Res = 0;
10147e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it) {
10247e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar    if ((*it)->getOption().matches(Id0) ||
10347e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar        (*it)->getOption().matches(Id1) ||
10447e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar        (*it)->getOption().matches(Id2) ||
10547e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar        (*it)->getOption().matches(Id3)) {
10647e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar      Res = *it;
10747e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar      break;
10847e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar    }
10947e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  }
11047e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar
11147e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  if (Res)
11247e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar    Res->claim();
11347e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar
11447e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  return Res;
11547e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar}
11647e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar
1179e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarbool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const {
1189af6668984f1594459a58c381d95272aa7ca7663Daniel Dunbar  if (Arg *A = getLastArg(Pos, Neg))
1199af6668984f1594459a58c381d95272aa7ca7663Daniel Dunbar    return A->getOption().matches(Pos);
12018a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  return Default;
12118a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
12218a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar
12303e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbarllvm::StringRef ArgList::getLastArgValue(OptSpecifier Id,
12403e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar                                         llvm::StringRef Default) const {
12503e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  if (Arg *A = getLastArg(Id))
12603e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar    return A->getValue(*this);
12703e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  return Default;
12803e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar}
12903e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
13003e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbarint ArgList::getLastArgIntValue(OptSpecifier Id, int Default,
1315e30b8bf56c41fcfec63ae82ddd461c99f3c4221Daniel Dunbar                                clang::Diagnostic &Diags) const {
13203e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  int Res = Default;
13303e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
13403e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  if (Arg *A = getLastArg(Id)) {
13503e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar    if (llvm::StringRef(A->getValue(*this)).getAsInteger(10, Res))
13603e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar      Diags.Report(diag::err_drv_invalid_int_value)
13703e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar        << A->getAsString(*this) << A->getValue(*this);
13803e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  }
13903e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
14003e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  return Res;
14103e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar}
14203e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
14303e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbarstd::vector<std::string> ArgList::getAllArgValues(OptSpecifier Id) const {
14403e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  llvm::SmallVector<const char *, 16> Values;
14503e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  AddAllArgValues(Values, Id);
14603e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  return std::vector<std::string>(Values.begin(), Values.end());
14703e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar}
14803e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
1499e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id) const {
15018a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  if (Arg *A = getLastArg(Id)) {
15118a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    A->claim();
15218a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    A->render(*this, Output);
15318a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  }
15418a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
15518a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar
1569e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
1579e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                         OptSpecifier Id1, OptSpecifier Id2) const {
1583b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (arg_iterator it = filtered_begin(Id0, Id1, Id2),
1593b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar         ie = filtered_end(); it != ie; ++it) {
1607e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
1617e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->render(*this, Output);
16218a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  }
16318a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
164ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar
1659e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0,
1663b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar                              OptSpecifier Id1, OptSpecifier Id2) const {
1673b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (arg_iterator it = filtered_begin(Id0, Id1, Id2),
1683b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar         ie = filtered_end(); it != ie; ++it) {
1697e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
1707e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
1717e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      Output.push_back((*it)->getValue(*this, i));
172ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar  }
173ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar}
174f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
1759e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0,
1764df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar                                   const char *Translation,
1774df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar                                   bool Joined) const {
1783b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (arg_iterator it = filtered_begin(Id0),
1793b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar         ie = filtered_end(); it != ie; ++it) {
1807e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
1813b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar
1823b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    if (Joined) {
1833b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar      Output.push_back(MakeArgString(llvm::StringRef(Translation) +
1847e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar                                     (*it)->getValue(*this, 0)));
1853b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    } else {
1863b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar      Output.push_back(Translation);
1877e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      Output.push_back((*it)->getValue(*this, 0));
188524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar    }
189524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar  }
190524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar}
191524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar
1929e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::ClaimAllArgs(OptSpecifier Id0) const {
1933b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (arg_iterator it = filtered_begin(Id0),
1943b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar         ie = filtered_end(); it != ie; ++it)
1957e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
19668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar}
19768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar
19816484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbarconst char *ArgList::MakeArgString(const llvm::Twine &T) const {
19916484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar  llvm::SmallString<256> Str;
20016484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar  T.toVector(Str);
20116484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar  return MakeArgString(Str.str());
20216484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar}
20316484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar
204312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbarconst char *ArgList::GetOrMakeJoinedArgString(unsigned Index,
205312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar                                              llvm::StringRef LHS,
206312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar                                              llvm::StringRef RHS) const {
207312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar  llvm::StringRef Cur = getArgString(Index);
208312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar  if (Cur.size() == LHS.size() + RHS.size() &&
209312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar      Cur.startswith(LHS) && Cur.endswith(RHS))
210312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar    return Cur.data();
211312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar
212312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar  return MakeArgString(LHS + RHS);
213312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar}
214312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar
215f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar//
216f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpInputArgList::InputArgList(const char **ArgBegin, const char **ArgEnd)
2183612bc80fabcdd337f6d1df06e69b38c2c5f5a32Daniel Dunbar  : NumInputArgStrings(ArgEnd - ArgBegin) {
219f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  ArgStrings.append(ArgBegin, ArgEnd);
220f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
221f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
222f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel DunbarInputArgList::~InputArgList() {
223f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  // An InputArgList always owns its arguments.
224f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it)
225f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    delete *it;
226f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
227f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
22816484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbarunsigned InputArgList::MakeIndex(llvm::StringRef String0) const {
229f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  unsigned Index = ArgStrings.size();
230f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
231f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  // Tuck away so we have a reliable const char *.
232f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  SynthesizedStrings.push_back(String0);
233f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  ArgStrings.push_back(SynthesizedStrings.back().c_str());
234f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
235f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return Index;
236f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
237f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
23816484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbarunsigned InputArgList::MakeIndex(llvm::StringRef String0,
23916484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar                                 llvm::StringRef String1) const {
240f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  unsigned Index0 = MakeIndex(String0);
241f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  unsigned Index1 = MakeIndex(String1);
242f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!");
243f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  (void) Index1;
244f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return Index0;
245f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
246f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
24716484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbarconst char *InputArgList::MakeArgString(llvm::StringRef Str) const {
248f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return getArgString(MakeIndex(Str));
249f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
250f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
251f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar//
252f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
253279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel DunbarDerivedArgList::DerivedArgList(const InputArgList &_BaseArgs)
2543612bc80fabcdd337f6d1df06e69b38c2c5f5a32Daniel Dunbar  : BaseArgs(_BaseArgs) {
255f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
256f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
257f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel DunbarDerivedArgList::~DerivedArgList() {
258f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  // We only own the arguments we explicitly synthesized.
2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (iterator it = SynthesizedArgs.begin(), ie = SynthesizedArgs.end();
260f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar       it != ie; ++it)
261f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    delete *it;
262f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
263f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
26416484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbarconst char *DerivedArgList::MakeArgString(llvm::StringRef Str) const {
265f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return BaseArgs.MakeArgString(Str);
266f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
267f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
268478edc295efc560627053e2320bedd2f696ae028Daniel DunbarArg *DerivedArgList::MakeFlagArg(const Arg *BaseArg, const Option *Opt) const {
269532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  Arg *A = new Arg(Opt, BaseArgs.MakeIndex(Opt->getName()), BaseArg);
270fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  SynthesizedArgs.push_back(A);
271fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  return A;
272f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
273f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option *Opt,
27516484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar                                       llvm::StringRef Value) const {
2764465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar  unsigned Index = BaseArgs.MakeIndex(Value);
277532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  Arg *A = new Arg(Opt, Index, BaseArgs.getArgString(Index), BaseArg);
278fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  SynthesizedArgs.push_back(A);
279fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  return A;
280f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
281f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option *Opt,
28316484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar                                     llvm::StringRef Value) const {
2844465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar  unsigned Index = BaseArgs.MakeIndex(Opt->getName(), Value);
285fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar  Arg *A = new Arg(Opt, Index, BaseArgs.getArgString(Index + 1), BaseArg);
286fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  SynthesizedArgs.push_back(A);
287fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  return A;
288f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
289f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option *Opt,
29116484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar                                   llvm::StringRef Value) const {
2924465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar  unsigned Index = BaseArgs.MakeIndex(Opt->getName() + Value.str());
293532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  Arg *A = new Arg(Opt, Index,
294532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar                   BaseArgs.getArgString(Index) + strlen(Opt->getName()),
295532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar                   BaseArg);
296fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  SynthesizedArgs.push_back(A);
297fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  return A;
298f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
299