ArgList.cpp revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===--- ArgList.cpp - Argument List Management ---------------------------===// 296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// 396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// The LLVM Compiler Infrastructure 496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// 596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// This file is distributed under the University of Illinois Open Source 696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// License. See LICENSE.TXT for details. 796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// 896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===----------------------------------------------------------------------===// 996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 1096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/ArgList.h" 1196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/ADT/SmallString.h" 12dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/STLExtras.h" 1396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/ADT/Twine.h" 1496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/Arg.h" 1596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/Option.h" 1696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Support/raw_ostream.h" 1796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 1896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerusing namespace llvm; 1996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerusing namespace llvm::opt; 2096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 2196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid arg_iterator::SkipToNextArg() { 2296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (; Current != Args.end(); ++Current) { 2396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer // Done if there are no filters. 2496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (!Id0.isValid()) 2596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer break; 2696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 2796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer // Otherwise require a match. 2896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer const Option &O = (*Current)->getOption(); 2996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (O.matches(Id0) || 3096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (Id1.isValid() && O.matches(Id1)) || 3196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (Id2.isValid() && O.matches(Id2))) 3296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer break; 3396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 3496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 3596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 3696a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArgList::~ArgList() { 3796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 3896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 3996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::append(Arg *A) { 4096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Args.push_back(A); 4196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 4296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 4396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::eraseArg(OptSpecifier Id) { 44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Args.erase(std::remove_if(begin(), end(), 45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines [=](Arg *A) { return A->getOption().matches(Id); }), 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines end()); 4796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 4896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 4996a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArgNoClaim(OptSpecifier Id) const { 5096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer // FIXME: Make search efficient? 5196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it) 5296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if ((*it)->getOption().matches(Id)) 5396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return *it; 54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 5596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 5696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 5796a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id) const { 58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Arg *Res = nullptr; 5996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 6096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if ((*it)->getOption().matches(Id)) { 6196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res = *it; 6296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res->claim(); 6396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 6496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 6596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 6696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Res; 6796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 6896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 6996a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1) const { 70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Arg *Res = nullptr; 7196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 7296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if ((*it)->getOption().matches(Id0) || 7396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id1)) { 7496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res = *it; 7596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res->claim(); 7696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 7796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 7896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 7996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 8096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Res; 8196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 8296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 8396a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1, 8496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id2) const { 85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Arg *Res = nullptr; 8696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 8796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if ((*it)->getOption().matches(Id0) || 8896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id1) || 8996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id2)) { 9096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res = *it; 9196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res->claim(); 9296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 9396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 9496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 9596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Res; 9696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 9796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 9896a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1, 9996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id2, OptSpecifier Id3) const { 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Arg *Res = nullptr; 10196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 10296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if ((*it)->getOption().matches(Id0) || 10396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id1) || 10496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id2) || 10596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id3)) { 10696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res = *it; 10796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res->claim(); 10896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 10996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 11096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 11196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Res; 11296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 11396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 11496a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1, 11596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id2, OptSpecifier Id3, 11696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id4) const { 117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Arg *Res = nullptr; 11896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 11996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if ((*it)->getOption().matches(Id0) || 12096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id1) || 12196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id2) || 12296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id3) || 12396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id4)) { 12496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res = *it; 12596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res->claim(); 12696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 12796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 12896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 12996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Res; 13096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 13196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 13296a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1, 13396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id2, OptSpecifier Id3, 13496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id4, OptSpecifier Id5) const { 135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Arg *Res = nullptr; 13696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 13796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if ((*it)->getOption().matches(Id0) || 13896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id1) || 13996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id2) || 14096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id3) || 14196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id4) || 14296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id5)) { 14396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res = *it; 14496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res->claim(); 14596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 14696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 14796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 14896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Res; 14996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 15096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 15196a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1, 15296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id2, OptSpecifier Id3, 15396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id4, OptSpecifier Id5, 15496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id6) const { 155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Arg *Res = nullptr; 15696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 15796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if ((*it)->getOption().matches(Id0) || 15896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id1) || 15996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id2) || 16096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id3) || 16196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id4) || 16296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id5) || 16396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id6)) { 16496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res = *it; 16596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res->claim(); 16696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 16796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 16896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 16996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Res; 17096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 17196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 17296a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1, 17396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id2, OptSpecifier Id3, 17496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id4, OptSpecifier Id5, 17596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id6, OptSpecifier Id7) const { 176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Arg *Res = nullptr; 17796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 17896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if ((*it)->getOption().matches(Id0) || 17996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id1) || 18096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id2) || 18196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id3) || 18296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id4) || 18396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id5) || 18496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id6) || 18596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getOption().matches(Id7)) { 18696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res = *it; 18796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Res->claim(); 18896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 18996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 19096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 19196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Res; 19296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 19396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 19496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerbool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const { 19596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (Arg *A = getLastArg(Pos, Neg)) 19696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return A->getOption().matches(Pos); 19796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Default; 19896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 19996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 2001ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Klecknerbool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier PosAlias, OptSpecifier Neg, 2011ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner bool Default) const { 2021ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner if (Arg *A = getLastArg(Pos, PosAlias, Neg)) 2031ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner return A->getOption().matches(Pos) || A->getOption().matches(PosAlias); 2041ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner return Default; 2051ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner} 2061ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner 20796a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerStringRef ArgList::getLastArgValue(OptSpecifier Id, 20896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer StringRef Default) const { 20996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (Arg *A = getLastArg(Id)) 21096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return A->getValue(); 21196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Default; 21296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 21396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 21496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerstd::vector<std::string> ArgList::getAllArgValues(OptSpecifier Id) const { 21596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer SmallVector<const char *, 16> Values; 21696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer AddAllArgValues(Values, Id); 21796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return std::vector<std::string>(Values.begin(), Values.end()); 21896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 21996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 22096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id) const { 22196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (Arg *A = getLastArg(Id)) { 22296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer A->claim(); 22396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer A->render(*this, Output); 22496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 22596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 22696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 2271ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Klecknervoid ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id0, 2281ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner OptSpecifier Id1) const { 2291ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner if (Arg *A = getLastArg(Id0, Id1)) { 2301ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner A->claim(); 2311ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner A->render(*this, Output); 2321ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner } 2331ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner} 2341ee21dc1e11abdc56102d0f54265af73f5468bf9Reid Kleckner 23596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0, 23696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id1, OptSpecifier Id2) const { 23796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (arg_iterator it = filtered_begin(Id0, Id1, Id2), 23896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer ie = filtered_end(); it != ie; ++it) { 23996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->claim(); 24096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->render(*this, Output); 24196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 24296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 24396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 24496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0, 24596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptSpecifier Id1, OptSpecifier Id2) const { 24696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (arg_iterator it = filtered_begin(Id0, Id1, Id2), 24796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer ie = filtered_end(); it != ie; ++it) { 24896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->claim(); 24996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i) 25096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Output.push_back((*it)->getValue(i)); 25196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 25296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 25396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 25496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0, 25596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer const char *Translation, 25696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer bool Joined) const { 25796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (arg_iterator it = filtered_begin(Id0), 25896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer ie = filtered_end(); it != ie; ++it) { 25996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->claim(); 26096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 26196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (Joined) { 26296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Output.push_back(MakeArgString(StringRef(Translation) + 26396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->getValue(0))); 26496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } else { 26596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Output.push_back(Translation); 26696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Output.push_back((*it)->getValue(0)); 26796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 26896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 26996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 27096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 27196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::ClaimAllArgs(OptSpecifier Id0) const { 27296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (arg_iterator it = filtered_begin(Id0), 27396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer ie = filtered_end(); it != ie; ++it) 27496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->claim(); 27596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 27696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 27796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencervoid ArgList::ClaimAllArgs() const { 27896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (const_iterator it = begin(), ie = end(); it != ie; ++it) 27996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (!(*it)->isClaimed()) 28096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (*it)->claim(); 28196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 28296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 28396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerconst char *ArgList::MakeArgString(const Twine &T) const { 28496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer SmallString<256> Str; 28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MakeArgString(T.toStringRef(Str)); 28696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 28796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 28896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerconst char *ArgList::GetOrMakeJoinedArgString(unsigned Index, 28996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer StringRef LHS, 29096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer StringRef RHS) const { 29196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer StringRef Cur = getArgString(Index); 29296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (Cur.size() == LHS.size() + RHS.size() && 29396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Cur.startswith(LHS) && Cur.endswith(RHS)) 29496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Cur.data(); 29596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 29696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return MakeArgString(LHS + RHS); 29796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 29896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 29996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// 30096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 30196a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerInputArgList::InputArgList(const char* const *ArgBegin, 30296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer const char* const *ArgEnd) 30396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer : NumInputArgStrings(ArgEnd - ArgBegin) { 30496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer ArgStrings.append(ArgBegin, ArgEnd); 30596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 30696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 30796a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerInputArgList::~InputArgList() { 30896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer // An InputArgList always owns its arguments. 30996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer for (iterator it = begin(), ie = end(); it != ie; ++it) 31096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer delete *it; 31196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 31296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 31396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerunsigned InputArgList::MakeIndex(StringRef String0) const { 31496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer unsigned Index = ArgStrings.size(); 31596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 31696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer // Tuck away so we have a reliable const char *. 317f73f80975639a7413bee66391556f7ea51f83423Reid Kleckner SynthesizedStrings.push_back(String0); 318f73f80975639a7413bee66391556f7ea51f83423Reid Kleckner ArgStrings.push_back(SynthesizedStrings.back().c_str()); 31996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 32096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Index; 32196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 32296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 32396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerunsigned InputArgList::MakeIndex(StringRef String0, 32496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer StringRef String1) const { 32596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer unsigned Index0 = MakeIndex(String0); 32696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer unsigned Index1 = MakeIndex(String1); 32796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!"); 32896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer (void) Index1; 32996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Index0; 33096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 33196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 33296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerconst char *InputArgList::MakeArgString(StringRef Str) const { 33396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return getArgString(MakeIndex(Str)); 33496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 33596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 33696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// 33796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 33896a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerDerivedArgList::DerivedArgList(const InputArgList &_BaseArgs) 33996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer : BaseArgs(_BaseArgs) { 34096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 34196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 342dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDerivedArgList::~DerivedArgList() {} 34396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 34496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerconst char *DerivedArgList::MakeArgString(StringRef Str) const { 34596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return BaseArgs.MakeArgString(Str); 34696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 34796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 348dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid DerivedArgList::AddSynthesizedArg(Arg *A) { 349dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SynthesizedArgs.push_back(std::unique_ptr<Arg>(A)); 350dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 351dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 35296a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *DerivedArgList::MakeFlagArg(const Arg *BaseArg, const Option Opt) const { 353dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SynthesizedArgs.push_back(make_unique<Arg>( 354dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Opt, 355dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ArgList::MakeArgString(Twine(Opt.getPrefix()) + Twine(Opt.getName())), 356dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines BaseArgs.MakeIndex(Opt.getName()), BaseArg)); 357dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return SynthesizedArgs.back().get(); 35896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 35996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 36096a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option Opt, 36196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer StringRef Value) const { 36296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer unsigned Index = BaseArgs.MakeIndex(Value); 363dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SynthesizedArgs.push_back(make_unique<Arg>( 364dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Opt, 365dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ArgList::MakeArgString(Twine(Opt.getPrefix()) + Twine(Opt.getName())), 366dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Index, BaseArgs.getArgString(Index), BaseArg)); 367dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return SynthesizedArgs.back().get(); 36896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 36996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 37096a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option Opt, 37196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer StringRef Value) const { 37296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer unsigned Index = BaseArgs.MakeIndex(Opt.getName(), Value); 373dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SynthesizedArgs.push_back(make_unique<Arg>( 374dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Opt, 375dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ArgList::MakeArgString(Twine(Opt.getPrefix()) + Twine(Opt.getName())), 376dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Index, BaseArgs.getArgString(Index + 1), BaseArg)); 377dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return SynthesizedArgs.back().get(); 37896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 37996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 38096a564f2beec8c1930f0640844eec433e03bbce8Michael J. SpencerArg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option Opt, 38196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer StringRef Value) const { 38296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer unsigned Index = BaseArgs.MakeIndex(Opt.getName().str() + Value.str()); 383dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SynthesizedArgs.push_back(make_unique<Arg>( 384dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Opt, 385dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ArgList::MakeArgString(Twine(Opt.getPrefix()) + Twine(Opt.getName())), 386dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Index, BaseArgs.getArgString(Index) + Opt.getName().size(), BaseArg)); 387dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return SynthesizedArgs.back().get(); 38896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} 389