ArgList.cpp revision 9e1f98260a1842df4bb8e6de0b592a1622dcfdc0
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"
129358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbar#include "clang/Driver/Option.h"
136ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar
1416484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar#include "llvm/ADT/SmallString.h"
1516484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar#include "llvm/ADT/Twine.h"
1616484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar#include "llvm/Support/raw_ostream.h"
1716484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar
186ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbarusing namespace clang::driver;
196ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar
20f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel DunbarArgList::ArgList(arglist_type &_Args) : Args(_Args) {
216ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar}
226ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar
236ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel DunbarArgList::~ArgList() {
246ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar}
259358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbar
269358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbarvoid ArgList::append(Arg *A) {
279358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbar  Args.push_back(A);
289358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbar}
29d8cadd4f250d1b69373fc80477f67375d2c54820Daniel Dunbar
309e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArgNoClaim(OptSpecifier Id) const {
31d8cadd4f250d1b69373fc80477f67375d2c54820Daniel Dunbar  // FIXME: Make search efficient?
32e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
33e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    if ((*it)->getOption().matches(Id))
340c562a23a6560b5736077226ab31d6a9a216ccd3Daniel Dunbar      return *it;
350c562a23a6560b5736077226ab31d6a9a216ccd3Daniel Dunbar  return 0;
36d8cadd4f250d1b69373fc80477f67375d2c54820Daniel Dunbar}
37bca58cb5100a4fdff63165af6a1742f5160ec73bDaniel Dunbar
389e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id) const {
39e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  Arg *A = getLastArgNoClaim(Id);
40e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  if (A)
41e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    A->claim();
42e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  return A;
43e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar}
44e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar
459e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1) const {
46e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  Arg *Res, *A0 = getLastArgNoClaim(Id0), *A1 = getLastArgNoClaim(Id1);
471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar  if (A0 && A1)
49cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar    Res = A0->getIndex() > A1->getIndex() ? A0 : A1;
50cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar  else
51cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar    Res = A0 ? A0 : A1;
52cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar
53e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  if (Res)
54cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar    Res->claim();
55cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar
56cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar  return Res;
57cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar}
58cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar
599e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
609e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                         OptSpecifier Id2) const {
6145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  Arg *Res = 0;
62e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  Arg *A0 = getLastArgNoClaim(Id0);
63e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  Arg *A1 = getLastArgNoClaim(Id1);
64e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  Arg *A2 = getLastArgNoClaim(Id2);
6545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
6645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  int A0Idx = A0 ? A0->getIndex() : -1;
6745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  int A1Idx = A1 ? A1->getIndex() : -1;
6845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  int A2Idx = A2 ? A2->getIndex() : -1;
6945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
7045483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  if (A0Idx > A1Idx) {
7145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    if (A0Idx > A2Idx)
7245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling      Res = A0;
7345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    else if (A2Idx != -1)
7445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling      Res = A2;
7545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  } else {
7645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    if (A1Idx > A2Idx)
7745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling      Res = A1;
7845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    else if (A2Idx != -1)
7945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling      Res = A2;
8045483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  }
8145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
82e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  if (Res)
8345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    Res->claim();
8445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
8545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  return Res;
8645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling}
8745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
889e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarbool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const {
899af6668984f1594459a58c381d95272aa7ca7663Daniel Dunbar  if (Arg *A = getLastArg(Pos, Neg))
909af6668984f1594459a58c381d95272aa7ca7663Daniel Dunbar    return A->getOption().matches(Pos);
9118a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  return Default;
9218a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
9318a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar
949e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id) const {
9518a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  if (Arg *A = getLastArg(Id)) {
9618a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    A->claim();
9718a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    A->render(*this, Output);
9818a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  }
9918a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
10018a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar
1019e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0) const {
10218a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  // FIXME: Make fast.
10318a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
10418a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    const Arg *A = *it;
10518a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    if (A->getOption().matches(Id0)) {
10618a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar      A->claim();
10718a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar      A->render(*this, Output);
10818a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    }
10918a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  }
11018a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
11118a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar
1129e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
1139e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                         OptSpecifier Id1) const {
11418a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  // FIXME: Make fast.
11518a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
11618a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    const Arg *A = *it;
11718a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    if (A->getOption().matches(Id0) || A->getOption().matches(Id1)) {
11818a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar      A->claim();
11918a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar      A->render(*this, Output);
12018a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    }
12118a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  }
12218a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
12318a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar
1249e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
1259e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                         OptSpecifier Id1, OptSpecifier Id2) const {
12618a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  // FIXME: Make fast.
12718a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
12818a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    const Arg *A = *it;
12918a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    if (A->getOption().matches(Id0) || A->getOption().matches(Id1) ||
13018a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar        A->getOption().matches(Id2)) {
13118a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar      A->claim();
13218a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar      A->render(*this, Output);
13318a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    }
13418a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  }
13518a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
13618a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar
1379e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0) const {
13818a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  // FIXME: Make fast.
13918a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
14018a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    const Arg *A = *it;
14118a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    if (A->getOption().matches(Id0)) {
14218a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar      A->claim();
14318a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar      for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
14418a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar        Output.push_back(A->getValue(*this, i));
14518a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    }
14618a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  }
14718a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
148ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar
1499e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0,
1509e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                              OptSpecifier Id1) const {
151ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar  // FIXME: Make fast.
152ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
153ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar    const Arg *A = *it;
154ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar    if (A->getOption().matches(Id0) || A->getOption().matches(Id1)) {
155ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar      A->claim();
156ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar      for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
157ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar        Output.push_back(A->getValue(*this, i));
158ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar    }
159ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar  }
160ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar}
161f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
1629e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0,
1634df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar                                   const char *Translation,
1644df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar                                   bool Joined) const {
165524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar  // FIXME: Make fast.
166524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
167524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar    const Arg *A = *it;
168524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar    if (A->getOption().matches(Id0)) {
169524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar      A->claim();
1704df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar
1714df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar      if (Joined) {
1724df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar        std::string Value = Translation;
1734df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar        Value += A->getValue(*this, 0);
1744df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar        Output.push_back(MakeArgString(Value.c_str()));
1754df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar      } else {
1764df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar        Output.push_back(Translation);
1774df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar        Output.push_back(A->getValue(*this, 0));
1784df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar      }
179524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar    }
180524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar  }
181524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar}
182524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar
1839e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::ClaimAllArgs(OptSpecifier Id0) const {
18468fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // FIXME: Make fast.
18568fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
18668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar    const Arg *A = *it;
18768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar    if (A->getOption().matches(Id0))
18868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar      A->claim();
18968fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  }
19068fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar}
19168fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar
19216484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbarconst char *ArgList::MakeArgString(const llvm::Twine &T) const {
19316484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar  llvm::SmallString<256> Str;
19416484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar  T.toVector(Str);
19516484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar  return MakeArgString(Str.str());
19616484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar}
19716484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar
198f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar//
199f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpInputArgList::InputArgList(const char **ArgBegin, const char **ArgEnd)
2011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  : ArgList(ActualArgs), NumInputArgStrings(ArgEnd - ArgBegin) {
202f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  ArgStrings.append(ArgBegin, ArgEnd);
203f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
204f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
205f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel DunbarInputArgList::~InputArgList() {
206f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  // An InputArgList always owns its arguments.
207f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it)
208f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    delete *it;
209f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
210f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
21116484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbarunsigned InputArgList::MakeIndex(llvm::StringRef String0) const {
212f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  unsigned Index = ArgStrings.size();
213f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
214f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  // Tuck away so we have a reliable const char *.
215f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  SynthesizedStrings.push_back(String0);
216f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  ArgStrings.push_back(SynthesizedStrings.back().c_str());
217f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
218f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return Index;
219f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
220f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
22116484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbarunsigned InputArgList::MakeIndex(llvm::StringRef String0,
22216484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar                                 llvm::StringRef String1) const {
223f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  unsigned Index0 = MakeIndex(String0);
224f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  unsigned Index1 = MakeIndex(String1);
225f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!");
226f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  (void) Index1;
227f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return Index0;
228f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
229f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
23016484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbarconst char *InputArgList::MakeArgString(llvm::StringRef Str) const {
231f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return getArgString(MakeIndex(Str));
232f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
233f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
234f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar//
235f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
236f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel DunbarDerivedArgList::DerivedArgList(InputArgList &_BaseArgs, bool _OnlyProxy)
237f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  : ArgList(_OnlyProxy ? _BaseArgs.getArgs() : ActualArgs),
2381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    BaseArgs(_BaseArgs), OnlyProxy(_OnlyProxy) {
239f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
240f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
241f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel DunbarDerivedArgList::~DerivedArgList() {
242f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  // We only own the arguments we explicitly synthesized.
2431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (iterator it = SynthesizedArgs.begin(), ie = SynthesizedArgs.end();
244f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar       it != ie; ++it)
245f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    delete *it;
246f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
247f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
24816484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbarconst char *DerivedArgList::MakeArgString(llvm::StringRef Str) const {
249f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return BaseArgs.MakeArgString(Str);
250f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
251f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
252478edc295efc560627053e2320bedd2f696ae028Daniel DunbarArg *DerivedArgList::MakeFlagArg(const Arg *BaseArg, const Option *Opt) const {
253478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar  return new FlagArg(Opt, BaseArgs.MakeIndex(Opt->getName()), BaseArg);
254f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
255f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option *Opt,
25716484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar                                       llvm::StringRef Value) const {
258478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar  return new PositionalArg(Opt, BaseArgs.MakeIndex(Value), BaseArg);
259f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
260f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option *Opt,
26216484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar                                     llvm::StringRef Value) const {
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return new SeparateArg(Opt, BaseArgs.MakeIndex(Opt->getName(), Value), 1,
264478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar                         BaseArg);
265f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
266f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option *Opt,
26816484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar                                   llvm::StringRef Value) const {
269f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  std::string Joined(Opt->getName());
270f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  Joined += Value;
271478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar  return new JoinedArg(Opt, BaseArgs.MakeIndex(Joined.c_str()), BaseArg);
272f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
273