 |
|
 |
|
| Files: |
1 |
|
Branches Taken: |
64.9% |
74 / 114 |
| Generated: |
2010-02-10 01:31 |
|
Branches Executed: |
68.4% |
78 / 114 |
| |
|
Line Coverage: |
88.6% |
117 / 132 |
| |
 |
|
 |
1 : //===--- ArgList.cpp - Argument List Management -------------------------*-===//
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/ArgList.h"
11 : #include "clang/Driver/Arg.h"
12 : #include "clang/Driver/Option.h"
13 :
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 :
20 97286: void arg_iterator::SkipToNextArg() {
219718: branch 1 taken
94121: branch 2 taken
21 313839: for (; Current != Args.end(); ++Current) {
22 : // Done if there are no filters.
0: branch 1 not taken
219718: branch 2 taken
23 219718: if (!Id0.isValid())
24 0: break;
25 :
26 : // Otherwise require a match.
27 219718: const Option &O = (*Current)->getOption();
216602: branch 1 taken
3116: branch 2 taken
48220: branch 4 taken
168382: branch 5 taken
48176: branch 7 taken
44: branch 8 taken
22399: branch 10 taken
194159: branch 11 taken
5: branch 13 taken
22394: branch 14 taken
3165: branch 15 taken
216553: branch 16 taken
28 219718: if (O.matches(Id0) ||
29 : (Id1.isValid() && O.matches(Id1)) ||
30 : (Id2.isValid() && O.matches(Id2)))
31 3165: break;
32 : }
33 97286: }
34 :
35 : //
36 :
37 2978: ArgList::ArgList(arglist_type &_Args) : Args(_Args) {
38 2978: }
39 :
40 2978: ArgList::~ArgList() {
2978: branch 0 taken
2978: branch 1 taken
0: branch 3 not taken
0: branch 4 not taken
0: branch 6 not taken
2978: branch 7 taken
41 2978: }
42 :
43 13069: void ArgList::append(Arg *A) {
44 13069: Args.push_back(A);
45 13069: }
46 :
47 394499: Arg *ArgList::getLastArgNoClaim(OptSpecifier Id) const {
48 : // FIXME: Make search efficient?
1774627: branch 4 taken
384775: branch 5 taken
49 2159402: for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
9724: branch 3 taken
1764903: branch 4 taken
50 1774627: if ((*it)->getOption().matches(Id))
51 9724: return *it;
52 384775: return 0;
53 : }
54 :
55 374209: Arg *ArgList::getLastArg(OptSpecifier Id) const {
56 374209: Arg *A = getLastArgNoClaim(Id);
9644: branch 0 taken
364565: branch 1 taken
57 374209: if (A)
58 9644: A->claim();
59 374209: return A;
60 : }
61 :
62 9439: Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1) const {
63 9439: Arg *Res, *A0 = getLastArgNoClaim(Id0), *A1 = getLastArgNoClaim(Id1);
64 :
46: branch 0 taken
9393: branch 1 taken
16: branch 2 taken
30: branch 3 taken
65 9455: if (A0 && A1)
10: branch 2 taken
6: branch 3 taken
66 16: Res = A0->getIndex() > A1->getIndex() ? A0 : A1;
67 : else
30: branch 0 taken
9393: branch 1 taken
68 9423: Res = A0 ? A0 : A1;
69 :
62: branch 0 taken
9377: branch 1 taken
70 9439: if (Res)
71 62: Res->claim();
72 :
73 9439: return Res;
74 : }
75 :
76 : Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
77 458: OptSpecifier Id2) const {
78 458: Arg *Res = 0;
79 458: Arg *A0 = getLastArgNoClaim(Id0);
80 458: Arg *A1 = getLastArgNoClaim(Id1);
81 458: Arg *A2 = getLastArgNoClaim(Id2);
82 :
1: branch 0 taken
457: branch 1 taken
83 458: int A0Idx = A0 ? A0->getIndex() : -1;
1: branch 0 taken
457: branch 1 taken
84 458: int A1Idx = A1 ? A1->getIndex() : -1;
0: branch 0 not taken
458: branch 1 taken
85 458: int A2Idx = A2 ? A2->getIndex() : -1;
86 :
1: branch 0 taken
457: branch 1 taken
87 458: if (A0Idx > A1Idx) {
1: branch 0 taken
0: branch 1 not taken
88 1: if (A0Idx > A2Idx)
89 1: Res = A0;
0: branch 0 not taken
0: branch 1 not taken
90 0: else if (A2Idx != -1)
91 0: Res = A2;
92 : } else {
1: branch 0 taken
456: branch 1 taken
93 457: if (A1Idx > A2Idx)
94 1: Res = A1;
0: branch 0 not taken
456: branch 1 taken
95 456: else if (A2Idx != -1)
96 0: Res = A2;
97 : }
98 :
2: branch 0 taken
456: branch 1 taken
99 458: if (Res)
100 2: Res->claim();
101 :
102 458: return Res;
103 : }
104 :
105 7717: bool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const {
31: branch 1 taken
7686: branch 2 taken
106 7717: if (Arg *A = getLastArg(Pos, Neg))
107 31: return A->getOption().matches(Pos);
108 7686: return Default;
109 : }
110 :
111 5999: void ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id) const {
111: branch 1 taken
5888: branch 2 taken
112 5999: if (Arg *A = getLastArg(Id)) {
113 111: A->claim();
114 111: A->render(*this, Output);
115 : }
116 5999: }
117 :
118 : void ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
119 1948: OptSpecifier Id1, OptSpecifier Id2) const {
116: branch 3 taken
1948: branch 4 taken
120 4012: for (arg_iterator it = filtered_begin(Id0, Id1, Id2),
121 1948: ie = filtered_end(); it != ie; ++it) {
122 116: it->claim();
123 116: it->render(*this, Output);
124 : }
125 1948: }
126 :
127 : void ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0,
128 18234: OptSpecifier Id1, OptSpecifier Id2) const {
2812: branch 3 taken
18234: branch 4 taken
129 39280: for (arg_iterator it = filtered_begin(Id0, Id1, Id2),
130 18234: ie = filtered_end(); it != ie; ++it) {
131 2812: it->claim();
2812: branch 2 taken
2812: branch 3 taken
132 5624: for (unsigned i = 0, e = it->getNumValues(); i != e; ++i)
133 2812: Output.push_back(it->getValue(*this, i));
134 : }
135 18234: }
136 :
137 : void ArgList::AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0,
138 : const char *Translation,
139 229: bool Joined) const {
22: branch 5 taken
229: branch 6 taken
140 480: for (arg_iterator it = filtered_begin(Id0),
141 229: ie = filtered_end(); it != ie; ++it) {
142 22: it->claim();
143 :
0: branch 0 not taken
22: branch 1 taken
144 22: if (Joined) {
145 : Output.push_back(MakeArgString(llvm::StringRef(Translation) +
146 0: it->getValue(*this, 0)));
147 : } else {
148 22: Output.push_back(Translation);
149 22: Output.push_back(it->getValue(*this, 0));
150 : }
151 : }
152 229: }
153 :
154 852: void ArgList::ClaimAllArgs(OptSpecifier Id0) const {
19: branch 5 taken
852: branch 6 taken
155 1723: for (arg_iterator it = filtered_begin(Id0),
156 852: ie = filtered_end(); it != ie; ++it)
157 19: it->claim();
158 852: }
159 :
160 200: const char *ArgList::MakeArgString(const llvm::Twine &T) const {
161 200: llvm::SmallString<256> Str;
162 200: T.toVector(Str);
163 200: return MakeArgString(Str.str());
164 : }
165 :
166 : //
167 :
168 2771: InputArgList::InputArgList(const char **ArgBegin, const char **ArgEnd)
169 2771: : ArgList(ActualArgs), NumInputArgStrings(ArgEnd - ArgBegin) {
170 2771: ArgStrings.append(ArgBegin, ArgEnd);
171 2771: }
172 :
173 2771: InputArgList::~InputArgList() {
174 : // An InputArgList always owns its arguments.
12566: branch 2 taken
2771: branch 3 taken
0: branch 6 not taken
0: branch 7 not taken
0: branch 10 not taken
0: branch 11 not taken
175 15337: for (iterator it = begin(), ie = end(); it != ie; ++it)
12566: branch 0 taken
0: branch 1 not taken
12566: branch 3 taken
12566: branch 4 taken
0: branch 6 not taken
0: branch 7 not taken
176 12566: delete *it;
2771: branch 4 taken
0: branch 5 not taken
0: branch 11 not taken
0: branch 12 not taken
0: branch 18 not taken
0: branch 19 not taken
177 2771: }
178 :
179 1093: unsigned InputArgList::MakeIndex(llvm::StringRef String0) const {
180 1093: unsigned Index = ArgStrings.size();
181 :
182 : // Tuck away so we have a reliable const char *.
183 1093: SynthesizedStrings.push_back(String0);
184 1093: ArgStrings.push_back(SynthesizedStrings.back().c_str());
185 :
186 1093: return Index;
187 : }
188 :
189 : unsigned InputArgList::MakeIndex(llvm::StringRef String0,
190 0: llvm::StringRef String1) const {
191 0: unsigned Index0 = MakeIndex(String0);
192 0: unsigned Index1 = MakeIndex(String1);
0: branch 0 not taken
0: branch 1 not taken
193 0: assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!");
194 : (void) Index1;
195 0: return Index0;
196 : }
197 :
198 999: const char *InputArgList::MakeArgString(llvm::StringRef Str) const {
199 999: return getArgString(MakeIndex(Str));
200 : }
201 :
202 : //
203 :
204 207: DerivedArgList::DerivedArgList(InputArgList &_BaseArgs, bool _OnlyProxy)
205 : : ArgList(_OnlyProxy ? _BaseArgs.getArgs() : ActualArgs),
155: branch 0 taken
52: branch 1 taken
207: branch 6 taken
207: branch 7 taken
206 207: BaseArgs(_BaseArgs), OnlyProxy(_OnlyProxy) {
207 207: }
208 :
209 207: DerivedArgList::~DerivedArgList() {
210 : // We only own the arguments we explicitly synthesized.
0: branch 2 not taken
207: branch 3 taken
0: branch 6 not taken
0: branch 7 not taken
0: branch 10 not taken
0: branch 11 not taken
211 207: for (iterator it = SynthesizedArgs.begin(), ie = SynthesizedArgs.end();
212 : it != ie; ++it)
0: branch 0 not taken
0: branch 1 not taken
0: branch 3 not taken
0: branch 4 not taken
0: branch 6 not taken
0: branch 7 not taken
213 0: delete *it;
207: branch 3 taken
0: branch 4 not taken
0: branch 9 not taken
0: branch 10 not taken
0: branch 15 not taken
0: branch 16 not taken
214 207: }
215 :
216 928: const char *DerivedArgList::MakeArgString(llvm::StringRef Str) const {
217 928: return BaseArgs.MakeArgString(Str);
218 : }
219 :
220 6: Arg *DerivedArgList::MakeFlagArg(const Arg *BaseArg, const Option *Opt) const {
221 6: return new FlagArg(Opt, BaseArgs.MakeIndex(Opt->getName()), BaseArg);
222 : }
223 :
224 : Arg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option *Opt,
225 0: llvm::StringRef Value) const {
226 0: return new PositionalArg(Opt, BaseArgs.MakeIndex(Value), BaseArg);
227 : }
228 :
229 : Arg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option *Opt,
230 0: llvm::StringRef Value) const {
231 : return new SeparateArg(Opt, BaseArgs.MakeIndex(Opt->getName(), Value), 1,
232 0: BaseArg);
233 : }
234 :
235 : Arg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option *Opt,
236 88: llvm::StringRef Value) const {
237 88: std::string Joined(Opt->getName());
238 88: Joined += Value;
239 88: return new JoinedArg(Opt, BaseArgs.MakeIndex(Joined.c_str()), BaseArg);
240 : }
Generated: 2010-02-10 01:31 by zcov