#ifndef CLANG_DRIVER_ARGLIST_H_
#define CLANG_DRIVER_ARGLIST_H_
+#include "clang/Driver/OptSpecifier.h"
#include "clang/Driver/Options.h"
-
#include "clang/Driver/Util.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
/// hasArg - Does the arg list contain any option matching \arg Id.
///
/// \arg Claim Whether the argument should be claimed, if it exists.
- bool hasArgNoClaim(options::ID Id) const {
+ bool hasArgNoClaim(OptSpecifier Id) const {
return getLastArgNoClaim(Id) != 0;
}
- bool hasArg(options::ID Id) const {
+ bool hasArg(OptSpecifier Id) const {
return getLastArg(Id) != 0;
}
- bool hasArg(options::ID Id0, options::ID Id1) const {
+ bool hasArg(OptSpecifier Id0, OptSpecifier Id1) const {
return getLastArg(Id0, Id1) != 0;
}
- bool hasArg(options::ID Id0, options::ID Id1, options::ID Id2) const {
+ bool hasArg(OptSpecifier Id0, OptSpecifier Id1, OptSpecifier Id2) const {
return getLastArg(Id0, Id1, Id2) != 0;
}
/// getLastArg - Return the last argument matching \arg Id, or null.
///
/// \arg Claim Whether the argument should be claimed, if it exists.
- Arg *getLastArgNoClaim(options::ID Id) const;
- Arg *getLastArg(options::ID Id) const;
- Arg *getLastArg(options::ID Id0, options::ID Id1) const;
- Arg *getLastArg(options::ID Id0, options::ID Id1,
- options::ID Id2) const;
+ Arg *getLastArgNoClaim(OptSpecifier Id) const;
+ Arg *getLastArg(OptSpecifier Id) const;
+ Arg *getLastArg(OptSpecifier Id0, OptSpecifier Id1) const;
+ Arg *getLastArg(OptSpecifier Id0, OptSpecifier Id1, OptSpecifier Id2) const;
/// getArgString - Return the input argument string at \arg Index.
virtual const char *getArgString(unsigned Index) const = 0;
/// 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=true) const;
+ bool hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default=true) const;
/// AddLastArg - Render only the last argument match \arg Id0, if
/// present.
- void AddLastArg(ArgStringList &Output, options::ID Id0) const;
+ void AddLastArg(ArgStringList &Output, OptSpecifier 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;
+ void AddAllArgs(ArgStringList &Output, OptSpecifier Id0) const;
+ void AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
+ OptSpecifier Id1) const;
+ void AddAllArgs(ArgStringList &Output, OptSpecifier Id0, OptSpecifier Id1,
+ OptSpecifier Id2) const;
/// AddAllArgValues - Render the argument values of all arguments
/// matching the given ids.
- void AddAllArgValues(ArgStringList &Output, options::ID Id0) const;
- void AddAllArgValues(ArgStringList &Output, options::ID Id0,
- options::ID Id1) const;
+ void AddAllArgValues(ArgStringList &Output, OptSpecifier Id0) const;
+ void AddAllArgValues(ArgStringList &Output, OptSpecifier Id0,
+ OptSpecifier Id1) const;
/// AddAllArgsTranslated - Render all the arguments matching the
/// given ids, but forced to separate args and using the provided
///
/// \param Joined - If true, render the argument as joined with
/// the option specifier.
- void AddAllArgsTranslated(ArgStringList &Output, options::ID Id0,
+ void AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0,
const char *Translation,
bool Joined = false) const;
/// ClaimAllArgs - Claim all arguments which match the given
/// option id.
- void ClaimAllArgs(options::ID Id0) const;
+ void ClaimAllArgs(OptSpecifier Id0) const;
/// @}
/// @name Arg Synthesis
--- /dev/null
+//===--- OptSpecifier.h - Option Specifiers ---------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_DRIVER_OPTSPECIFIER_H
+#define CLANG_DRIVER_OPTSPECIFIER_H
+
+namespace clang {
+namespace driver {
+ class Option;
+
+ /// OptSpecifier - Wrapper class for abstracting references to option IDs.
+ class OptSpecifier {
+ unsigned ID;
+
+ private:
+ explicit OptSpecifier(bool); // DO NOT IMPLEMENT
+
+ public:
+ /*implicit*/ OptSpecifier(unsigned _ID) : ID(_ID) {}
+ /*implicit*/ OptSpecifier(const Option *Opt);
+
+ unsigned getID() const { return ID; }
+
+ bool operator==(OptSpecifier Opt) const { return ID == Opt.getID(); }
+ bool operator!=(OptSpecifier Opt) const { return !(*this == Opt); }
+ };
+}
+}
+
+#endif
#ifndef CLANG_DRIVER_OPTTABLE_H
#define CLANG_DRIVER_OPTTABLE_H
+#include "clang/Driver/OptSpecifier.h"
#include <cassert>
namespace clang {
/// be needed at runtime; the OptTable class maintains enough information to
/// parse command lines without instantiating Options, while letting other
/// parts of the driver still use Option instances where convenient.
- //
- // FIXME: Introduce an OptionSpecifier class to wrap the option ID
- // variant?
class OptTable {
public:
/// Info - Entry for a single option instance in the option data table.
unsigned FirstSearchableIndex;
private:
- const Info &getInfo(unsigned id) const {
+ const Info &getInfo(OptSpecifier Opt) const {
+ unsigned id = Opt.getID();
assert(id > 0 && id - 1 < getNumOptions() && "Invalid Option ID.");
return OptionInfos[id - 1];
}
/// if necessary.
///
/// \return The option, or null for the INVALID option id.
- const Option *getOption(unsigned id) const {
+ const Option *getOption(OptSpecifier Opt) const {
+ unsigned id = Opt.getID();
if (id == 0)
return 0;
}
/// getOptionName - Lookup the name of the given option.
- const char *getOptionName(unsigned id) const {
+ const char *getOptionName(OptSpecifier id) const {
return getInfo(id).Name;
}
/// getOptionKind - Get the kind of the given option.
- unsigned getOptionKind(unsigned id) const {
+ unsigned getOptionKind(OptSpecifier id) const {
return getInfo(id).Kind;
}
/// getOptionHelpText - Get the help text to use to describe this option.
- const char *getOptionHelpText(unsigned id) const {
+ const char *getOptionHelpText(OptSpecifier id) const {
return getInfo(id).HelpText;
}
/// getOptionMetaVar - Get the meta-variable name to use when describing
/// this options values in the help text.
- const char *getOptionMetaVar(unsigned id) const {
+ const char *getOptionMetaVar(OptSpecifier id) const {
return getInfo(id).MetaVar;
}
#ifndef CLANG_DRIVER_OPTION_H_
#define CLANG_DRIVER_OPTION_H_
+#include "clang/Driver/OptSpecifier.h"
#include "llvm/Support/Casting.h"
using llvm::isa;
using llvm::cast;
private:
OptionClass Kind;
- unsigned ID;
+ /// The option ID.
+ OptSpecifier ID;
/// The option name.
const char *Name;
bool NoArgumentUnused : 1;
protected:
- Option(OptionClass Kind, unsigned ID, const char *Name,
+ Option(OptionClass Kind, OptSpecifier ID, const char *Name,
const OptionGroup *Group, const Option *Alias);
public:
virtual ~Option();
- unsigned getId() const { return ID; }
+ unsigned getID() const { return ID.getID(); }
OptionClass getKind() const { return Kind; }
const char *getName() const { return Name; }
const OptionGroup *getGroup() const { return Group; }
/// Note that matches against options which are an alias should never be
/// done -- aliases do not participate in matching and so such a query will
/// always be false.
- bool matches(const Option *Opt) const;
- bool matches(unsigned Id) const;
+ bool matches(OptSpecifier ID) const;
/// accept - Potentially accept the current argument, returning a
/// new Arg instance, or 0 if the option does not accept this
/// by the driver.
class OptionGroup : public Option {
public:
- OptionGroup(unsigned ID, const char *Name, const OptionGroup *Group);
+ OptionGroup(OptSpecifier ID, const char *Name, const OptionGroup *Group);
virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
class FlagOption : public Option {
public:
- FlagOption(unsigned ID, const char *Name, const OptionGroup *Group,
+ FlagOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
const Option *Alias);
virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
class JoinedOption : public Option {
public:
- JoinedOption(unsigned ID, const char *Name, const OptionGroup *Group,
+ JoinedOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
const Option *Alias);
virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
class SeparateOption : public Option {
public:
- SeparateOption(unsigned ID, const char *Name, const OptionGroup *Group,
- const Option *Alias);
+ SeparateOption(OptSpecifier ID, const char *Name,
+ const OptionGroup *Group, const Option *Alias);
virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
class CommaJoinedOption : public Option {
public:
- CommaJoinedOption(unsigned ID, const char *Name,
+ CommaJoinedOption(OptSpecifier ID, const char *Name,
const OptionGroup *Group, const Option *Alias);
virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
unsigned NumArgs;
public:
- MultiArgOption(unsigned ID, const char *Name, const OptionGroup *Group,
+ MultiArgOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
const Option *Alias, unsigned NumArgs);
unsigned getNumArgs() const { return NumArgs; }
/// prefixes its (non-empty) value, or is follwed by a value.
class JoinedOrSeparateOption : public Option {
public:
- JoinedOrSeparateOption(unsigned ID, const char *Name,
+ JoinedOrSeparateOption(OptSpecifier ID, const char *Name,
const OptionGroup *Group, const Option *Alias);
virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
/// value and is followed by another value.
class JoinedAndSeparateOption : public Option {
public:
- JoinedAndSeparateOption(unsigned ID, const char *Name,
+ JoinedAndSeparateOption(OptSpecifier ID, const char *Name,
const OptionGroup *Group, const Option *Alias);
virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
Args.push_back(A);
}
-Arg *ArgList::getLastArgNoClaim(options::ID Id) const {
+Arg *ArgList::getLastArgNoClaim(OptSpecifier Id) const {
// FIXME: Make search efficient?
for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
if ((*it)->getOption().matches(Id))
return 0;
}
-Arg *ArgList::getLastArg(options::ID Id) const {
+Arg *ArgList::getLastArg(OptSpecifier Id) const {
Arg *A = getLastArgNoClaim(Id);
if (A)
A->claim();
return A;
}
-Arg *ArgList::getLastArg(options::ID Id0, options::ID Id1) const {
+Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1) const {
Arg *Res, *A0 = getLastArgNoClaim(Id0), *A1 = getLastArgNoClaim(Id1);
if (A0 && A1)
return Res;
}
-Arg *ArgList::getLastArg(options::ID Id0, options::ID Id1,
- options::ID Id2) const {
+Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
+ OptSpecifier Id2) const {
Arg *Res = 0;
Arg *A0 = getLastArgNoClaim(Id0);
Arg *A1 = getLastArgNoClaim(Id1);
return Res;
}
-bool ArgList::hasFlag(options::ID Pos, options::ID Neg, bool Default) const {
+bool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const {
if (Arg *A = getLastArg(Pos, Neg))
return A->getOption().matches(Pos);
return Default;
}
-void ArgList::AddLastArg(ArgStringList &Output, options::ID Id) const {
+void ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id) const {
if (Arg *A = getLastArg(Id)) {
A->claim();
A->render(*this, Output);
}
}
-void ArgList::AddAllArgs(ArgStringList &Output, options::ID Id0) const {
+void ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0) const {
// FIXME: Make fast.
for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
const Arg *A = *it;
}
}
-void ArgList::AddAllArgs(ArgStringList &Output, options::ID Id0,
- options::ID Id1) const {
+void ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
+ OptSpecifier Id1) const {
// FIXME: Make fast.
for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
const Arg *A = *it;
}
}
-void ArgList::AddAllArgs(ArgStringList &Output, options::ID Id0,
- options::ID Id1, options::ID Id2) const {
+void ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
+ OptSpecifier Id1, OptSpecifier Id2) const {
// FIXME: Make fast.
for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
const Arg *A = *it;
}
}
-void ArgList::AddAllArgValues(ArgStringList &Output, options::ID Id0) const {
+void ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0) const {
// FIXME: Make fast.
for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
const Arg *A = *it;
}
}
-void ArgList::AddAllArgValues(ArgStringList &Output, options::ID Id0,
- options::ID Id1) const {
+void ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0,
+ OptSpecifier Id1) const {
// FIXME: Make fast.
for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
const Arg *A = *it;
}
}
-void ArgList::AddAllArgsTranslated(ArgStringList &Output, options::ID Id0,
+void ArgList::AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0,
const char *Translation,
bool Joined) const {
// FIXME: Make fast.
}
}
-void ArgList::ClaimAllArgs(options::ID Id0) const {
+void ArgList::ClaimAllArgs(OptSpecifier Id0) const {
// FIXME: Make fast.
for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
const Arg *A = *it;
//
+OptSpecifier::OptSpecifier(const Option *Opt) : ID(Opt->getID()) {}
+
+//
+
OptTable::OptTable(const Info *_OptionInfos, unsigned _NumOptionInfos)
: OptionInfos(_OptionInfos), NumOptionInfos(_NumOptionInfos),
Options(new Option*[NumOptionInfos]),
#include <algorithm>
using namespace clang::driver;
-Option::Option(OptionClass _Kind, unsigned _ID, const char *_Name,
+Option::Option(OptionClass _Kind, OptSpecifier _ID, const char *_Name,
const OptionGroup *_Group, const Option *_Alias)
- : Kind(_Kind), ID(_ID), Name(_Name), Group(_Group), Alias(_Alias),
+ : Kind(_Kind), ID(_ID.getID()), Name(_Name), Group(_Group), Alias(_Alias),
Unsupported(false), LinkerInput(false), NoOptAsInput(false),
ForceSeparateRender(false), ForceJoinedRender(false),
DriverOption(false), NoArgumentUnused(false) {
llvm::errs() << ">\n";
}
-bool Option::matches(const Option *Opt) const {
+bool Option::matches(OptSpecifier Opt) const {
// Aliases are never considered in matching, look through them.
if (Alias)
return Alias->matches(Opt);
- if (this == Opt)
+ // Check exact match.
+ if (ID == Opt)
return true;
if (Group)
return false;
}
-bool Option::matches(unsigned Id) const {
- // Aliases are never considered in matching, look through them.
- if (Alias)
- return Alias->matches(Id);
-
- if (ID == Id)
- return true;
-
- if (Group)
- return Group->matches(Id);
- return false;
-}
-
-OptionGroup::OptionGroup(unsigned ID, const char *Name,
+OptionGroup::OptionGroup(OptSpecifier ID, const char *Name,
const OptionGroup *Group)
: Option(Option::GroupClass, ID, Name, Group, 0) {
}
return 0;
}
-FlagOption::FlagOption(unsigned ID, const char *Name,
+FlagOption::FlagOption(OptSpecifier ID, const char *Name,
const OptionGroup *Group, const Option *Alias)
: Option(Option::FlagClass, ID, Name, Group, Alias) {
}
return new FlagArg(this, Index++);
}
-JoinedOption::JoinedOption(unsigned ID, const char *Name,
+JoinedOption::JoinedOption(OptSpecifier ID, const char *Name,
const OptionGroup *Group, const Option *Alias)
: Option(Option::JoinedClass, ID, Name, Group, Alias) {
}
return new JoinedArg(this, Index++);
}
-CommaJoinedOption::CommaJoinedOption(unsigned ID, const char *Name,
+CommaJoinedOption::CommaJoinedOption(OptSpecifier ID, const char *Name,
const OptionGroup *Group,
const Option *Alias)
: Option(Option::CommaJoinedClass, ID, Name, Group, Alias) {
return new CommaJoinedArg(this, Index++, Suffix);
}
-SeparateOption::SeparateOption(unsigned ID, const char *Name,
+SeparateOption::SeparateOption(OptSpecifier ID, const char *Name,
const OptionGroup *Group, const Option *Alias)
: Option(Option::SeparateClass, ID, Name, Group, Alias) {
}
return new SeparateArg(this, Index - 2, 1);
}
-MultiArgOption::MultiArgOption(unsigned ID, const char *Name,
+MultiArgOption::MultiArgOption(OptSpecifier ID, const char *Name,
const OptionGroup *Group, const Option *Alias,
unsigned _NumArgs)
: Option(Option::MultiArgClass, ID, Name, Group, Alias), NumArgs(_NumArgs) {
return new SeparateArg(this, Index - 1 - NumArgs, NumArgs);
}
-JoinedOrSeparateOption::JoinedOrSeparateOption(unsigned ID, const char *Name,
+JoinedOrSeparateOption::JoinedOrSeparateOption(OptSpecifier ID, const char *Name,
const OptionGroup *Group,
const Option *Alias)
: Option(Option::JoinedOrSeparateClass, ID, Name, Group, Alias) {
return new SeparateArg(this, Index - 2, 1);
}
-JoinedAndSeparateOption::JoinedAndSeparateOption(unsigned ID,
+JoinedAndSeparateOption::JoinedAndSeparateOption(OptSpecifier ID,
const char *Name,
const OptionGroup *Group,
const Option *Alias)
// Sob. These is strictly gcc compatible for the time being. Apple
// gcc translates options twice, which means that self-expanding
// options add duplicates.
- switch ((options::ID) A->getOption().getId()) {
+ switch ((options::ID) A->getOption().getID()) {
default:
DAL->append(A);
break;