diff --git a/clang/include/clang/Driver/ArgList.h b/clang/include/clang/Driver/ArgList.h index 9e6996bd08e3..67b08aa943e2 100644 --- a/clang/include/clang/Driver/ArgList.h +++ b/clang/include/clang/Driver/ArgList.h @@ -112,6 +112,31 @@ namespace driver { /// given option \arg Id, with the provided \arg Value. Arg *MakeJoinedArg(const Option *Opt, const char *Value) const; + /// @} + /// @name Translation Utilities + /// @{ + + /// hasFlag - Given an option \arg Pos and its negative form \arg + /// Neg, return true if the option is present, false if the + /// negation is present, and \arg Default if neither option is + /// given. If both the option and its negation are present, the + /// last one wins. + bool hasFlag(options::ID Pos, options::ID Neg, bool Default) const; + + /// AddLastArg - Render only the last argument match \arg Id0, if + /// present. + void AddLastArg(ArgStringList &Output, options::ID Id0) const; + + /// AddAllArgs - Render all arguments matching the given ids. + void AddAllArgs(ArgStringList &Output, options::ID Id0) const; + void AddAllArgs(ArgStringList &Output, options::ID Id0, options::ID Id1) const; + void AddAllArgs(ArgStringList &Output, options::ID Id0, options::ID Id1, + options::ID Id2) const; + + /// AddAllArgValues - Render the argument values of all arguments + /// matching the given ids. + void AddAllArgValues(ArgStringList &Output, options::ID Id0) const; + /// @} }; } // end namespace driver diff --git a/clang/lib/Driver/ArgList.cpp b/clang/lib/Driver/ArgList.cpp index 3c67f8f1e9bd..ee201f28bd14 100644 --- a/clang/lib/Driver/ArgList.cpp +++ b/clang/lib/Driver/ArgList.cpp @@ -58,6 +58,16 @@ Arg *ArgList::getLastArg(options::ID Id0, options::ID Id1, bool Claim) const { return Res; } +bool ArgList::hasFlag(options::ID Pos, options::ID Neg, bool Default) const { + Arg *PosA = getLastArg(Pos); + Arg *NegA = getLastArg(Pos); + if (PosA && NegA) + return NegA->getIndex() < PosA->getIndex(); + if (PosA) return true; + if (NegA) return false; + return Default; +} + unsigned ArgList::MakeIndex(const char *String0) const { unsigned Index = ArgStrings.size(); @@ -97,3 +107,58 @@ Arg *ArgList::MakeJoinedArg(const Option *Opt, const char *Value) const { Joined += Value; return new JoinedArg(Opt, MakeIndex(Joined.c_str())); } + +void ArgList::AddLastArg(ArgStringList &Output, options::ID Id) const { + if (Arg *A = getLastArg(Id)) { + A->claim(); + A->render(*this, Output); + } +} + +void ArgList::AddAllArgs(ArgStringList &Output, options::ID Id0) const { + // FIXME: Make fast. + for (const_iterator it = begin(), ie = end(); it != ie; ++it) { + const Arg *A = *it; + if (A->getOption().matches(Id0)) { + A->claim(); + A->render(*this, Output); + } + } +} + +void ArgList::AddAllArgs(ArgStringList &Output, options::ID Id0, + options::ID Id1) const { + // FIXME: Make fast. + for (const_iterator it = begin(), ie = end(); it != ie; ++it) { + const Arg *A = *it; + if (A->getOption().matches(Id0) || A->getOption().matches(Id1)) { + A->claim(); + A->render(*this, Output); + } + } +} + +void ArgList::AddAllArgs(ArgStringList &Output, options::ID Id0, + options::ID Id1, options::ID Id2) const { + // FIXME: Make fast. + for (const_iterator it = begin(), ie = end(); it != ie; ++it) { + const Arg *A = *it; + if (A->getOption().matches(Id0) || A->getOption().matches(Id1) || + A->getOption().matches(Id2)) { + A->claim(); + A->render(*this, Output); + } + } +} + +void ArgList::AddAllArgValues(ArgStringList &Output, options::ID Id0) const { + // FIXME: Make fast. + for (const_iterator it = begin(), ie = end(); it != ie; ++it) { + const Arg *A = *it; + if (A->getOption().matches(Id0)) { + A->claim(); + for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) + Output.push_back(A->getValue(*this, i)); + } + } +}