• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--- Arg.cpp - Argument Implementations -------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "clang/Driver/Arg.h"
11 #include "clang/Basic/LLVM.h"
12 #include "clang/Driver/ArgList.h"
13 #include "clang/Driver/Option.h"
14 #include "llvm/ADT/SmallString.h"
15 #include "llvm/ADT/Twine.h"
16 #include "llvm/Support/raw_ostream.h"
17 
18 using namespace clang::driver;
19 using clang::StringRef;
20 
Arg(const Option _Opt,StringRef S,unsigned _Index,const Arg * _BaseArg)21 Arg::Arg(const Option _Opt, StringRef S, unsigned _Index, const Arg *_BaseArg)
22   : Opt(_Opt), BaseArg(_BaseArg), Spelling(S), Index(_Index),
23     Claimed(false), OwnsValues(false) {
24 }
25 
Arg(const Option _Opt,StringRef S,unsigned _Index,const char * Value0,const Arg * _BaseArg)26 Arg::Arg(const Option _Opt, StringRef S, unsigned _Index,
27          const char *Value0, const Arg *_BaseArg)
28   : Opt(_Opt), BaseArg(_BaseArg), Spelling(S), Index(_Index),
29     Claimed(false), OwnsValues(false) {
30   Values.push_back(Value0);
31 }
32 
Arg(const Option _Opt,StringRef S,unsigned _Index,const char * Value0,const char * Value1,const Arg * _BaseArg)33 Arg::Arg(const Option _Opt, StringRef S, unsigned _Index,
34          const char *Value0, const char *Value1, const Arg *_BaseArg)
35   : Opt(_Opt), BaseArg(_BaseArg), Spelling(S), Index(_Index),
36     Claimed(false), OwnsValues(false) {
37   Values.push_back(Value0);
38   Values.push_back(Value1);
39 }
40 
~Arg()41 Arg::~Arg() {
42   if (OwnsValues) {
43     for (unsigned i = 0, e = Values.size(); i != e; ++i)
44       delete[] Values[i];
45   }
46 }
47 
dump() const48 void Arg::dump() const {
49   llvm::errs() << "<";
50 
51   llvm::errs() << " Opt:";
52   Opt.dump();
53 
54   llvm::errs() << " Index:" << Index;
55 
56   llvm::errs() << " Values: [";
57   for (unsigned i = 0, e = Values.size(); i != e; ++i) {
58     if (i) llvm::errs() << ", ";
59     llvm::errs() << "'" << Values[i] << "'";
60   }
61 
62   llvm::errs() << "]>\n";
63 }
64 
getAsString(const ArgList & Args) const65 std::string Arg::getAsString(const ArgList &Args) const {
66   SmallString<256> Res;
67   llvm::raw_svector_ostream OS(Res);
68 
69   ArgStringList ASL;
70   render(Args, ASL);
71   for (ArgStringList::iterator
72          it = ASL.begin(), ie = ASL.end(); it != ie; ++it) {
73     if (it != ASL.begin())
74       OS << ' ';
75     OS << *it;
76   }
77 
78   return OS.str();
79 }
80 
renderAsInput(const ArgList & Args,ArgStringList & Output) const81 void Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const {
82   if (!getOption().hasNoOptAsInput()) {
83     render(Args, Output);
84     return;
85   }
86 
87   for (unsigned i = 0, e = getNumValues(); i != e; ++i)
88     Output.push_back(getValue(i));
89 }
90 
render(const ArgList & Args,ArgStringList & Output) const91 void Arg::render(const ArgList &Args, ArgStringList &Output) const {
92   switch (getOption().getRenderStyle()) {
93   case Option::RenderValuesStyle:
94     for (unsigned i = 0, e = getNumValues(); i != e; ++i)
95       Output.push_back(getValue(i));
96     break;
97 
98   case Option::RenderCommaJoinedStyle: {
99     SmallString<256> Res;
100     llvm::raw_svector_ostream OS(Res);
101     OS << getSpelling();
102     for (unsigned i = 0, e = getNumValues(); i != e; ++i) {
103       if (i) OS << ',';
104       OS << getValue(i);
105     }
106     Output.push_back(Args.MakeArgString(OS.str()));
107     break;
108   }
109 
110  case Option::RenderJoinedStyle:
111     Output.push_back(Args.GetOrMakeJoinedArgString(
112                        getIndex(), getSpelling(), getValue(0)));
113     for (unsigned i = 1, e = getNumValues(); i != e; ++i)
114       Output.push_back(getValue(i));
115     break;
116 
117   case Option::RenderSeparateStyle:
118     Output.push_back(Args.MakeArgString(getSpelling()));
119     for (unsigned i = 0, e = getNumValues(); i != e; ++i)
120       Output.push_back(getValue(i));
121     break;
122   }
123 }
124