xref: /llvm-project-15.0.7/llvm/lib/Option/Arg.cpp (revision adcd0268)
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