Path: blob/main/contrib/llvm-project/llvm/lib/Option/Arg.cpp
35234 views
//===- Arg.cpp - Argument Implementations ---------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/ADT/SmallString.h"9#include "llvm/Config/llvm-config.h"10#include "llvm/Option/Arg.h"11#include "llvm/Option/ArgList.h"12#include "llvm/Option/Option.h"13#include "llvm/Support/Compiler.h"14#include "llvm/Support/Debug.h"15#include "llvm/Support/raw_ostream.h"1617using namespace llvm;18using namespace llvm::opt;1920Arg::Arg(const Option Opt, StringRef S, unsigned Index, const Arg *BaseArg)21: Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),22IgnoredTargetSpecific(false), OwnsValues(false) {}2324Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0,25const Arg *BaseArg)26: Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),27IgnoredTargetSpecific(false), OwnsValues(false) {28Values.push_back(Value0);29}3031Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0,32const char *Value1, const Arg *BaseArg)33: Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),34IgnoredTargetSpecific(false), OwnsValues(false) {35Values.push_back(Value0);36Values.push_back(Value1);37}3839Arg::~Arg() {40if (OwnsValues) {41for (unsigned i = 0, e = Values.size(); i != e; ++i)42delete[] Values[i];43}44}4546void Arg::print(raw_ostream& O) const {47O << "<Opt:";48Opt.print(O, /*AddNewLine=*/false);4950O << " Index:" << Index;5152O << " Values: [";53for (unsigned i = 0, e = Values.size(); i != e; ++i) {54if (i) O << ", ";55O << "'" << Values[i] << "'";56}5758O << "]>\n";59}6061#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)62LLVM_DUMP_METHOD void Arg::dump() const { print(dbgs()); }63#endif6465std::string Arg::getAsString(const ArgList &Args) const {66if (Alias)67return Alias->getAsString(Args);6869SmallString<256> Res;70raw_svector_ostream OS(Res);7172ArgStringList ASL;73render(Args, ASL);74for (ArgStringList::iterator75it = ASL.begin(), ie = ASL.end(); it != ie; ++it) {76if (it != ASL.begin())77OS << ' ';78OS << *it;79}8081return std::string(OS.str());82}8384void Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const {85if (!getOption().hasNoOptAsInput()) {86render(Args, Output);87return;88}8990Output.append(Values.begin(), Values.end());91}9293void Arg::render(const ArgList &Args, ArgStringList &Output) const {94switch (getOption().getRenderStyle()) {95case Option::RenderValuesStyle:96Output.append(Values.begin(), Values.end());97break;9899case Option::RenderCommaJoinedStyle: {100SmallString<256> Res;101raw_svector_ostream OS(Res);102OS << getSpelling();103for (unsigned i = 0, e = getNumValues(); i != e; ++i) {104if (i) OS << ',';105OS << getValue(i);106}107Output.push_back(Args.MakeArgString(OS.str()));108break;109}110111case Option::RenderJoinedStyle:112Output.push_back(Args.GetOrMakeJoinedArgString(113getIndex(), getSpelling(), getValue(0)));114Output.append(Values.begin() + 1, Values.end());115break;116117case Option::RenderSeparateStyle:118Output.push_back(Args.MakeArgString(getSpelling()));119Output.append(Values.begin(), Values.end());120break;121}122}123124125