13fdcc6fb12d7cf38d2a3111736f80f0dd55447b4Nick Lewycky//===--- Arg.cpp - Argument Implementations -------------------------------===// 2fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar// 3fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar// The LLVM Compiler Infrastructure 4fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar// 5fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar// This file is distributed under the University of Illinois Open Source 6fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar// License. See LICENSE.TXT for details. 7fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar// 8fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar//===----------------------------------------------------------------------===// 9fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 10fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar#include "clang/Driver/Arg.h" 110648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#include "clang/Driver/ArgList.h" 12f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar#include "clang/Driver/Option.h" 13e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar#include "llvm/ADT/SmallString.h" 14bbd2a045871c1acff39c43dffd346adbb1b2dde5Daniel Dunbar#include "llvm/ADT/Twine.h" 15f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar#include "llvm/Support/raw_ostream.h" 16fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 17fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbarusing namespace clang::driver; 18fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 19532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel DunbarArg::Arg(const Option *_Opt, unsigned _Index, const Arg *_BaseArg) 20532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar : Opt(_Opt), BaseArg(_BaseArg), Index(_Index), 214465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar Claimed(false), OwnsValues(false) { 22fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar} 23fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 24532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel DunbarArg::Arg(const Option *_Opt, unsigned _Index, 25532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar const char *Value0, const Arg *_BaseArg) 26532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar : Opt(_Opt), BaseArg(_BaseArg), Index(_Index), 27532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar Claimed(false), OwnsValues(false) { 28532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar Values.push_back(Value0); 29532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar} 30532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar 31532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel DunbarArg::Arg(const Option *_Opt, unsigned _Index, 32532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar const char *Value0, const char *Value1, const Arg *_BaseArg) 33532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar : Opt(_Opt), BaseArg(_BaseArg), Index(_Index), 34532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar Claimed(false), OwnsValues(false) { 35532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar Values.push_back(Value0); 36532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar Values.push_back(Value1); 37532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar} 38532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar 394465a776a56de81211ae4672e5782c6bef075135Daniel DunbarArg::~Arg() { 404465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar if (OwnsValues) { 414465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar for (unsigned i = 0, e = Values.size(); i != e; ++i) 424465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar delete[] Values[i]; 434465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar } 444465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar} 45fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 46f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbarvoid Arg::dump() const { 47f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar llvm::errs() << "<"; 48f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar 49f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar llvm::errs() << " Opt:"; 50f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar Opt->dump(); 51f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar 52f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar llvm::errs() << " Index:" << Index; 53f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar 54532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar llvm::errs() << " Values: ["; 55532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar for (unsigned i = 0, e = Values.size(); i != e; ++i) { 56532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar if (i) llvm::errs() << ", "; 57532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar llvm::errs() << "'" << Values[i] << "'"; 58532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar } 59f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar 60532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar llvm::errs() << "]>\n"; 61f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar} 62f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar 6338dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbarstd::string Arg::getAsString(const ArgList &Args) const { 64f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<256> Res; 65e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar llvm::raw_svector_ostream OS(Res); 6638dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar 6738dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar ArgStringList ASL; 6838dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar render(Args, ASL); 691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (ArgStringList::iterator 7038dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar it = ASL.begin(), ie = ASL.end(); it != ie; ++it) { 7138dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar if (it != ASL.begin()) 7238dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar OS << ' '; 7338dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar OS << *it; 7438dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar } 7538dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar 7638dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar return OS.str(); 7738dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar} 7838dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar 7942f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbarvoid Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const { 8042f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar if (!getOption().hasNoOptAsInput()) { 8142f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar render(Args, Output); 8242f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar return; 8342f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar } 8442f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar 8542f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar for (unsigned i = 0, e = getNumValues(); i != e; ++i) 8642f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar Output.push_back(getValue(Args, i)); 8742f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar} 8842f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar 89e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbarvoid Arg::render(const ArgList &Args, ArgStringList &Output) const { 90e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar switch (getOption().getRenderStyle()) { 91e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar case Option::RenderValuesStyle: 92e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar for (unsigned i = 0, e = getNumValues(); i != e; ++i) 93e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar Output.push_back(getValue(Args, i)); 94e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar break; 95e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar 96e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar case Option::RenderCommaJoinedStyle: { 97f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<256> Res; 98e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar llvm::raw_svector_ostream OS(Res); 99e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar OS << getOption().getName(); 100e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar for (unsigned i = 0, e = getNumValues(); i != e; ++i) { 101e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar if (i) OS << ','; 102e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar OS << getValue(Args, i); 103e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar } 104e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar Output.push_back(Args.MakeArgString(OS.str())); 105e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar break; 106e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar } 107e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar 108e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar case Option::RenderJoinedStyle: 109e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar Output.push_back(Args.GetOrMakeJoinedArgString( 110e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar getIndex(), getOption().getName(), getValue(Args, 0))); 111e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar for (unsigned i = 1, e = getNumValues(); i != e; ++i) 112e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar Output.push_back(getValue(Args, i)); 113e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar break; 114e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar 115e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar case Option::RenderSeparateStyle: 116bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor Output.push_back(getOption().getName().data()); 117e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar for (unsigned i = 0, e = getNumValues(); i != e; ++i) 118e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar Output.push_back(getValue(Args, i)); 119e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar break; 120e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar } 1210648262df75d97b464c2be0ed867da3615659785Daniel Dunbar} 122