196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===--- Arg.cpp - Argument Implementations -------------------------------===// 296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// 396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// The LLVM Compiler Infrastructure 496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// 596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// This file is distributed under the University of Illinois Open Source 696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// License. See LICENSE.TXT for details. 796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// 896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===----------------------------------------------------------------------===// 996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 1096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/Arg.h" 1196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/ADT/SmallString.h" 1296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/ADT/Twine.h" 1396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/ArgList.h" 1496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/Option.h" 1596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Support/raw_ostream.h" 1696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 1796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerusing namespace llvm; 1896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerusing namespace llvm::opt; 1996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 2096a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg::Arg(const Option _Opt, StringRef S, unsigned _Index, const Arg *_BaseArg) 2196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer : Opt(_Opt), BaseArg(_BaseArg), Spelling(S), Index(_Index), 2296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Claimed(false), OwnsValues(false) { 2396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 2496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 2596a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg::Arg(const Option _Opt, StringRef S, unsigned _Index, 2696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer const char *Value0, const Arg *_BaseArg) 2796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer : Opt(_Opt), BaseArg(_BaseArg), Spelling(S), Index(_Index), 2896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Claimed(false), OwnsValues(false) { 2996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Values.push_back(Value0); 3096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 3196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 3296a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg::Arg(const Option _Opt, StringRef S, unsigned _Index, 3396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer const char *Value0, const char *Value1, const Arg *_BaseArg) 3496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer : Opt(_Opt), BaseArg(_BaseArg), Spelling(S), Index(_Index), 3596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Claimed(false), OwnsValues(false) { 3696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Values.push_back(Value0); 3796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Values.push_back(Value1); 3896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 3996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 4096a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg::~Arg() { 4196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (OwnsValues) { 4296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (unsigned i = 0, e = Values.size(); i != e; ++i) 4396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer delete[] Values[i]; 4496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 4596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 4696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 4796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid Arg::dump() const { 4896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer llvm::errs() << "<"; 4996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 5096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer llvm::errs() << " Opt:"; 5196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Opt.dump(); 5296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 5396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer llvm::errs() << " Index:" << Index; 5496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 5596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer llvm::errs() << " Values: ["; 5696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (unsigned i = 0, e = Values.size(); i != e; ++i) { 5796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (i) llvm::errs() << ", "; 5896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer llvm::errs() << "'" << Values[i] << "'"; 5996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 6096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 6196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer llvm::errs() << "]>\n"; 6296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 6396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 6496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerstd::string Arg::getAsString(const ArgList &Args) const { 6596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer SmallString<256> Res; 6696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer llvm::raw_svector_ostream OS(Res); 6796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 6896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer ArgStringList ASL; 6996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer render(Args, ASL); 7096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (ArgStringList::iterator 7196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer it = ASL.begin(), ie = ASL.end(); it != ie; ++it) { 7296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (it != ASL.begin()) 7396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OS << ' '; 7496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OS << *it; 7596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 7696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 7796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return OS.str(); 7896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 7996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 8096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const { 8196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (!getOption().hasNoOptAsInput()) { 8296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer render(Args, Output); 8396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return; 8496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 8596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 8696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (unsigned i = 0, e = getNumValues(); i != e; ++i) 8796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Output.push_back(getValue(i)); 8896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 8996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 9096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid Arg::render(const ArgList &Args, ArgStringList &Output) const { 9196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer switch (getOption().getRenderStyle()) { 9296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case Option::RenderValuesStyle: 9396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (unsigned i = 0, e = getNumValues(); i != e; ++i) 9496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Output.push_back(getValue(i)); 9596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer break; 9696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 9796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case Option::RenderCommaJoinedStyle: { 9896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer SmallString<256> Res; 9996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer llvm::raw_svector_ostream OS(Res); 10096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OS << getSpelling(); 10196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (unsigned i = 0, e = getNumValues(); i != e; ++i) { 10296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (i) OS << ','; 10396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OS << getValue(i); 10496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 10596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Output.push_back(Args.MakeArgString(OS.str())); 10696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer break; 10796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 10896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 10996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case Option::RenderJoinedStyle: 11096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Output.push_back(Args.GetOrMakeJoinedArgString( 11196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer getIndex(), getSpelling(), getValue(0))); 11296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (unsigned i = 1, e = getNumValues(); i != e; ++i) 11396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Output.push_back(getValue(i)); 11496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer break; 11596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 11696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case Option::RenderSeparateStyle: 11796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Output.push_back(Args.MakeArgString(getSpelling())); 11896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (unsigned i = 0, e = getNumValues(); i != e; ++i) 11996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Output.push_back(getValue(i)); 12096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer break; 12196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 12296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 123