1af615896SEugene Zelenko //===- Arg.cpp - Argument Implementations ---------------------------------===//
241ee041dSMichael J. Spencer //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
641ee041dSMichael J. Spencer //
741ee041dSMichael J. Spencer //===----------------------------------------------------------------------===//
841ee041dSMichael J. Spencer
941ee041dSMichael J. Spencer #include "llvm/ADT/SmallString.h"
10432a3883SNico Weber #include "llvm/Config/llvm-config.h"
11af615896SEugene Zelenko #include "llvm/Option/Arg.h"
1241ee041dSMichael J. Spencer #include "llvm/Option/ArgList.h"
1341ee041dSMichael J. Spencer #include "llvm/Option/Option.h"
14af615896SEugene Zelenko #include "llvm/Support/Compiler.h"
159a8b5e7eSEric Christopher #include "llvm/Support/Debug.h"
166bda14b3SChandler Carruth #include "llvm/Support/raw_ostream.h"
1741ee041dSMichael J. Spencer
1841ee041dSMichael J. Spencer using namespace llvm;
1941ee041dSMichael J. Spencer using namespace llvm::opt;
2041ee041dSMichael J. Spencer
Arg(const Option Opt,StringRef S,unsigned Index,const Arg * BaseArg)219f380a3cSDavid Blaikie Arg::Arg(const Option Opt, StringRef S, unsigned Index, const Arg *BaseArg)
229f380a3cSDavid Blaikie : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),
239f380a3cSDavid Blaikie OwnsValues(false) {}
2441ee041dSMichael J. Spencer
Arg(const Option Opt,StringRef S,unsigned Index,const char * Value0,const Arg * BaseArg)259f380a3cSDavid Blaikie Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0,
269f380a3cSDavid Blaikie const Arg *BaseArg)
279f380a3cSDavid Blaikie : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),
289f380a3cSDavid Blaikie OwnsValues(false) {
2941ee041dSMichael J. Spencer Values.push_back(Value0);
3041ee041dSMichael J. Spencer }
3141ee041dSMichael J. Spencer
Arg(const Option Opt,StringRef S,unsigned Index,const char * Value0,const char * Value1,const Arg * BaseArg)329f380a3cSDavid Blaikie Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0,
339f380a3cSDavid Blaikie const char *Value1, const Arg *BaseArg)
349f380a3cSDavid Blaikie : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),
359f380a3cSDavid Blaikie OwnsValues(false) {
3641ee041dSMichael J. Spencer Values.push_back(Value0);
3741ee041dSMichael J. Spencer Values.push_back(Value1);
3841ee041dSMichael J. Spencer }
3941ee041dSMichael J. Spencer
~Arg()4041ee041dSMichael J. Spencer Arg::~Arg() {
4141ee041dSMichael J. Spencer if (OwnsValues) {
4241ee041dSMichael J. Spencer for (unsigned i = 0, e = Values.size(); i != e; ++i)
4341ee041dSMichael J. Spencer delete[] Values[i];
4441ee041dSMichael J. Spencer }
4541ee041dSMichael J. Spencer }
4641ee041dSMichael J. Spencer
print(raw_ostream & O) const479a8b5e7eSEric Christopher void Arg::print(raw_ostream& O) const {
489a8b5e7eSEric Christopher O << "<";
4941ee041dSMichael J. Spencer
509a8b5e7eSEric Christopher O << " Opt:";
519a8b5e7eSEric Christopher Opt.print(O);
5241ee041dSMichael J. Spencer
539a8b5e7eSEric Christopher O << " Index:" << Index;
5441ee041dSMichael J. Spencer
559a8b5e7eSEric Christopher O << " Values: [";
5641ee041dSMichael J. Spencer for (unsigned i = 0, e = Values.size(); i != e; ++i) {
579a8b5e7eSEric Christopher if (i) O << ", ";
589a8b5e7eSEric Christopher O << "'" << Values[i] << "'";
5941ee041dSMichael J. Spencer }
6041ee041dSMichael J. Spencer
619a8b5e7eSEric Christopher O << "]>\n";
6241ee041dSMichael J. Spencer }
6341ee041dSMichael J. Spencer
64615eb470SAaron Ballman #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const659a8b5e7eSEric Christopher LLVM_DUMP_METHOD void Arg::dump() const { print(dbgs()); }
668c209aa8SMatthias Braun #endif
679a8b5e7eSEric Christopher
getAsString(const ArgList & Args) const6841ee041dSMichael J. Spencer std::string Arg::getAsString(const ArgList &Args) const {
69e3f06b47SNico Weber if (Alias)
70e3f06b47SNico Weber return Alias->getAsString(Args);
71e3f06b47SNico Weber
72e69170a1SAlp Toker SmallString<256> Res;
73af615896SEugene Zelenko raw_svector_ostream OS(Res);
7441ee041dSMichael J. Spencer
7541ee041dSMichael J. Spencer ArgStringList ASL;
7641ee041dSMichael J. Spencer render(Args, ASL);
7741ee041dSMichael J. Spencer for (ArgStringList::iterator
7841ee041dSMichael J. Spencer it = ASL.begin(), ie = ASL.end(); it != ie; ++it) {
7941ee041dSMichael J. Spencer if (it != ASL.begin())
8041ee041dSMichael J. Spencer OS << ' ';
8141ee041dSMichael J. Spencer OS << *it;
8241ee041dSMichael J. Spencer }
8341ee041dSMichael J. Spencer
84*adcd0268SBenjamin Kramer return std::string(OS.str());
8541ee041dSMichael J. Spencer }
8641ee041dSMichael J. Spencer
renderAsInput(const ArgList & Args,ArgStringList & Output) const8741ee041dSMichael J. Spencer void Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const {
8841ee041dSMichael J. Spencer if (!getOption().hasNoOptAsInput()) {
8941ee041dSMichael J. Spencer render(Args, Output);
9041ee041dSMichael J. Spencer return;
9141ee041dSMichael J. Spencer }
9241ee041dSMichael J. Spencer
936cd780ffSBenjamin Kramer Output.append(Values.begin(), Values.end());
9441ee041dSMichael J. Spencer }
9541ee041dSMichael J. Spencer
render(const ArgList & Args,ArgStringList & Output) const9641ee041dSMichael J. Spencer void Arg::render(const ArgList &Args, ArgStringList &Output) const {
9741ee041dSMichael J. Spencer switch (getOption().getRenderStyle()) {
9841ee041dSMichael J. Spencer case Option::RenderValuesStyle:
996cd780ffSBenjamin Kramer Output.append(Values.begin(), Values.end());
10041ee041dSMichael J. Spencer break;
10141ee041dSMichael J. Spencer
10241ee041dSMichael J. Spencer case Option::RenderCommaJoinedStyle: {
103e69170a1SAlp Toker SmallString<256> Res;
104af615896SEugene Zelenko raw_svector_ostream OS(Res);
10541ee041dSMichael J. Spencer OS << getSpelling();
10641ee041dSMichael J. Spencer for (unsigned i = 0, e = getNumValues(); i != e; ++i) {
10741ee041dSMichael J. Spencer if (i) OS << ',';
10841ee041dSMichael J. Spencer OS << getValue(i);
10941ee041dSMichael J. Spencer }
11041ee041dSMichael J. Spencer Output.push_back(Args.MakeArgString(OS.str()));
11141ee041dSMichael J. Spencer break;
11241ee041dSMichael J. Spencer }
11341ee041dSMichael J. Spencer
11441ee041dSMichael J. Spencer case Option::RenderJoinedStyle:
11541ee041dSMichael J. Spencer Output.push_back(Args.GetOrMakeJoinedArgString(
11641ee041dSMichael J. Spencer getIndex(), getSpelling(), getValue(0)));
1176cd780ffSBenjamin Kramer Output.append(Values.begin() + 1, Values.end());
11841ee041dSMichael J. Spencer break;
11941ee041dSMichael J. Spencer
12041ee041dSMichael J. Spencer case Option::RenderSeparateStyle:
12141ee041dSMichael J. Spencer Output.push_back(Args.MakeArgString(getSpelling()));
1226cd780ffSBenjamin Kramer Output.append(Values.begin(), Values.end());
12341ee041dSMichael J. Spencer break;
12441ee041dSMichael J. Spencer }
12541ee041dSMichael J. Spencer }
126