brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · 3aab7c0 Raw
115 lines · cpp
1//===- Arg.cpp - Argument Implementations ---------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/Option/Arg.h"10#include "llvm/ADT/SmallString.h"11#include "llvm/Config/llvm-config.h"12#include "llvm/Option/ArgList.h"13#include "llvm/Option/Option.h"14#include "llvm/Support/Compiler.h"15#include "llvm/Support/Debug.h"16#include "llvm/Support/InterleavedRange.h"17#include "llvm/Support/raw_ostream.h"18 19using namespace llvm;20using namespace llvm::opt;21 22Arg::Arg(const Option Opt, StringRef S, unsigned Index, const Arg *BaseArg)23    : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),24      IgnoredTargetSpecific(false), OwnsValues(false) {}25 26Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0,27         const Arg *BaseArg)28    : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),29      IgnoredTargetSpecific(false), OwnsValues(false) {30  Values.push_back(Value0);31}32 33Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0,34         const char *Value1, const Arg *BaseArg)35    : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),36      IgnoredTargetSpecific(false), OwnsValues(false) {37  Values.push_back(Value0);38  Values.push_back(Value1);39}40 41Arg::~Arg() {42  if (OwnsValues) {43    for (const char *V : Values)44      delete[] V;45  }46}47 48void Arg::print(raw_ostream& O) const {49  O << "<Opt:";50  Opt.print(O, /*AddNewLine=*/false);51 52  O << " Index:" << Index;53 54  O << " Values: [";55  for (unsigned i = 0, e = Values.size(); i != e; ++i) {56    if (i) O << ", ";57    O << "'" << Values[i] << "'";58  }59 60  O << "]>\n";61}62 63#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)64LLVM_DUMP_METHOD void Arg::dump() const { print(dbgs()); }65#endif66 67std::string Arg::getAsString(const ArgList &Args) const {68  if (Alias)69    return Alias->getAsString(Args);70 71  SmallString<256> Res;72  raw_svector_ostream OS(Res);73 74  ArgStringList ASL;75  render(Args, ASL);76  OS << llvm::interleaved(ASL, " ");77  return std::string(OS.str());78}79 80void Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const {81  if (!getOption().hasNoOptAsInput()) {82    render(Args, Output);83    return;84  }85 86  Output.append(Values.begin(), Values.end());87}88 89void Arg::render(const ArgList &Args, ArgStringList &Output) const {90  switch (getOption().getRenderStyle()) {91  case Option::RenderValuesStyle:92    Output.append(Values.begin(), Values.end());93    break;94 95  case Option::RenderCommaJoinedStyle: {96    SmallString<256> Res;97    raw_svector_ostream OS(Res);98    OS << getSpelling() << llvm::interleaved(getValues(), ",");99    Output.push_back(Args.MakeArgString(OS.str()));100    break;101  }102 103 case Option::RenderJoinedStyle:104    Output.push_back(Args.GetOrMakeJoinedArgString(105                       getIndex(), getSpelling(), getValue(0)));106    Output.append(Values.begin() + 1, Values.end());107    break;108 109  case Option::RenderSeparateStyle:110    Output.push_back(Args.MakeArgString(getSpelling()));111    Output.append(Values.begin(), Values.end());112    break;113  }114}115