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