Driver: Introduce OptSpecifier class for protecting access to an option id.

llvm-svn: 89310
diff --git a/clang/lib/Driver/ArgList.cpp b/clang/lib/Driver/ArgList.cpp
index c6c1ee6..ea75c34 100644
--- a/clang/lib/Driver/ArgList.cpp
+++ b/clang/lib/Driver/ArgList.cpp
@@ -27,7 +27,7 @@
   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))
@@ -35,14 +35,14 @@
   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)
@@ -56,8 +56,8 @@
   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);
@@ -85,20 +85,20 @@
   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;
@@ -109,8 +109,8 @@
   }
 }
 
-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;
@@ -121,8 +121,8 @@
   }
 }
 
-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;
@@ -134,7 +134,7 @@
   }
 }
 
-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;
@@ -146,8 +146,8 @@
   }
 }
 
-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;
@@ -159,7 +159,7 @@
   }
 }
 
-void ArgList::AddAllArgsTranslated(ArgStringList &Output, options::ID Id0,
+void ArgList::AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0,
                                    const char *Translation,
                                    bool Joined) const {
   // FIXME: Make fast.
@@ -180,7 +180,7 @@
   }
 }
 
-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;
diff --git a/clang/lib/Driver/OptTable.cpp b/clang/lib/Driver/OptTable.cpp
index 74937a7..fae7f75 100644
--- a/clang/lib/Driver/OptTable.cpp
+++ b/clang/lib/Driver/OptTable.cpp
@@ -71,6 +71,10 @@
 
 //
 
+OptSpecifier::OptSpecifier(const Option *Opt) : ID(Opt->getID()) {}
+
+//
+
 OptTable::OptTable(const Info *_OptionInfos, unsigned _NumOptionInfos)
   : OptionInfos(_OptionInfos), NumOptionInfos(_NumOptionInfos),
     Options(new Option*[NumOptionInfos]),
diff --git a/clang/lib/Driver/Option.cpp b/clang/lib/Driver/Option.cpp
index 47a0652..89e9999 100644
--- a/clang/lib/Driver/Option.cpp
+++ b/clang/lib/Driver/Option.cpp
@@ -16,9 +16,9 @@
 #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) {
@@ -70,12 +70,13 @@
   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)
@@ -83,20 +84,7 @@
   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) {
 }
@@ -124,7 +112,7 @@
   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) {
 }
@@ -138,7 +126,7 @@
   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) {
 }
@@ -148,7 +136,7 @@
   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) {
@@ -165,7 +153,7 @@
   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) {
 }
@@ -183,7 +171,7 @@
   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) {
@@ -203,7 +191,7 @@
   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) {
@@ -224,7 +212,7 @@
   return new SeparateArg(this, Index - 2, 1);
 }
 
-JoinedAndSeparateOption::JoinedAndSeparateOption(unsigned ID,
+JoinedAndSeparateOption::JoinedAndSeparateOption(OptSpecifier ID,
                                                  const char *Name,
                                                  const OptionGroup *Group,
                                                  const Option *Alias)
diff --git a/clang/lib/Driver/ToolChains.cpp b/clang/lib/Driver/ToolChains.cpp
index 8242d31..a9a2d0f 100644
--- a/clang/lib/Driver/ToolChains.cpp
+++ b/clang/lib/Driver/ToolChains.cpp
@@ -366,7 +366,7 @@
     // 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;