13fdcc6fb12d7cf38d2a3111736f80f0dd55447b4Nick Lewycky//===--- ArgList.cpp - Argument List Management ---------------------------===//
26ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar//
36ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar//                     The LLVM Compiler Infrastructure
46ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar//
56ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar// This file is distributed under the University of Illinois Open Source
66ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar// License. See LICENSE.TXT for details.
76ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar//
86ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar//===----------------------------------------------------------------------===//
96ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar
106ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar#include "clang/Driver/ArgList.h"
116ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar#include "clang/Driver/Arg.h"
1203e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
139358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbar#include "clang/Driver/Option.h"
146ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar
1516484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar#include "llvm/ADT/SmallString.h"
1616484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar#include "llvm/ADT/Twine.h"
1716484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar#include "llvm/Support/raw_ostream.h"
1816484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar
19a5ddbcac1e784d3e438fc6233a9e0f5516dc35efBenjamin Kramerusing namespace clang;
206ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbarusing namespace clang::driver;
216ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar
223b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbarvoid arg_iterator::SkipToNextArg() {
233b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (; Current != Args.end(); ++Current) {
243b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    // Done if there are no filters.
253b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    if (!Id0.isValid())
263b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar      break;
273b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar
283b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    // Otherwise require a match.
293b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    const Option &O = (*Current)->getOption();
303b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    if (O.matches(Id0) ||
313b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar        (Id1.isValid() && O.matches(Id1)) ||
323b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar        (Id2.isValid() && O.matches(Id2)))
333b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar      break;
343b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  }
353b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar}
363b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar
373b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar//
383b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar
393612bc80fabcdd337f6d1df06e69b38c2c5f5a32Daniel DunbarArgList::ArgList() {
406ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar}
416ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar
426ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel DunbarArgList::~ArgList() {
436ac1e2252b1a16fd8841c4b1af8fe41b820aa41dDaniel Dunbar}
449358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbar
459358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbarvoid ArgList::append(Arg *A) {
469358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbar  Args.push_back(A);
479358dc8d1edae6f9279647084e768c6da5715f73Daniel Dunbar}
48d8cadd4f250d1b69373fc80477f67375d2c54820Daniel Dunbar
492b81910618f63e4ce2373c926a26e76b4b91373fChad Rosiervoid ArgList::eraseArg(OptSpecifier Id) {
50aec8f4538dfc4fbe9dca92db63688b84f8f0c2a1Chad Rosier  for (iterator it = begin(), ie = end(); it != ie; ) {
512b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    if ((*it)->getOption().matches(Id)) {
52aec8f4538dfc4fbe9dca92db63688b84f8f0c2a1Chad Rosier      it = Args.erase(it);
53b18d503bc939281d8ea0dacea44e847297b92e8dChad Rosier      ie = end();
543060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier    } else {
55aec8f4538dfc4fbe9dca92db63688b84f8f0c2a1Chad Rosier      ++it;
563060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier    }
572b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  }
582b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier}
592b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
609e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArgNoClaim(OptSpecifier Id) const {
61d8cadd4f250d1b69373fc80477f67375d2c54820Daniel Dunbar  // FIXME: Make search efficient?
62e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
63e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    if ((*it)->getOption().matches(Id))
640c562a23a6560b5736077226ab31d6a9a216ccd3Daniel Dunbar      return *it;
650c562a23a6560b5736077226ab31d6a9a216ccd3Daniel Dunbar  return 0;
66d8cadd4f250d1b69373fc80477f67375d2c54820Daniel Dunbar}
67bca58cb5100a4fdff63165af6a1742f5160ec73bDaniel Dunbar
689e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id) const {
69592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  Arg *Res = 0;
70592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
71592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola    if ((*it)->getOption().matches(Id)) {
72592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola      Res = *it;
73592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola      Res->claim();
74592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola    }
75592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  }
76592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola
77592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  return Res;
78e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar}
79e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar
809e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1) const {
81fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar  Arg *Res = 0;
82592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
83fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar    if ((*it)->getOption().matches(Id0) ||
84fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar        (*it)->getOption().matches(Id1)) {
85fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar      Res = *it;
86592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola      Res->claim();
87592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola
88fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar    }
89fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar  }
90cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar
91cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar  return Res;
92cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar}
93cd4e186cdc1db0dcac937eb20afe8b5f5ff1a38dDaniel Dunbar
949e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
959e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                         OptSpecifier Id2) const {
9645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  Arg *Res = 0;
97592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
98fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar    if ((*it)->getOption().matches(Id0) ||
99fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar        (*it)->getOption().matches(Id1) ||
100fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar        (*it)->getOption().matches(Id2)) {
101fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar      Res = *it;
102592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola      Res->claim();
103fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar    }
10445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  }
10545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
10645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  return Res;
10745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling}
10845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
10947e879dfa735f81472a51b1bd69cc4eb9159db39Daniel DunbarArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
11047e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar                         OptSpecifier Id2, OptSpecifier Id3) const {
11147e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  Arg *Res = 0;
112592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
11347e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar    if ((*it)->getOption().matches(Id0) ||
11447e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar        (*it)->getOption().matches(Id1) ||
11547e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar        (*it)->getOption().matches(Id2) ||
11647e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar        (*it)->getOption().matches(Id3)) {
11747e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar      Res = *it;
118592f241d0abd000f404a12fba1474d4d963d7ff7Rafael Espindola      Res->claim();
11947e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar    }
12047e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  }
12147e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar
12247e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  return Res;
12347e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar}
12447e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar
125abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler CarruthArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
126abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                         OptSpecifier Id2, OptSpecifier Id3,
127abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                         OptSpecifier Id4) const {
128abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  Arg *Res = 0;
129abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
130abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth    if ((*it)->getOption().matches(Id0) ||
131abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        (*it)->getOption().matches(Id1) ||
132abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        (*it)->getOption().matches(Id2) ||
133abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        (*it)->getOption().matches(Id3) ||
134abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        (*it)->getOption().matches(Id4)) {
135abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      Res = *it;
136abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      Res->claim();
137abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth    }
138abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  }
139abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth
140abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  return Res;
141abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth}
142abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth
143003ab6682376a0e4544df295bddcf0d991275c40Simon AtanasyanArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
144003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan                         OptSpecifier Id2, OptSpecifier Id3,
145003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan                         OptSpecifier Id4, OptSpecifier Id5) const {
146003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan  Arg *Res = 0;
147003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
148003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan    if ((*it)->getOption().matches(Id0) ||
149003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id1) ||
150003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id2) ||
151003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id3) ||
152003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id4) ||
153003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id5)) {
154003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan      Res = *it;
155003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan      Res->claim();
156003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan    }
157003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan  }
158003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan
159003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan  return Res;
160003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan}
161003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan
162003ab6682376a0e4544df295bddcf0d991275c40Simon AtanasyanArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
163003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan                         OptSpecifier Id2, OptSpecifier Id3,
164003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan                         OptSpecifier Id4, OptSpecifier Id5,
165003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan                         OptSpecifier Id6) const {
166003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan  Arg *Res = 0;
167003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
168003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan    if ((*it)->getOption().matches(Id0) ||
169003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id1) ||
170003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id2) ||
171003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id3) ||
172003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id4) ||
173003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id5) ||
174003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id6)) {
175003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan      Res = *it;
176003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan      Res->claim();
177003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan    }
178003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan  }
179003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan
180003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan  return Res;
181003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan}
182003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan
183003ab6682376a0e4544df295bddcf0d991275c40Simon AtanasyanArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
184003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan                         OptSpecifier Id2, OptSpecifier Id3,
185003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan                         OptSpecifier Id4, OptSpecifier Id5,
186003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan                         OptSpecifier Id6, OptSpecifier Id7) const {
187003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan  Arg *Res = 0;
188003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
189003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan    if ((*it)->getOption().matches(Id0) ||
190003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id1) ||
191003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id2) ||
192003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id3) ||
193003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id4) ||
194003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id5) ||
195003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id6) ||
196003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan        (*it)->getOption().matches(Id7)) {
197003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan      Res = *it;
198003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan      Res->claim();
199003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan    }
200003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan  }
201003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan
202003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan  return Res;
203003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan}
204003ab6682376a0e4544df295bddcf0d991275c40Simon Atanasyan
2059e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarbool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const {
2069af6668984f1594459a58c381d95272aa7ca7663Daniel Dunbar  if (Arg *A = getLastArg(Pos, Neg))
2079af6668984f1594459a58c381d95272aa7ca7663Daniel Dunbar    return A->getOption().matches(Pos);
20818a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  return Default;
20918a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
21018a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar
2115f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef ArgList::getLastArgValue(OptSpecifier Id,
2125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                         StringRef Default) const {
21303e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  if (Arg *A = getLastArg(Id))
21403e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar    return A->getValue(*this);
21503e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  return Default;
21603e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar}
21703e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
21803e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbarint ArgList::getLastArgIntValue(OptSpecifier Id, int Default,
2192dec85b21822f950bf6035640c496ad835e11728Chad Rosier                                clang::DiagnosticsEngine *Diags) const {
22003e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  int Res = Default;
22103e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
22203e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  if (Arg *A = getLastArg(Id)) {
2232dec85b21822f950bf6035640c496ad835e11728Chad Rosier    if (StringRef(A->getValue(*this)).getAsInteger(10, Res)) {
2242dec85b21822f950bf6035640c496ad835e11728Chad Rosier      if (Diags)
2252dec85b21822f950bf6035640c496ad835e11728Chad Rosier        Diags->Report(diag::err_drv_invalid_int_value)
2262dec85b21822f950bf6035640c496ad835e11728Chad Rosier          << A->getAsString(*this) << A->getValue(*this);
2272dec85b21822f950bf6035640c496ad835e11728Chad Rosier    }
22803e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  }
22903e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
23003e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  return Res;
23103e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar}
23203e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
23303e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbarstd::vector<std::string> ArgList::getAllArgValues(OptSpecifier Id) const {
2345f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<const char *, 16> Values;
23503e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  AddAllArgValues(Values, Id);
23603e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar  return std::vector<std::string>(Values.begin(), Values.end());
23703e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar}
23803e8ab2947a848fb0ce723dcebb1c19697614307Daniel Dunbar
2399e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id) const {
24018a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  if (Arg *A = getLastArg(Id)) {
24118a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    A->claim();
24218a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar    A->render(*this, Output);
24318a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  }
24418a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
24518a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar
2469e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
2479e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                         OptSpecifier Id1, OptSpecifier Id2) const {
2483b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (arg_iterator it = filtered_begin(Id0, Id1, Id2),
2493b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar         ie = filtered_end(); it != ie; ++it) {
2507e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
2517e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->render(*this, Output);
25218a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar  }
25318a7f33af877fca8f72cfde00d52f4aef600547fDaniel Dunbar}
254ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar
2559e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0,
2563b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar                              OptSpecifier Id1, OptSpecifier Id2) const {
2573b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (arg_iterator it = filtered_begin(Id0, Id1, Id2),
2583b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar         ie = filtered_end(); it != ie; ++it) {
2597e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
2607e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
2617e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      Output.push_back((*it)->getValue(*this, i));
262ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar  }
263ee51031c3734176d00723054c765538fcffc0984Daniel Dunbar}
264f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
2659e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0,
2664df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar                                   const char *Translation,
2674df9a664b7a0bfbd065253349cc5ead88b50b9a2Daniel Dunbar                                   bool Joined) const {
2683b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (arg_iterator it = filtered_begin(Id0),
2693b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar         ie = filtered_end(); it != ie; ++it) {
2707e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
2713b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar
2723b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    if (Joined) {
2735f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      Output.push_back(MakeArgString(StringRef(Translation) +
2747e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar                                     (*it)->getValue(*this, 0)));
2753b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar    } else {
2763b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar      Output.push_back(Translation);
2777e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      Output.push_back((*it)->getValue(*this, 0));
278524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar    }
279524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar  }
280524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar}
281524b9fb54564ab8bc437118ed55ee7c9e8c1247dDaniel Dunbar
2829e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbarvoid ArgList::ClaimAllArgs(OptSpecifier Id0) const {
2833b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar  for (arg_iterator it = filtered_begin(Id0),
2843b84f5bab9f134741cf4d3c80086009519b6d968Daniel Dunbar         ie = filtered_end(); it != ie; ++it)
2857e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
28668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar}
28768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar
2882b81910618f63e4ce2373c926a26e76b4b91373fChad Rosiervoid ArgList::ClaimAllArgs() const {
2892b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  for (const_iterator it = begin(), ie = end(); it != ie; ++it)
2902b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    if (!(*it)->isClaimed())
2912b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier      (*it)->claim();
2922b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier}
2932b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
2945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *ArgList::MakeArgString(const Twine &T) const {
295f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<256> Str;
29616484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar  T.toVector(Str);
29716484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar  return MakeArgString(Str.str());
29816484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar}
29916484afe5ca790d2f9a16650638e54067c037d7dDaniel Dunbar
300312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbarconst char *ArgList::GetOrMakeJoinedArgString(unsigned Index,
3015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                              StringRef LHS,
3025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                              StringRef RHS) const {
3035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef Cur = getArgString(Index);
304312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar  if (Cur.size() == LHS.size() + RHS.size() &&
305312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar      Cur.startswith(LHS) && Cur.endswith(RHS))
306312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar    return Cur.data();
307312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar
308312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar  return MakeArgString(LHS + RHS);
309312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar}
310312a8b726e24078d3bd3b2328f9f895d1407cdb7Daniel Dunbar
311f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar//
312f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
3139d520c5ae802fc175c61032b289ddd6968e6ddd2Axel NaumannInputArgList::InputArgList(const char* const *ArgBegin,
3149d520c5ae802fc175c61032b289ddd6968e6ddd2Axel Naumann                           const char* const *ArgEnd)
3153612bc80fabcdd337f6d1df06e69b38c2c5f5a32Daniel Dunbar  : NumInputArgStrings(ArgEnd - ArgBegin) {
316f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  ArgStrings.append(ArgBegin, ArgEnd);
317f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
318f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
319f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel DunbarInputArgList::~InputArgList() {
320f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  // An InputArgList always owns its arguments.
321f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  for (iterator it = begin(), ie = end(); it != ie; ++it)
322f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    delete *it;
323f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
324f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
3255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerunsigned InputArgList::MakeIndex(StringRef String0) const {
326f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  unsigned Index = ArgStrings.size();
327f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
328f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  // Tuck away so we have a reliable const char *.
329f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  SynthesizedStrings.push_back(String0);
330f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  ArgStrings.push_back(SynthesizedStrings.back().c_str());
331f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
332f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return Index;
333f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
334f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
3355f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerunsigned InputArgList::MakeIndex(StringRef String0,
3365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                 StringRef String1) const {
337f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  unsigned Index0 = MakeIndex(String0);
338f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  unsigned Index1 = MakeIndex(String1);
339f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!");
340f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  (void) Index1;
341f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return Index0;
342f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
343f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
3445f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *InputArgList::MakeArgString(StringRef Str) const {
345f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return getArgString(MakeIndex(Str));
346f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
347f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
348f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar//
349f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
350279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel DunbarDerivedArgList::DerivedArgList(const InputArgList &_BaseArgs)
3513612bc80fabcdd337f6d1df06e69b38c2c5f5a32Daniel Dunbar  : BaseArgs(_BaseArgs) {
352f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
353f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
354f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel DunbarDerivedArgList::~DerivedArgList() {
355f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  // We only own the arguments we explicitly synthesized.
3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (iterator it = SynthesizedArgs.begin(), ie = SynthesizedArgs.end();
357f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar       it != ie; ++it)
358f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    delete *it;
359f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
360f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
3615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerconst char *DerivedArgList::MakeArgString(StringRef Str) const {
362f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return BaseArgs.MakeArgString(Str);
363f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
364f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
365478edc295efc560627053e2320bedd2f696ae028Daniel DunbarArg *DerivedArgList::MakeFlagArg(const Arg *BaseArg, const Option *Opt) const {
366532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  Arg *A = new Arg(Opt, BaseArgs.MakeIndex(Opt->getName()), BaseArg);
367fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  SynthesizedArgs.push_back(A);
368fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  return A;
369f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
370f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
3711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option *Opt,
3725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                       StringRef Value) const {
3734465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar  unsigned Index = BaseArgs.MakeIndex(Value);
374532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  Arg *A = new Arg(Opt, Index, BaseArgs.getArgString(Index), BaseArg);
375fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  SynthesizedArgs.push_back(A);
376fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  return A;
377f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
378f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
3791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option *Opt,
3805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                     StringRef Value) const {
3814465a776a56de81211ae4672e5782c6bef075135Daniel Dunbar  unsigned Index = BaseArgs.MakeIndex(Opt->getName(), Value);
382fdbe65e587b85cf48f093d531a78fa3b2d9961b8Daniel Dunbar  Arg *A = new Arg(Opt, Index, BaseArgs.getArgString(Index + 1), BaseArg);
383fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  SynthesizedArgs.push_back(A);
384fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  return A;
385f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
386f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
3871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpArg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option *Opt,
3885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                   StringRef Value) const {
389bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor  unsigned Index = BaseArgs.MakeIndex(Opt->getName().str() + Value.str());
390532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar  Arg *A = new Arg(Opt, Index,
391bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor                   BaseArgs.getArgString(Index) + Opt->getName().size(),
392532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar                   BaseArg);
393fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  SynthesizedArgs.push_back(A);
394fd48cb31d409cb1f8e1f119426965e498652e2d1Daniel Dunbar  return A;
395f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
396