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