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