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