forked from OSchip/llvm-project
Driver: Add argument translation utilities to ArgList.
- Support things like telling which -ffoo -fno-foo option won, and forwarding all arguments matching a certain set of options to the tool. llvm-svn: 67189
This commit is contained in:
parent
a3246a0638
commit
7591f29f7c
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue