ArgList.cpp revision 5f9e272e632e951b1efe824cd16acb4d96077930
13fdcc6fb12d7cf38d2a3111736f80f0dd55447b4Nick Lewycky//===--- 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 {
58592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  Arg *Res = 0;
59592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
60592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola    if ((*it)->getOption().matches(Id)) {
61592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola      Res = *it;
62592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola      Res->claim();
63592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola    }
64592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  }
65592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola
66592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  return Res;
67e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar}
68e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar
699e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1) const {
70fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar  Arg *Res = 0;
71592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
72fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar    if ((*it)->getOption().matches(Id0) ||
73fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar        (*it)->getOption().matches(Id1)) {
74fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar      Res = *it;
75592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola      Res->claim();
76592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola
77fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar    }
78fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar  }
79cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar
80cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar  return Res;
81cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar}
82cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar
839e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
849e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                         OptSpecifier Id2) const {
8545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  Arg *Res = 0;
86592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
87fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar    if ((*it)->getOption().matches(Id0) ||
88fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar        (*it)->getOption().matches(Id1) ||
89fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar        (*it)->getOption().matches(Id2)) {
90fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar      Res = *it;
91592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola      Res->claim();
92fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar    }
9345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  }
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;
101592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  for (const_iterator it = begin(), ie = end(); 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;
107592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola      Res->claim();
10847e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar    }
10947e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  }
11047e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar
11147e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  return Res;
11247e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar}
11347e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar
1149e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarbool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const {
1159af6668984f1594459a58c381d95272aa7ca7663Daniel Dunbar  if (Arg *A = getLastArg(Pos, Neg))
1169af6668984f1594459a58c381d95272aa7ca7663Daniel Dunbar    return A->getOption().matches(Pos);
11718a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  return Default;
11818a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
11918a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar
1205f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef ArgList::getLastArgValue(OptSpecifier Id,
1215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                         StringRef Default) const {
12203e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  if (Arg *A = getLastArg(Id))
12303e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar    return A->getValue(*this);
12403e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  return Default;
12503e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar}
12603e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
12703e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbarint ArgList::getLastArgIntValue(OptSpecifier Id, int Default,
1285e30b8bf56c41fcfec63ae82ddd461c99f3c4221Daniel Dunbar                                clang::Diagnostic &Diags) const {
12903e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  int Res = Default;
13003e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
13103e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  if (Arg *A = getLastArg(Id)) {
1325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    if (StringRef(A->getValue(*this)).getAsInteger(10, Res))
13303e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar      Diags.Report(diag::err_drv_invalid_int_value)
13403e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar        << A->getAsString(*this) << A->getValue(*this);
13503e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  }
13603e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
13703e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  return Res;
13803e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar}
13903e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
14003e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbarstd::vector<std::string> ArgList::getAllArgValues(OptSpecifier Id) const {
1415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<const char *, 16> Values;
14203e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  AddAllArgValues(Values, Id);
14303e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  return std::vector<std::string>(Values.begin(), Values.end());
14403e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar}
14503e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
1469e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id) const {
14718a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  if (Arg *A = getLastArg(Id)) {
14818a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    A->claim();
14918a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    A->render(*this, Output);
15018a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  }
15118a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
15218a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar
1539e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
1549e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                         OptSpecifier Id1, OptSpecifier Id2) const {
1553b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (arg_iterator it = filtered_begin(Id0, Id1, Id2),
1563b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar         ie = filtered_end(); it != ie; ++it) {
1577e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
1587e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->render(*this, Output);
15918a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  }
16018a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
161ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar
1629e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0,
1633b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar                              OptSpecifier Id1, OptSpecifier Id2) const {
1643b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (arg_iterator it = filtered_begin(Id0, Id1, Id2),
1653b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar         ie = filtered_end(); it != ie; ++it) {
1667e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
1677e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
1687e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      Output.push_back((*it)->getValue(*this, i));
169ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar  }
170ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar}
171f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
1729e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0,
1734df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar                                   const char *Translation,
1744df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar                                   bool Joined) const {
1753b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (arg_iterator it = filtered_begin(Id0),
1763b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar         ie = filtered_end(); it != ie; ++it) {
1777e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
1783b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar
1793b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    if (Joined) {
1805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      Output.push_back(MakeArgString(StringRef(Translation) +
1817e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar                                     (*it)->getValue(*this, 0)));
1823b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    } else {
1833b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar      Output.push_back(Translation);
1847e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      Output.push_back((*it)->getValue(*this, 0));
185524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar    }
186524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar  }
187524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar}
188524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar
1899e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::ClaimAllArgs(OptSpecifier Id0) const {
1903b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (arg_iterator it = filtered_begin(Id0),
1913b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar         ie = filtered_end(); it != ie; ++it)
1927e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
19368fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar}
19468fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar
1955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *ArgList::MakeArgString(const Twine &T) const {
19616484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar  llvm::SmallString<256> Str;
19716484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar  T.toVector(Str);
19816484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar  return MakeArgString(Str.str());
19916484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar}
20016484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar
201312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbarconst char *ArgList::GetOrMakeJoinedArgString(unsigned Index,
2025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                              StringRef LHS,
2035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                              StringRef RHS) const {
2045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef Cur = getArgString(Index);
205312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar  if (Cur.size() == LHS.size() + RHS.size() &&
206312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar      Cur.startswith(LHS) && Cur.endswith(RHS))
207312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar    return Cur.data();
208312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar
209312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar  return MakeArgString(LHS + RHS);
210312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar}
211312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar
212f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar//
213f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2149d520c5ae802fc175c61032b289ddd6968e6ddd2Axel NaumannInputArgList::InputArgList(const char* const *ArgBegin,
2159d520c5ae802fc175c61032b289ddd6968e6ddd2Axel Naumann                           const char* const *ArgEnd)
2163612bc80fabcdd337f6d1df06e69b38c2c5f5a32Daniel Dunbar  : NumInputArgStrings(ArgEnd - ArgBegin) {
217f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  ArgStrings.append(ArgBegin, ArgEnd);
218f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
219f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
220f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel DunbarInputArgList::~InputArgList() {
221f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  // An InputArgList always owns its arguments.
222f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it)
223f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    delete *it;
224f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
225f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerunsigned InputArgList::MakeIndex(StringRef String0) const {
227f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  unsigned Index = ArgStrings.size();
228f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
229f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  // Tuck away so we have a reliable const char *.
230f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  SynthesizedStrings.push_back(String0);
231f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  ArgStrings.push_back(SynthesizedStrings.back().c_str());
232f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
233f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return Index;
234f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
235f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerunsigned InputArgList::MakeIndex(StringRef String0,
2375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                 StringRef String1) const {
238f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  unsigned Index0 = MakeIndex(String0);
239f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  unsigned Index1 = MakeIndex(String1);
240f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!");
241f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  (void) Index1;
242f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return Index0;
243f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
244f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *InputArgList::MakeArgString(StringRef Str) const {
246f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return getArgString(MakeIndex(Str));
247f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
248f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
249f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar//
250f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
251279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel DunbarDerivedArgList::DerivedArgList(const InputArgList &_BaseArgs)
2523612bc80fabcdd337f6d1df06e69b38c2c5f5a32Daniel Dunbar  : BaseArgs(_BaseArgs) {
253f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
254f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
255f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel DunbarDerivedArgList::~DerivedArgList() {
256f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  // We only own the arguments we explicitly synthesized.
2571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (iterator it = SynthesizedArgs.begin(), ie = SynthesizedArgs.end();
258f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar       it != ie; ++it)
259f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    delete *it;
260f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
261f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *DerivedArgList::MakeArgString(StringRef Str) const {
263f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return BaseArgs.MakeArgString(Str);
264f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
265f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
266478edc295efc560627053e2320bedd2f696ae028Daniel DunbarArg *DerivedArgList::MakeFlagArg(const Arg *BaseArg, const Option *Opt) const {
267532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  Arg *A = new Arg(Opt, BaseArgs.MakeIndex(Opt->getName()), BaseArg);
268fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  SynthesizedArgs.push_back(A);
269fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  return A;
270f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
271f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option *Opt,
2735f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                       StringRef Value) const {
2744465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar  unsigned Index = BaseArgs.MakeIndex(Value);
275532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  Arg *A = new Arg(Opt, Index, BaseArgs.getArgString(Index), BaseArg);
276fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  SynthesizedArgs.push_back(A);
277fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  return A;
278f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
279f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option *Opt,
2815f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                     StringRef Value) const {
2824465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar  unsigned Index = BaseArgs.MakeIndex(Opt->getName(), Value);
283fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar  Arg *A = new Arg(Opt, Index, BaseArgs.getArgString(Index + 1), BaseArg);
284fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  SynthesizedArgs.push_back(A);
285fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  return A;
286f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
287f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option *Opt,
2895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                   StringRef Value) const {
290bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor  unsigned Index = BaseArgs.MakeIndex(Opt->getName().str() + Value.str());
291532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  Arg *A = new Arg(Opt, Index,
292bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor                   BaseArgs.getArgString(Index) + Opt->getName().size(),
293532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar                   BaseArg);
294fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  SynthesizedArgs.push_back(A);
295fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  return A;
296f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
297