Arg.cpp revision 4465a776a56de81211ae4672e5782c6bef075135
1fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar//===--- 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" 13bbd2a045871c1acff39c43dffd346adbb1b2dde5Daniel Dunbar#include "llvm/ADT/Twine.h" 14f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar#include "llvm/Support/raw_ostream.h" 15fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 16fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbarusing namespace clang::driver; 17fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg::Arg(ArgClass _Kind, const Option *_Opt, unsigned _Index, 191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Arg *_BaseArg) 204465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar : Kind(_Kind), Opt(_Opt), BaseArg(_BaseArg), Index(_Index), 214465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar Claimed(false), OwnsValues(false) { 22fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar} 23fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 244465a776a56de81211ae4672e5782c6bef075135Daniel DunbarArg::~Arg() { 254465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar if (OwnsValues) { 264465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar for (unsigned i = 0, e = Values.size(); i != e; ++i) 274465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar delete[] Values[i]; 284465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar } 294465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar} 30fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 31f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbarvoid Arg::dump() const { 32f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar llvm::errs() << "<"; 33f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar switch (Kind) { 34f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar default: 35f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar assert(0 && "Invalid kind"); 36f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar#define P(N) case N: llvm::errs() << #N; break 370648262df75d97b464c2be0ed867da3615659785Daniel Dunbar P(FlagClass); 38f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar P(PositionalClass); 39f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar P(JoinedClass); 40f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar P(SeparateClass); 41f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar P(CommaJoinedClass); 42f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar P(JoinedAndSeparateClass); 43f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar#undef P 44f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar } 45f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar 46f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar llvm::errs() << " Opt:"; 47f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar Opt->dump(); 48f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar 49f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar llvm::errs() << " Index:" << Index; 50f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar 51bbf842bb27c6e964359111b6a72a5f948c56fc41Daniel Dunbar if (isa<CommaJoinedArg>(this) || isa<SeparateArg>(this)) 52bbf842bb27c6e964359111b6a72a5f948c56fc41Daniel Dunbar llvm::errs() << " NumValues:" << getNumValues(); 53f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar 54f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar llvm::errs() << ">\n"; 55f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar} 56f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar 5738dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbarstd::string Arg::getAsString(const ArgList &Args) const { 5838dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar std::string Res; 5938dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar llvm::raw_string_ostream OS(Res); 6038dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar 6138dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar ArgStringList ASL; 6238dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar render(Args, ASL); 631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (ArgStringList::iterator 6438dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar it = ASL.begin(), ie = ASL.end(); it != ie; ++it) { 6538dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar if (it != ASL.begin()) 6638dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar OS << ' '; 6738dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar OS << *it; 6838dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar } 6938dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar 7038dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar return OS.str(); 7138dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar} 7238dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar 7342f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbarvoid Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const { 7442f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar if (!getOption().hasNoOptAsInput()) { 7542f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar render(Args, Output); 7642f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar return; 7742f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar } 7842f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar 7942f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar for (unsigned i = 0, e = getNumValues(); i != e; ++i) 8042f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar Output.push_back(getValue(Args, i)); 8142f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar} 8242f7fc23044cc736db77878734258d35ad3dfe66Daniel Dunbar 83478edc295efc560627053e2320bedd2f696ae028Daniel DunbarFlagArg::FlagArg(const Option *Opt, unsigned Index, const Arg *BaseArg) 84478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar : Arg(FlagClass, Opt, Index, BaseArg) { 850648262df75d97b464c2be0ed867da3615659785Daniel Dunbar} 860648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 870648262df75d97b464c2be0ed867da3615659785Daniel Dunbarvoid FlagArg::render(const ArgList &Args, ArgStringList &Output) const { 88a3f28c341a1b69fc1b8deefb4f9abd64ac949ec1Daniel Dunbar Output.push_back(getOption().getName()); 890648262df75d97b464c2be0ed867da3615659785Daniel Dunbar} 900648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpPositionalArg::PositionalArg(const Option *Opt, unsigned Index, 924465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar const char *Value0, const Arg *BaseArg) 93478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar : Arg(PositionalClass, Opt, Index, BaseArg) { 944465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar getValues().push_back(Value0); 95fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar} 96fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 97fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbarvoid PositionalArg::render(const ArgList &Args, ArgStringList &Output) const { 9821fd6ac7ae51d0176ccbfcfde3aa276e298dccaaDaniel Dunbar Output.push_back(Args.getArgString(getIndex())); 99fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar} 100fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 1014465a776a56de81211ae4672e5782c6bef075135Daniel DunbarJoinedArg::JoinedArg(const Option *Opt, unsigned Index, const char *Value0, 102312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar const Arg *BaseArg) 1034465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar : Arg(JoinedClass, Opt, Index, BaseArg) { 1044465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar getValues().push_back(Value0); 105fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar} 106fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 107fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbarvoid JoinedArg::render(const ArgList &Args, ArgStringList &Output) const { 10821fd6ac7ae51d0176ccbfcfde3aa276e298dccaaDaniel Dunbar if (getOption().hasForceSeparateRender()) { 10921fd6ac7ae51d0176ccbfcfde3aa276e298dccaaDaniel Dunbar Output.push_back(getOption().getName()); 11021fd6ac7ae51d0176ccbfcfde3aa276e298dccaaDaniel Dunbar Output.push_back(getValue(Args, 0)); 11121fd6ac7ae51d0176ccbfcfde3aa276e298dccaaDaniel Dunbar } else { 112312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar Output.push_back(Args.GetOrMakeJoinedArgString( 113312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar getIndex(), getOption().getName(), getValue(Args, 0))); 11421fd6ac7ae51d0176ccbfcfde3aa276e298dccaaDaniel Dunbar } 115fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar} 116fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 1171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCommaJoinedArg::CommaJoinedArg(const Option *Opt, unsigned Index, 118478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar const char *Str, const Arg *BaseArg) 119478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar : Arg(CommaJoinedClass, Opt, Index, BaseArg) { 1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *Prev = Str; 1210648262df75d97b464c2be0ed867da3615659785Daniel Dunbar for (;; ++Str) { 1220648262df75d97b464c2be0ed867da3615659785Daniel Dunbar char c = *Str; 1230648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 1244465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar if (!c || c == ',') { 1254465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar if (Prev != Str) { 1264465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar char *Value = new char[Str - Prev + 1]; 1274465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar memcpy(Value, Prev, Str - Prev); 1284465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar Value[Str - Prev] = '\0'; 1294465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar getValues().push_back(Value); 1304465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar } 1314465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar 1324465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar if (!c) 1334465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar break; 1344465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar 1350648262df75d97b464c2be0ed867da3615659785Daniel Dunbar Prev = Str + 1; 1360648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 1370648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 1384465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar 1394465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar setOwnsValues(true); 140fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar} 141fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 142fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbarvoid CommaJoinedArg::render(const ArgList &Args, ArgStringList &Output) const { 14321fd6ac7ae51d0176ccbfcfde3aa276e298dccaaDaniel Dunbar Output.push_back(Args.getArgString(getIndex())); 144fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar} 145fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 1464465a776a56de81211ae4672e5782c6bef075135Daniel DunbarSeparateArg::SeparateArg(const Option *Opt, unsigned Index, const char *Value0, 147478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar const Arg *BaseArg) 1484465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar : Arg(SeparateClass, Opt, Index, BaseArg) { 1494465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar getValues().push_back(Value0); 150f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar} 151f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar 152f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbarvoid SeparateArg::render(const ArgList &Args, ArgStringList &Output) const { 15321fd6ac7ae51d0176ccbfcfde3aa276e298dccaaDaniel Dunbar if (getOption().hasForceJoinedRender()) { 15421fd6ac7ae51d0176ccbfcfde3aa276e298dccaaDaniel Dunbar assert(getNumValues() == 1 && "Cannot force joined render with > 1 args."); 155bbd2a045871c1acff39c43dffd346adbb1b2dde5Daniel Dunbar Output.push_back(Args.MakeArgString(llvm::StringRef(getOption().getName()) + 156bbd2a045871c1acff39c43dffd346adbb1b2dde5Daniel Dunbar getValue(Args, 0))); 15721fd6ac7ae51d0176ccbfcfde3aa276e298dccaaDaniel Dunbar } else { 158a3f28c341a1b69fc1b8deefb4f9abd64ac949ec1Daniel Dunbar Output.push_back(getOption().getName()); 1594465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar for (unsigned i = 0; i != getNumValues(); ++i) 160bbd2a045871c1acff39c43dffd346adbb1b2dde5Daniel Dunbar Output.push_back(getValue(Args, i)); 16121fd6ac7ae51d0176ccbfcfde3aa276e298dccaaDaniel Dunbar } 162f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar} 163f781c4192ee51a55c08ec53f054284ad1cdb2043Daniel Dunbar 1641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpJoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index, 1654465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar const char *Value0, 1664465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar const char *Value1, 1674465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar const Arg *BaseArg) 1684465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar : Arg(JoinedAndSeparateClass, Opt, Index, BaseArg) { 1694465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar getValues().push_back(Value0); 1704465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar getValues().push_back(Value1); 171fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar} 172fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar 1731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid JoinedAndSeparateArg::render(const ArgList &Args, 174fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar ArgStringList &Output) const { 175312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar Output.push_back(Args.GetOrMakeJoinedArgString( 176312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar getIndex(), getOption().getName(), getValue(Args, 0))); 1774465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar Output.push_back(getValue(Args, 1)); 178fb36caee244b9954caf9d4dda73608980e9c45b8Daniel Dunbar} 179