 |
|
 |
|
| Files: |
1 |
|
Branches Taken: |
46.0% |
29 / 63 |
| Generated: |
2010-02-10 01:31 |
|
Branches Executed: |
54.0% |
34 / 63 |
| |
|
Line Coverage: |
73.7% |
84 / 114 |
| |
 |
|
 |
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/Driver/ArgList.h"
12 : #include "clang/Driver/Option.h"
13 : #include "llvm/Support/raw_ostream.h"
14 :
15 : using namespace clang::driver;
16 :
17 : Arg::Arg(ArgClass _Kind, const Option *_Opt, unsigned _Index,
18 12663: const Arg *_BaseArg)
19 12663: : Kind(_Kind), Opt(_Opt), BaseArg(_BaseArg), Index(_Index), Claimed(false) {
20 12663: }
21 :
12566: branch 0 taken
12566: branch 1 taken
0: branch 3 not taken
0: branch 4 not taken
0: branch 6 not taken
12566: branch 7 taken
22 12566: Arg::~Arg() { }
23 :
24 0: void Arg::dump() const {
25 0: llvm::errs() << "<";
0: branch 0 not taken
0: branch 1 not taken
0: branch 2 not taken
0: branch 3 not taken
0: branch 4 not taken
0: branch 5 not taken
0: branch 6 not taken
26 0: switch (Kind) {
27 : default:
28 0: assert(0 && "Invalid kind");
29 : #define P(N) case N: llvm::errs() << #N; break
30 0: P(FlagClass);
31 0: P(PositionalClass);
32 0: P(JoinedClass);
33 0: P(SeparateClass);
34 0: P(CommaJoinedClass);
35 0: P(JoinedAndSeparateClass);
36 : #undef P
37 : }
38 :
39 0: llvm::errs() << " Opt:";
40 0: Opt->dump();
41 :
42 0: llvm::errs() << " Index:" << Index;
43 :
0: branch 1 not taken
0: branch 2 not taken
0: branch 4 not taken
0: branch 5 not taken
0: branch 6 not taken
0: branch 7 not taken
44 0: if (isa<CommaJoinedArg>(this) || isa<SeparateArg>(this))
45 0: llvm::errs() << " NumValues:" << getNumValues();
46 :
47 0: llvm::errs() << ">\n";
48 0: }
49 :
50 28: std::string Arg::getAsString(const ArgList &Args) const {
51 28: std::string Res;
52 28: llvm::raw_string_ostream OS(Res);
53 :
54 28: ArgStringList ASL;
55 28: render(Args, ASL);
33: branch 0 taken
28: branch 1 taken
56 61: for (ArgStringList::iterator
57 28: it = ASL.begin(), ie = ASL.end(); it != ie; ++it) {
5: branch 1 taken
28: branch 2 taken
58 33: if (it != ASL.begin())
59 5: OS << ' ';
60 33: OS << *it;
61 : }
62 :
63 28: return OS.str();
64 : }
65 :
66 7: void Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const {
7: branch 2 taken
0: branch 3 not taken
67 7: if (!getOption().hasNoOptAsInput()) {
68 7: render(Args, Output);
69 7: return;
70 : }
71 :
0: branch 1 not taken
0: branch 2 not taken
72 0: for (unsigned i = 0, e = getNumValues(); i != e; ++i)
73 0: Output.push_back(getValue(Args, i));
74 : }
75 :
76 6071: FlagArg::FlagArg(const Option *Opt, unsigned Index, const Arg *BaseArg)
77 6071: : Arg(FlagClass, Opt, Index, BaseArg) {
78 6071: }
79 :
80 160: void FlagArg::render(const ArgList &Args, ArgStringList &Output) const {
81 160: Output.push_back(Args.getArgString(getIndex()));
82 160: }
83 :
84 0: const char *FlagArg::getValue(const ArgList &Args, unsigned N) const {
85 0: assert(0 && "Invalid index.");
86 : return 0;
87 : }
88 :
89 : PositionalArg::PositionalArg(const Option *Opt, unsigned Index,
90 2684: const Arg *BaseArg)
91 2684: : Arg(PositionalClass, Opt, Index, BaseArg) {
92 2684: }
93 :
94 5: void PositionalArg::render(const ArgList &Args, ArgStringList &Output) const {
95 5: Output.push_back(Args.getArgString(getIndex()));
96 5: }
97 :
98 2915: const char *PositionalArg::getValue(const ArgList &Args, unsigned N) const {
2915: branch 1 taken
0: branch 2 not taken
99 2915: assert(N < getNumValues() && "Invalid index.");
100 2915: return Args.getArgString(getIndex());
101 : }
102 :
103 974: JoinedArg::JoinedArg(const Option *Opt, unsigned Index, const Arg *BaseArg)
104 974: : Arg(JoinedClass, Opt, Index, BaseArg) {
105 974: }
106 :
107 52: void JoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
0: branch 2 not taken
52: branch 3 taken
108 52: if (getOption().hasForceSeparateRender()) {
109 0: Output.push_back(getOption().getName());
110 0: Output.push_back(getValue(Args, 0));
111 : } else {
112 52: Output.push_back(Args.getArgString(getIndex()));
113 : }
114 52: }
115 :
116 965: const char *JoinedArg::getValue(const ArgList &Args, unsigned N) const {
965: branch 1 taken
0: branch 2 not taken
117 965: assert(N < getNumValues() && "Invalid index.");
118 : // FIXME: Avoid strlen.
119 965: return Args.getArgString(getIndex()) + strlen(getOption().getName());
120 : }
121 :
122 : CommaJoinedArg::CommaJoinedArg(const Option *Opt, unsigned Index,
123 1: const char *Str, const Arg *BaseArg)
124 1: : Arg(CommaJoinedClass, Opt, Index, BaseArg) {
125 1: const char *Prev = Str;
126 7: for (;; ++Str) {
127 8: char c = *Str;
128 :
1: branch 0 taken
7: branch 1 taken
7: branch 2 taken
7: branch 3 taken
129 8: if (!c) {
1: branch 0 taken
0: branch 1 not taken
0: branch 2 not taken
0: branch 3 not taken
130 1: if (Prev != Str)
131 1: Values.push_back(std::string(Prev, Str));
132 : break;
1: branch 0 taken
6: branch 1 taken
6: branch 2 taken
6: branch 3 taken
133 7: } else if (c == ',') {
1: branch 0 taken
0: branch 1 not taken
0: branch 2 not taken
0: branch 3 not taken
134 1: if (Prev != Str)
135 1: Values.push_back(std::string(Prev, Str));
136 1: Prev = Str + 1;
137 : }
138 : }
139 1: }
140 :
141 0: void CommaJoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
142 0: Output.push_back(Args.getArgString(getIndex()));
143 0: }
144 :
145 2: const char *CommaJoinedArg::getValue(const ArgList &Args, unsigned N) const {
2: branch 1 taken
0: branch 2 not taken
146 2: assert(N < getNumValues() && "Invalid index.");
147 2: return Values[N].c_str();
148 : }
149 :
150 : SeparateArg::SeparateArg(const Option *Opt, unsigned Index, unsigned _NumValues,
151 2927: const Arg *BaseArg)
152 2927: : Arg(SeparateClass, Opt, Index, BaseArg), NumValues(_NumValues) {
153 2927: }
154 :
155 60: void SeparateArg::render(const ArgList &Args, ArgStringList &Output) const {
0: branch 2 not taken
60: branch 3 taken
156 60: if (getOption().hasForceJoinedRender()) {
0: branch 1 not taken
0: branch 2 not taken
157 0: assert(getNumValues() == 1 && "Cannot force joined render with > 1 args.");
158 : // FIXME: Avoid std::string.
159 0: std::string Joined(getOption().getName());
160 0: Joined += Args.getArgString(getIndex());
161 0: Output.push_back(Args.MakeArgString(Joined.c_str()));
162 : } else {
163 60: Output.push_back(Args.getArgString(getIndex()));
72: branch 0 taken
60: branch 1 taken
164 132: for (unsigned i = 0; i < NumValues; ++i)
165 72: Output.push_back(Args.getArgString(getIndex() + 1 + i));
166 : }
167 60: }
168 :
169 2978: const char *SeparateArg::getValue(const ArgList &Args, unsigned N) const {
2978: branch 1 taken
0: branch 2 not taken
170 2978: assert(N < getNumValues() && "Invalid index.");
171 2978: return Args.getArgString(getIndex() + 1 + N);
172 : }
173 :
174 : JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index,
175 6: const Arg *BaseArg)
176 6: : Arg(JoinedAndSeparateClass, Opt, Index, BaseArg) {
177 6: }
178 :
179 : void JoinedAndSeparateArg::render(const ArgList &Args,
180 4: ArgStringList &Output) const {
181 4: Output.push_back(Args.getArgString(getIndex()));
182 4: Output.push_back(Args.getArgString(getIndex() + 1));
183 4: }
184 :
185 : const char *JoinedAndSeparateArg::getValue(const ArgList &Args,
186 7: unsigned N) const {
7: branch 1 taken
0: branch 2 not taken
187 7: assert(N < getNumValues() && "Invalid index.");
6: branch 0 taken
1: branch 1 taken
188 7: if (N == 0)
189 6: return Args.getArgString(getIndex()) + strlen(getOption().getName());
190 1: return Args.getArgString(getIndex() + 1);
191 : }
Generated: 2010-02-10 01:31 by zcov