xref: /freebsd/contrib/llvm-project/llvm/lib/Option/Arg.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric //===- Arg.cpp - Argument Implementations ---------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "llvm/ADT/SmallString.h"
100b57cec5SDimitry Andric #include "llvm/Config/llvm-config.h"
110b57cec5SDimitry Andric #include "llvm/Option/Arg.h"
120b57cec5SDimitry Andric #include "llvm/Option/ArgList.h"
130b57cec5SDimitry Andric #include "llvm/Option/Option.h"
140b57cec5SDimitry Andric #include "llvm/Support/Compiler.h"
150b57cec5SDimitry Andric #include "llvm/Support/Debug.h"
160b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric using namespace llvm;
190b57cec5SDimitry Andric using namespace llvm::opt;
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric Arg::Arg(const Option Opt, StringRef S, unsigned Index, const Arg *BaseArg)
220b57cec5SDimitry Andric     : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),
2306c3fb27SDimitry Andric       IgnoredTargetSpecific(false), OwnsValues(false) {}
240b57cec5SDimitry Andric 
250b57cec5SDimitry Andric Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0,
260b57cec5SDimitry Andric          const Arg *BaseArg)
270b57cec5SDimitry Andric     : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),
2806c3fb27SDimitry Andric       IgnoredTargetSpecific(false), OwnsValues(false) {
290b57cec5SDimitry Andric   Values.push_back(Value0);
300b57cec5SDimitry Andric }
310b57cec5SDimitry Andric 
320b57cec5SDimitry Andric Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0,
330b57cec5SDimitry Andric          const char *Value1, const Arg *BaseArg)
340b57cec5SDimitry Andric     : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),
3506c3fb27SDimitry Andric       IgnoredTargetSpecific(false), OwnsValues(false) {
360b57cec5SDimitry Andric   Values.push_back(Value0);
370b57cec5SDimitry Andric   Values.push_back(Value1);
380b57cec5SDimitry Andric }
390b57cec5SDimitry Andric 
400b57cec5SDimitry Andric Arg::~Arg() {
410b57cec5SDimitry Andric   if (OwnsValues) {
420b57cec5SDimitry Andric     for (unsigned i = 0, e = Values.size(); i != e; ++i)
430b57cec5SDimitry Andric       delete[] Values[i];
440b57cec5SDimitry Andric   }
450b57cec5SDimitry Andric }
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric void Arg::print(raw_ostream& O) const {
48*5f757f3fSDimitry Andric   O << "<Opt:";
49*5f757f3fSDimitry Andric   Opt.print(O, /*AddNewLine=*/false);
500b57cec5SDimitry Andric 
510b57cec5SDimitry Andric   O << " Index:" << Index;
520b57cec5SDimitry Andric 
530b57cec5SDimitry Andric   O << " Values: [";
540b57cec5SDimitry Andric   for (unsigned i = 0, e = Values.size(); i != e; ++i) {
550b57cec5SDimitry Andric     if (i) O << ", ";
560b57cec5SDimitry Andric     O << "'" << Values[i] << "'";
570b57cec5SDimitry Andric   }
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric   O << "]>\n";
600b57cec5SDimitry Andric }
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
630b57cec5SDimitry Andric LLVM_DUMP_METHOD void Arg::dump() const { print(dbgs()); }
640b57cec5SDimitry Andric #endif
650b57cec5SDimitry Andric 
660b57cec5SDimitry Andric std::string Arg::getAsString(const ArgList &Args) const {
670b57cec5SDimitry Andric   if (Alias)
680b57cec5SDimitry Andric     return Alias->getAsString(Args);
690b57cec5SDimitry Andric 
700b57cec5SDimitry Andric   SmallString<256> Res;
710b57cec5SDimitry Andric   raw_svector_ostream OS(Res);
720b57cec5SDimitry Andric 
730b57cec5SDimitry Andric   ArgStringList ASL;
740b57cec5SDimitry Andric   render(Args, ASL);
750b57cec5SDimitry Andric   for (ArgStringList::iterator
760b57cec5SDimitry Andric          it = ASL.begin(), ie = ASL.end(); it != ie; ++it) {
770b57cec5SDimitry Andric     if (it != ASL.begin())
780b57cec5SDimitry Andric       OS << ' ';
790b57cec5SDimitry Andric     OS << *it;
800b57cec5SDimitry Andric   }
810b57cec5SDimitry Andric 
825ffd83dbSDimitry Andric   return std::string(OS.str());
830b57cec5SDimitry Andric }
840b57cec5SDimitry Andric 
850b57cec5SDimitry Andric void Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const {
860b57cec5SDimitry Andric   if (!getOption().hasNoOptAsInput()) {
870b57cec5SDimitry Andric     render(Args, Output);
880b57cec5SDimitry Andric     return;
890b57cec5SDimitry Andric   }
900b57cec5SDimitry Andric 
910b57cec5SDimitry Andric   Output.append(Values.begin(), Values.end());
920b57cec5SDimitry Andric }
930b57cec5SDimitry Andric 
940b57cec5SDimitry Andric void Arg::render(const ArgList &Args, ArgStringList &Output) const {
950b57cec5SDimitry Andric   switch (getOption().getRenderStyle()) {
960b57cec5SDimitry Andric   case Option::RenderValuesStyle:
970b57cec5SDimitry Andric     Output.append(Values.begin(), Values.end());
980b57cec5SDimitry Andric     break;
990b57cec5SDimitry Andric 
1000b57cec5SDimitry Andric   case Option::RenderCommaJoinedStyle: {
1010b57cec5SDimitry Andric     SmallString<256> Res;
1020b57cec5SDimitry Andric     raw_svector_ostream OS(Res);
1030b57cec5SDimitry Andric     OS << getSpelling();
1040b57cec5SDimitry Andric     for (unsigned i = 0, e = getNumValues(); i != e; ++i) {
1050b57cec5SDimitry Andric       if (i) OS << ',';
1060b57cec5SDimitry Andric       OS << getValue(i);
1070b57cec5SDimitry Andric     }
1080b57cec5SDimitry Andric     Output.push_back(Args.MakeArgString(OS.str()));
1090b57cec5SDimitry Andric     break;
1100b57cec5SDimitry Andric   }
1110b57cec5SDimitry Andric 
1120b57cec5SDimitry Andric  case Option::RenderJoinedStyle:
1130b57cec5SDimitry Andric     Output.push_back(Args.GetOrMakeJoinedArgString(
1140b57cec5SDimitry Andric                        getIndex(), getSpelling(), getValue(0)));
1150b57cec5SDimitry Andric     Output.append(Values.begin() + 1, Values.end());
1160b57cec5SDimitry Andric     break;
1170b57cec5SDimitry Andric 
1180b57cec5SDimitry Andric   case Option::RenderSeparateStyle:
1190b57cec5SDimitry Andric     Output.push_back(Args.MakeArgString(getSpelling()));
1200b57cec5SDimitry Andric     Output.append(Values.begin(), Values.end());
1210b57cec5SDimitry Andric     break;
1220b57cec5SDimitry Andric   }
1230b57cec5SDimitry Andric }
124