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