xref: /aosp_15_r20/external/llvm/lib/Option/ArgList.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===--- ArgList.cpp - Argument List Management ---------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "llvm/Option/ArgList.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallString.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Twine.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Option/Arg.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Option/Option.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
18*9880d681SAndroid Build Coastguard Worker 
19*9880d681SAndroid Build Coastguard Worker using namespace llvm;
20*9880d681SAndroid Build Coastguard Worker using namespace llvm::opt;
21*9880d681SAndroid Build Coastguard Worker 
SkipToNextArg()22*9880d681SAndroid Build Coastguard Worker void arg_iterator::SkipToNextArg() {
23*9880d681SAndroid Build Coastguard Worker   for (; Current != Args.end(); ++Current) {
24*9880d681SAndroid Build Coastguard Worker     // Done if there are no filters.
25*9880d681SAndroid Build Coastguard Worker     if (!Id0.isValid())
26*9880d681SAndroid Build Coastguard Worker       break;
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker     // Otherwise require a match.
29*9880d681SAndroid Build Coastguard Worker     const Option &O = (*Current)->getOption();
30*9880d681SAndroid Build Coastguard Worker     if (O.matches(Id0) ||
31*9880d681SAndroid Build Coastguard Worker         (Id1.isValid() && O.matches(Id1)) ||
32*9880d681SAndroid Build Coastguard Worker         (Id2.isValid() && O.matches(Id2)))
33*9880d681SAndroid Build Coastguard Worker       break;
34*9880d681SAndroid Build Coastguard Worker   }
35*9880d681SAndroid Build Coastguard Worker }
36*9880d681SAndroid Build Coastguard Worker 
append(Arg * A)37*9880d681SAndroid Build Coastguard Worker void ArgList::append(Arg *A) {
38*9880d681SAndroid Build Coastguard Worker   Args.push_back(A);
39*9880d681SAndroid Build Coastguard Worker }
40*9880d681SAndroid Build Coastguard Worker 
eraseArg(OptSpecifier Id)41*9880d681SAndroid Build Coastguard Worker void ArgList::eraseArg(OptSpecifier Id) {
42*9880d681SAndroid Build Coastguard Worker   Args.erase(std::remove_if(begin(), end(),
43*9880d681SAndroid Build Coastguard Worker                             [=](Arg *A) { return A->getOption().matches(Id); }),
44*9880d681SAndroid Build Coastguard Worker              end());
45*9880d681SAndroid Build Coastguard Worker }
46*9880d681SAndroid Build Coastguard Worker 
getLastArgNoClaim(OptSpecifier Id) const47*9880d681SAndroid Build Coastguard Worker Arg *ArgList::getLastArgNoClaim(OptSpecifier Id) const {
48*9880d681SAndroid Build Coastguard Worker   // FIXME: Make search efficient?
49*9880d681SAndroid Build Coastguard Worker   for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
50*9880d681SAndroid Build Coastguard Worker     if ((*it)->getOption().matches(Id))
51*9880d681SAndroid Build Coastguard Worker       return *it;
52*9880d681SAndroid Build Coastguard Worker   return nullptr;
53*9880d681SAndroid Build Coastguard Worker }
54*9880d681SAndroid Build Coastguard Worker 
getLastArgNoClaim(OptSpecifier Id0,OptSpecifier Id1) const55*9880d681SAndroid Build Coastguard Worker Arg *ArgList::getLastArgNoClaim(OptSpecifier Id0, OptSpecifier Id1) const {
56*9880d681SAndroid Build Coastguard Worker   // FIXME: Make search efficient?
57*9880d681SAndroid Build Coastguard Worker   for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
58*9880d681SAndroid Build Coastguard Worker     if ((*it)->getOption().matches(Id0) ||
59*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id1))
60*9880d681SAndroid Build Coastguard Worker       return *it;
61*9880d681SAndroid Build Coastguard Worker   return nullptr;
62*9880d681SAndroid Build Coastguard Worker }
63*9880d681SAndroid Build Coastguard Worker 
getLastArgNoClaim(OptSpecifier Id0,OptSpecifier Id1,OptSpecifier Id2) const64*9880d681SAndroid Build Coastguard Worker Arg *ArgList::getLastArgNoClaim(OptSpecifier Id0, OptSpecifier Id1,
65*9880d681SAndroid Build Coastguard Worker                                 OptSpecifier Id2) const {
66*9880d681SAndroid Build Coastguard Worker   // FIXME: Make search efficient?
67*9880d681SAndroid Build Coastguard Worker   for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
68*9880d681SAndroid Build Coastguard Worker     if ((*it)->getOption().matches(Id0) || (*it)->getOption().matches(Id1) ||
69*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id2))
70*9880d681SAndroid Build Coastguard Worker       return *it;
71*9880d681SAndroid Build Coastguard Worker   return nullptr;
72*9880d681SAndroid Build Coastguard Worker }
73*9880d681SAndroid Build Coastguard Worker 
getLastArgNoClaim(OptSpecifier Id0,OptSpecifier Id1,OptSpecifier Id2,OptSpecifier Id3) const74*9880d681SAndroid Build Coastguard Worker Arg *ArgList::getLastArgNoClaim(OptSpecifier Id0, OptSpecifier Id1,
75*9880d681SAndroid Build Coastguard Worker                                 OptSpecifier Id2, OptSpecifier Id3) const {
76*9880d681SAndroid Build Coastguard Worker   // FIXME: Make search efficient?
77*9880d681SAndroid Build Coastguard Worker   for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
78*9880d681SAndroid Build Coastguard Worker     if ((*it)->getOption().matches(Id0) || (*it)->getOption().matches(Id1) ||
79*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id2) || (*it)->getOption().matches(Id3))
80*9880d681SAndroid Build Coastguard Worker       return *it;
81*9880d681SAndroid Build Coastguard Worker   return nullptr;
82*9880d681SAndroid Build Coastguard Worker }
83*9880d681SAndroid Build Coastguard Worker 
getLastArg(OptSpecifier Id) const84*9880d681SAndroid Build Coastguard Worker Arg *ArgList::getLastArg(OptSpecifier Id) const {
85*9880d681SAndroid Build Coastguard Worker   Arg *Res = nullptr;
86*9880d681SAndroid Build Coastguard Worker   for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
87*9880d681SAndroid Build Coastguard Worker     if ((*it)->getOption().matches(Id)) {
88*9880d681SAndroid Build Coastguard Worker       Res = *it;
89*9880d681SAndroid Build Coastguard Worker       Res->claim();
90*9880d681SAndroid Build Coastguard Worker     }
91*9880d681SAndroid Build Coastguard Worker   }
92*9880d681SAndroid Build Coastguard Worker 
93*9880d681SAndroid Build Coastguard Worker   return Res;
94*9880d681SAndroid Build Coastguard Worker }
95*9880d681SAndroid Build Coastguard Worker 
getLastArg(OptSpecifier Id0,OptSpecifier Id1) const96*9880d681SAndroid Build Coastguard Worker Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1) const {
97*9880d681SAndroid Build Coastguard Worker   Arg *Res = nullptr;
98*9880d681SAndroid Build Coastguard Worker   for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
99*9880d681SAndroid Build Coastguard Worker     if ((*it)->getOption().matches(Id0) ||
100*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id1)) {
101*9880d681SAndroid Build Coastguard Worker       Res = *it;
102*9880d681SAndroid Build Coastguard Worker       Res->claim();
103*9880d681SAndroid Build Coastguard Worker 
104*9880d681SAndroid Build Coastguard Worker     }
105*9880d681SAndroid Build Coastguard Worker   }
106*9880d681SAndroid Build Coastguard Worker 
107*9880d681SAndroid Build Coastguard Worker   return Res;
108*9880d681SAndroid Build Coastguard Worker }
109*9880d681SAndroid Build Coastguard Worker 
getLastArg(OptSpecifier Id0,OptSpecifier Id1,OptSpecifier Id2) const110*9880d681SAndroid Build Coastguard Worker Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
111*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id2) const {
112*9880d681SAndroid Build Coastguard Worker   Arg *Res = nullptr;
113*9880d681SAndroid Build Coastguard Worker   for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
114*9880d681SAndroid Build Coastguard Worker     if ((*it)->getOption().matches(Id0) ||
115*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id1) ||
116*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id2)) {
117*9880d681SAndroid Build Coastguard Worker       Res = *it;
118*9880d681SAndroid Build Coastguard Worker       Res->claim();
119*9880d681SAndroid Build Coastguard Worker     }
120*9880d681SAndroid Build Coastguard Worker   }
121*9880d681SAndroid Build Coastguard Worker 
122*9880d681SAndroid Build Coastguard Worker   return Res;
123*9880d681SAndroid Build Coastguard Worker }
124*9880d681SAndroid Build Coastguard Worker 
getLastArg(OptSpecifier Id0,OptSpecifier Id1,OptSpecifier Id2,OptSpecifier Id3) const125*9880d681SAndroid Build Coastguard Worker Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
126*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id2, OptSpecifier Id3) const {
127*9880d681SAndroid Build Coastguard Worker   Arg *Res = nullptr;
128*9880d681SAndroid Build Coastguard Worker   for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
129*9880d681SAndroid Build Coastguard Worker     if ((*it)->getOption().matches(Id0) ||
130*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id1) ||
131*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id2) ||
132*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id3)) {
133*9880d681SAndroid Build Coastguard Worker       Res = *it;
134*9880d681SAndroid Build Coastguard Worker       Res->claim();
135*9880d681SAndroid Build Coastguard Worker     }
136*9880d681SAndroid Build Coastguard Worker   }
137*9880d681SAndroid Build Coastguard Worker 
138*9880d681SAndroid Build Coastguard Worker   return Res;
139*9880d681SAndroid Build Coastguard Worker }
140*9880d681SAndroid Build Coastguard Worker 
getLastArg(OptSpecifier Id0,OptSpecifier Id1,OptSpecifier Id2,OptSpecifier Id3,OptSpecifier Id4) const141*9880d681SAndroid Build Coastguard Worker Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
142*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id2, OptSpecifier Id3,
143*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id4) const {
144*9880d681SAndroid Build Coastguard Worker   Arg *Res = nullptr;
145*9880d681SAndroid Build Coastguard Worker   for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
146*9880d681SAndroid Build Coastguard Worker     if ((*it)->getOption().matches(Id0) ||
147*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id1) ||
148*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id2) ||
149*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id3) ||
150*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id4)) {
151*9880d681SAndroid Build Coastguard Worker       Res = *it;
152*9880d681SAndroid Build Coastguard Worker       Res->claim();
153*9880d681SAndroid Build Coastguard Worker     }
154*9880d681SAndroid Build Coastguard Worker   }
155*9880d681SAndroid Build Coastguard Worker 
156*9880d681SAndroid Build Coastguard Worker   return Res;
157*9880d681SAndroid Build Coastguard Worker }
158*9880d681SAndroid Build Coastguard Worker 
getLastArg(OptSpecifier Id0,OptSpecifier Id1,OptSpecifier Id2,OptSpecifier Id3,OptSpecifier Id4,OptSpecifier Id5) const159*9880d681SAndroid Build Coastguard Worker Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
160*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id2, OptSpecifier Id3,
161*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id4, OptSpecifier Id5) const {
162*9880d681SAndroid Build Coastguard Worker   Arg *Res = nullptr;
163*9880d681SAndroid Build Coastguard Worker   for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
164*9880d681SAndroid Build Coastguard Worker     if ((*it)->getOption().matches(Id0) ||
165*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id1) ||
166*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id2) ||
167*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id3) ||
168*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id4) ||
169*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id5)) {
170*9880d681SAndroid Build Coastguard Worker       Res = *it;
171*9880d681SAndroid Build Coastguard Worker       Res->claim();
172*9880d681SAndroid Build Coastguard Worker     }
173*9880d681SAndroid Build Coastguard Worker   }
174*9880d681SAndroid Build Coastguard Worker 
175*9880d681SAndroid Build Coastguard Worker   return Res;
176*9880d681SAndroid Build Coastguard Worker }
177*9880d681SAndroid Build Coastguard Worker 
getLastArg(OptSpecifier Id0,OptSpecifier Id1,OptSpecifier Id2,OptSpecifier Id3,OptSpecifier Id4,OptSpecifier Id5,OptSpecifier Id6) const178*9880d681SAndroid Build Coastguard Worker Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
179*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id2, OptSpecifier Id3,
180*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id4, OptSpecifier Id5,
181*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id6) const {
182*9880d681SAndroid Build Coastguard Worker   Arg *Res = nullptr;
183*9880d681SAndroid Build Coastguard Worker   for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
184*9880d681SAndroid Build Coastguard Worker     if ((*it)->getOption().matches(Id0) ||
185*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id1) ||
186*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id2) ||
187*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id3) ||
188*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id4) ||
189*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id5) ||
190*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id6)) {
191*9880d681SAndroid Build Coastguard Worker       Res = *it;
192*9880d681SAndroid Build Coastguard Worker       Res->claim();
193*9880d681SAndroid Build Coastguard Worker     }
194*9880d681SAndroid Build Coastguard Worker   }
195*9880d681SAndroid Build Coastguard Worker 
196*9880d681SAndroid Build Coastguard Worker   return Res;
197*9880d681SAndroid Build Coastguard Worker }
198*9880d681SAndroid Build Coastguard Worker 
getLastArg(OptSpecifier Id0,OptSpecifier Id1,OptSpecifier Id2,OptSpecifier Id3,OptSpecifier Id4,OptSpecifier Id5,OptSpecifier Id6,OptSpecifier Id7) const199*9880d681SAndroid Build Coastguard Worker Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
200*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id2, OptSpecifier Id3,
201*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id4, OptSpecifier Id5,
202*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id6, OptSpecifier Id7) const {
203*9880d681SAndroid Build Coastguard Worker   Arg *Res = nullptr;
204*9880d681SAndroid Build Coastguard Worker   for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
205*9880d681SAndroid Build Coastguard Worker     if ((*it)->getOption().matches(Id0) ||
206*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id1) ||
207*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id2) ||
208*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id3) ||
209*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id4) ||
210*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id5) ||
211*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id6) ||
212*9880d681SAndroid Build Coastguard Worker         (*it)->getOption().matches(Id7)) {
213*9880d681SAndroid Build Coastguard Worker       Res = *it;
214*9880d681SAndroid Build Coastguard Worker       Res->claim();
215*9880d681SAndroid Build Coastguard Worker     }
216*9880d681SAndroid Build Coastguard Worker   }
217*9880d681SAndroid Build Coastguard Worker 
218*9880d681SAndroid Build Coastguard Worker   return Res;
219*9880d681SAndroid Build Coastguard Worker }
220*9880d681SAndroid Build Coastguard Worker 
hasFlag(OptSpecifier Pos,OptSpecifier Neg,bool Default) const221*9880d681SAndroid Build Coastguard Worker bool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const {
222*9880d681SAndroid Build Coastguard Worker   if (Arg *A = getLastArg(Pos, Neg))
223*9880d681SAndroid Build Coastguard Worker     return A->getOption().matches(Pos);
224*9880d681SAndroid Build Coastguard Worker   return Default;
225*9880d681SAndroid Build Coastguard Worker }
226*9880d681SAndroid Build Coastguard Worker 
hasFlag(OptSpecifier Pos,OptSpecifier PosAlias,OptSpecifier Neg,bool Default) const227*9880d681SAndroid Build Coastguard Worker bool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier PosAlias, OptSpecifier Neg,
228*9880d681SAndroid Build Coastguard Worker                       bool Default) const {
229*9880d681SAndroid Build Coastguard Worker   if (Arg *A = getLastArg(Pos, PosAlias, Neg))
230*9880d681SAndroid Build Coastguard Worker     return A->getOption().matches(Pos) || A->getOption().matches(PosAlias);
231*9880d681SAndroid Build Coastguard Worker   return Default;
232*9880d681SAndroid Build Coastguard Worker }
233*9880d681SAndroid Build Coastguard Worker 
getLastArgValue(OptSpecifier Id,StringRef Default) const234*9880d681SAndroid Build Coastguard Worker StringRef ArgList::getLastArgValue(OptSpecifier Id,
235*9880d681SAndroid Build Coastguard Worker                                          StringRef Default) const {
236*9880d681SAndroid Build Coastguard Worker   if (Arg *A = getLastArg(Id))
237*9880d681SAndroid Build Coastguard Worker     return A->getValue();
238*9880d681SAndroid Build Coastguard Worker   return Default;
239*9880d681SAndroid Build Coastguard Worker }
240*9880d681SAndroid Build Coastguard Worker 
getAllArgValues(OptSpecifier Id) const241*9880d681SAndroid Build Coastguard Worker std::vector<std::string> ArgList::getAllArgValues(OptSpecifier Id) const {
242*9880d681SAndroid Build Coastguard Worker   SmallVector<const char *, 16> Values;
243*9880d681SAndroid Build Coastguard Worker   AddAllArgValues(Values, Id);
244*9880d681SAndroid Build Coastguard Worker   return std::vector<std::string>(Values.begin(), Values.end());
245*9880d681SAndroid Build Coastguard Worker }
246*9880d681SAndroid Build Coastguard Worker 
AddLastArg(ArgStringList & Output,OptSpecifier Id) const247*9880d681SAndroid Build Coastguard Worker void ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id) const {
248*9880d681SAndroid Build Coastguard Worker   if (Arg *A = getLastArg(Id)) {
249*9880d681SAndroid Build Coastguard Worker     A->claim();
250*9880d681SAndroid Build Coastguard Worker     A->render(*this, Output);
251*9880d681SAndroid Build Coastguard Worker   }
252*9880d681SAndroid Build Coastguard Worker }
253*9880d681SAndroid Build Coastguard Worker 
AddLastArg(ArgStringList & Output,OptSpecifier Id0,OptSpecifier Id1) const254*9880d681SAndroid Build Coastguard Worker void ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id0,
255*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id1) const {
256*9880d681SAndroid Build Coastguard Worker   if (Arg *A = getLastArg(Id0, Id1)) {
257*9880d681SAndroid Build Coastguard Worker     A->claim();
258*9880d681SAndroid Build Coastguard Worker     A->render(*this, Output);
259*9880d681SAndroid Build Coastguard Worker   }
260*9880d681SAndroid Build Coastguard Worker }
261*9880d681SAndroid Build Coastguard Worker 
AddAllArgs(ArgStringList & Output,ArrayRef<OptSpecifier> Ids) const262*9880d681SAndroid Build Coastguard Worker void ArgList::AddAllArgs(ArgStringList &Output,
263*9880d681SAndroid Build Coastguard Worker                          ArrayRef<OptSpecifier> Ids) const {
264*9880d681SAndroid Build Coastguard Worker   for (const Arg *Arg : Args) {
265*9880d681SAndroid Build Coastguard Worker     for (OptSpecifier Id : Ids) {
266*9880d681SAndroid Build Coastguard Worker       if (Arg->getOption().matches(Id)) {
267*9880d681SAndroid Build Coastguard Worker         Arg->claim();
268*9880d681SAndroid Build Coastguard Worker         Arg->render(*this, Output);
269*9880d681SAndroid Build Coastguard Worker         break;
270*9880d681SAndroid Build Coastguard Worker       }
271*9880d681SAndroid Build Coastguard Worker     }
272*9880d681SAndroid Build Coastguard Worker   }
273*9880d681SAndroid Build Coastguard Worker }
274*9880d681SAndroid Build Coastguard Worker 
275*9880d681SAndroid Build Coastguard Worker /// This 3-opt variant of AddAllArgs could be eliminated in favor of one
276*9880d681SAndroid Build Coastguard Worker /// that accepts a single specifier, given the above which accepts any number.
AddAllArgs(ArgStringList & Output,OptSpecifier Id0,OptSpecifier Id1,OptSpecifier Id2) const277*9880d681SAndroid Build Coastguard Worker void ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
278*9880d681SAndroid Build Coastguard Worker                          OptSpecifier Id1, OptSpecifier Id2) const {
279*9880d681SAndroid Build Coastguard Worker   for (auto Arg: filtered(Id0, Id1, Id2)) {
280*9880d681SAndroid Build Coastguard Worker     Arg->claim();
281*9880d681SAndroid Build Coastguard Worker     Arg->render(*this, Output);
282*9880d681SAndroid Build Coastguard Worker   }
283*9880d681SAndroid Build Coastguard Worker }
284*9880d681SAndroid Build Coastguard Worker 
AddAllArgValues(ArgStringList & Output,OptSpecifier Id0,OptSpecifier Id1,OptSpecifier Id2) const285*9880d681SAndroid Build Coastguard Worker void ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0,
286*9880d681SAndroid Build Coastguard Worker                               OptSpecifier Id1, OptSpecifier Id2) const {
287*9880d681SAndroid Build Coastguard Worker   for (auto Arg : filtered(Id0, Id1, Id2)) {
288*9880d681SAndroid Build Coastguard Worker     Arg->claim();
289*9880d681SAndroid Build Coastguard Worker     const auto &Values = Arg->getValues();
290*9880d681SAndroid Build Coastguard Worker     Output.append(Values.begin(), Values.end());
291*9880d681SAndroid Build Coastguard Worker   }
292*9880d681SAndroid Build Coastguard Worker }
293*9880d681SAndroid Build Coastguard Worker 
AddAllArgsTranslated(ArgStringList & Output,OptSpecifier Id0,const char * Translation,bool Joined) const294*9880d681SAndroid Build Coastguard Worker void ArgList::AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0,
295*9880d681SAndroid Build Coastguard Worker                                    const char *Translation,
296*9880d681SAndroid Build Coastguard Worker                                    bool Joined) const {
297*9880d681SAndroid Build Coastguard Worker   for (auto Arg: filtered(Id0)) {
298*9880d681SAndroid Build Coastguard Worker     Arg->claim();
299*9880d681SAndroid Build Coastguard Worker 
300*9880d681SAndroid Build Coastguard Worker     if (Joined) {
301*9880d681SAndroid Build Coastguard Worker       Output.push_back(MakeArgString(StringRef(Translation) +
302*9880d681SAndroid Build Coastguard Worker                                      Arg->getValue(0)));
303*9880d681SAndroid Build Coastguard Worker     } else {
304*9880d681SAndroid Build Coastguard Worker       Output.push_back(Translation);
305*9880d681SAndroid Build Coastguard Worker       Output.push_back(Arg->getValue(0));
306*9880d681SAndroid Build Coastguard Worker     }
307*9880d681SAndroid Build Coastguard Worker   }
308*9880d681SAndroid Build Coastguard Worker }
309*9880d681SAndroid Build Coastguard Worker 
ClaimAllArgs(OptSpecifier Id0) const310*9880d681SAndroid Build Coastguard Worker void ArgList::ClaimAllArgs(OptSpecifier Id0) const {
311*9880d681SAndroid Build Coastguard Worker   for (auto Arg : filtered(Id0))
312*9880d681SAndroid Build Coastguard Worker     Arg->claim();
313*9880d681SAndroid Build Coastguard Worker }
314*9880d681SAndroid Build Coastguard Worker 
ClaimAllArgs() const315*9880d681SAndroid Build Coastguard Worker void ArgList::ClaimAllArgs() const {
316*9880d681SAndroid Build Coastguard Worker   for (const_iterator it = begin(), ie = end(); it != ie; ++it)
317*9880d681SAndroid Build Coastguard Worker     if (!(*it)->isClaimed())
318*9880d681SAndroid Build Coastguard Worker       (*it)->claim();
319*9880d681SAndroid Build Coastguard Worker }
320*9880d681SAndroid Build Coastguard Worker 
GetOrMakeJoinedArgString(unsigned Index,StringRef LHS,StringRef RHS) const321*9880d681SAndroid Build Coastguard Worker const char *ArgList::GetOrMakeJoinedArgString(unsigned Index,
322*9880d681SAndroid Build Coastguard Worker                                               StringRef LHS,
323*9880d681SAndroid Build Coastguard Worker                                               StringRef RHS) const {
324*9880d681SAndroid Build Coastguard Worker   StringRef Cur = getArgString(Index);
325*9880d681SAndroid Build Coastguard Worker   if (Cur.size() == LHS.size() + RHS.size() &&
326*9880d681SAndroid Build Coastguard Worker       Cur.startswith(LHS) && Cur.endswith(RHS))
327*9880d681SAndroid Build Coastguard Worker     return Cur.data();
328*9880d681SAndroid Build Coastguard Worker 
329*9880d681SAndroid Build Coastguard Worker   return MakeArgString(LHS + RHS);
330*9880d681SAndroid Build Coastguard Worker }
331*9880d681SAndroid Build Coastguard Worker 
print(raw_ostream & O) const332*9880d681SAndroid Build Coastguard Worker void ArgList::print(raw_ostream &O) const {
333*9880d681SAndroid Build Coastguard Worker   for (Arg *A : *this) {
334*9880d681SAndroid Build Coastguard Worker     O << "* ";
335*9880d681SAndroid Build Coastguard Worker     A->print(O);
336*9880d681SAndroid Build Coastguard Worker   }
337*9880d681SAndroid Build Coastguard Worker }
338*9880d681SAndroid Build Coastguard Worker 
dump() const339*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD void ArgList::dump() const { print(dbgs()); }
340*9880d681SAndroid Build Coastguard Worker 
341*9880d681SAndroid Build Coastguard Worker //
342*9880d681SAndroid Build Coastguard Worker 
releaseMemory()343*9880d681SAndroid Build Coastguard Worker void InputArgList::releaseMemory() {
344*9880d681SAndroid Build Coastguard Worker   // An InputArgList always owns its arguments.
345*9880d681SAndroid Build Coastguard Worker   for (Arg *A : *this)
346*9880d681SAndroid Build Coastguard Worker     delete A;
347*9880d681SAndroid Build Coastguard Worker }
348*9880d681SAndroid Build Coastguard Worker 
InputArgList(const char * const * ArgBegin,const char * const * ArgEnd)349*9880d681SAndroid Build Coastguard Worker InputArgList::InputArgList(const char* const *ArgBegin,
350*9880d681SAndroid Build Coastguard Worker                            const char* const *ArgEnd)
351*9880d681SAndroid Build Coastguard Worker   : NumInputArgStrings(ArgEnd - ArgBegin) {
352*9880d681SAndroid Build Coastguard Worker   ArgStrings.append(ArgBegin, ArgEnd);
353*9880d681SAndroid Build Coastguard Worker }
354*9880d681SAndroid Build Coastguard Worker 
MakeIndex(StringRef String0) const355*9880d681SAndroid Build Coastguard Worker unsigned InputArgList::MakeIndex(StringRef String0) const {
356*9880d681SAndroid Build Coastguard Worker   unsigned Index = ArgStrings.size();
357*9880d681SAndroid Build Coastguard Worker 
358*9880d681SAndroid Build Coastguard Worker   // Tuck away so we have a reliable const char *.
359*9880d681SAndroid Build Coastguard Worker   SynthesizedStrings.push_back(String0);
360*9880d681SAndroid Build Coastguard Worker   ArgStrings.push_back(SynthesizedStrings.back().c_str());
361*9880d681SAndroid Build Coastguard Worker 
362*9880d681SAndroid Build Coastguard Worker   return Index;
363*9880d681SAndroid Build Coastguard Worker }
364*9880d681SAndroid Build Coastguard Worker 
MakeIndex(StringRef String0,StringRef String1) const365*9880d681SAndroid Build Coastguard Worker unsigned InputArgList::MakeIndex(StringRef String0,
366*9880d681SAndroid Build Coastguard Worker                                  StringRef String1) const {
367*9880d681SAndroid Build Coastguard Worker   unsigned Index0 = MakeIndex(String0);
368*9880d681SAndroid Build Coastguard Worker   unsigned Index1 = MakeIndex(String1);
369*9880d681SAndroid Build Coastguard Worker   assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!");
370*9880d681SAndroid Build Coastguard Worker   (void) Index1;
371*9880d681SAndroid Build Coastguard Worker   return Index0;
372*9880d681SAndroid Build Coastguard Worker }
373*9880d681SAndroid Build Coastguard Worker 
MakeArgStringRef(StringRef Str) const374*9880d681SAndroid Build Coastguard Worker const char *InputArgList::MakeArgStringRef(StringRef Str) const {
375*9880d681SAndroid Build Coastguard Worker   return getArgString(MakeIndex(Str));
376*9880d681SAndroid Build Coastguard Worker }
377*9880d681SAndroid Build Coastguard Worker 
378*9880d681SAndroid Build Coastguard Worker //
379*9880d681SAndroid Build Coastguard Worker 
DerivedArgList(const InputArgList & BaseArgs)380*9880d681SAndroid Build Coastguard Worker DerivedArgList::DerivedArgList(const InputArgList &BaseArgs)
381*9880d681SAndroid Build Coastguard Worker     : BaseArgs(BaseArgs) {}
382*9880d681SAndroid Build Coastguard Worker 
MakeArgStringRef(StringRef Str) const383*9880d681SAndroid Build Coastguard Worker const char *DerivedArgList::MakeArgStringRef(StringRef Str) const {
384*9880d681SAndroid Build Coastguard Worker   return BaseArgs.MakeArgString(Str);
385*9880d681SAndroid Build Coastguard Worker }
386*9880d681SAndroid Build Coastguard Worker 
AddSynthesizedArg(Arg * A)387*9880d681SAndroid Build Coastguard Worker void DerivedArgList::AddSynthesizedArg(Arg *A) {
388*9880d681SAndroid Build Coastguard Worker   SynthesizedArgs.push_back(std::unique_ptr<Arg>(A));
389*9880d681SAndroid Build Coastguard Worker }
390*9880d681SAndroid Build Coastguard Worker 
MakeFlagArg(const Arg * BaseArg,const Option Opt) const391*9880d681SAndroid Build Coastguard Worker Arg *DerivedArgList::MakeFlagArg(const Arg *BaseArg, const Option Opt) const {
392*9880d681SAndroid Build Coastguard Worker   SynthesizedArgs.push_back(
393*9880d681SAndroid Build Coastguard Worker       make_unique<Arg>(Opt, MakeArgString(Opt.getPrefix() + Opt.getName()),
394*9880d681SAndroid Build Coastguard Worker                        BaseArgs.MakeIndex(Opt.getName()), BaseArg));
395*9880d681SAndroid Build Coastguard Worker   return SynthesizedArgs.back().get();
396*9880d681SAndroid Build Coastguard Worker }
397*9880d681SAndroid Build Coastguard Worker 
MakePositionalArg(const Arg * BaseArg,const Option Opt,StringRef Value) const398*9880d681SAndroid Build Coastguard Worker Arg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option Opt,
399*9880d681SAndroid Build Coastguard Worker                                        StringRef Value) const {
400*9880d681SAndroid Build Coastguard Worker   unsigned Index = BaseArgs.MakeIndex(Value);
401*9880d681SAndroid Build Coastguard Worker   SynthesizedArgs.push_back(
402*9880d681SAndroid Build Coastguard Worker       make_unique<Arg>(Opt, MakeArgString(Opt.getPrefix() + Opt.getName()),
403*9880d681SAndroid Build Coastguard Worker                        Index, BaseArgs.getArgString(Index), BaseArg));
404*9880d681SAndroid Build Coastguard Worker   return SynthesizedArgs.back().get();
405*9880d681SAndroid Build Coastguard Worker }
406*9880d681SAndroid Build Coastguard Worker 
MakeSeparateArg(const Arg * BaseArg,const Option Opt,StringRef Value) const407*9880d681SAndroid Build Coastguard Worker Arg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option Opt,
408*9880d681SAndroid Build Coastguard Worker                                      StringRef Value) const {
409*9880d681SAndroid Build Coastguard Worker   unsigned Index = BaseArgs.MakeIndex(Opt.getName(), Value);
410*9880d681SAndroid Build Coastguard Worker   SynthesizedArgs.push_back(
411*9880d681SAndroid Build Coastguard Worker       make_unique<Arg>(Opt, MakeArgString(Opt.getPrefix() + Opt.getName()),
412*9880d681SAndroid Build Coastguard Worker                        Index, BaseArgs.getArgString(Index + 1), BaseArg));
413*9880d681SAndroid Build Coastguard Worker   return SynthesizedArgs.back().get();
414*9880d681SAndroid Build Coastguard Worker }
415*9880d681SAndroid Build Coastguard Worker 
MakeJoinedArg(const Arg * BaseArg,const Option Opt,StringRef Value) const416*9880d681SAndroid Build Coastguard Worker Arg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option Opt,
417*9880d681SAndroid Build Coastguard Worker                                    StringRef Value) const {
418*9880d681SAndroid Build Coastguard Worker   unsigned Index = BaseArgs.MakeIndex((Opt.getName() + Value).str());
419*9880d681SAndroid Build Coastguard Worker   SynthesizedArgs.push_back(make_unique<Arg>(
420*9880d681SAndroid Build Coastguard Worker       Opt, MakeArgString(Opt.getPrefix() + Opt.getName()), Index,
421*9880d681SAndroid Build Coastguard Worker       BaseArgs.getArgString(Index) + Opt.getName().size(), BaseArg));
422*9880d681SAndroid Build Coastguard Worker   return SynthesizedArgs.back().get();
423*9880d681SAndroid Build Coastguard Worker }
424