diff --git a/lib/Driver/OptTable.cpp b/lib/Driver/OptTable.cpp
index 335d772..070c12e 100644
--- a/lib/Driver/OptTable.cpp
+++ b/lib/Driver/OptTable.cpp
@@ -26,6 +26,11 @@
 };
 
 static Info OptionInfos[] = {
+  // The InputOption info
+  { Option::InputClass, "<input>", 0, 0, "", 0 },
+  // The UnknownOption info
+  { Option::UnknownClass, "<unknown>", 0, 0, "", 0 },
+  
 #define OPTION(ID, KIND, NAME, GROUP, ALIAS, FLAGS, PARAM)      \
   { Option::KIND##Class, NAME, GROUP, ALIAS, FLAGS, PARAM },
 #include "clang/Driver/Options.def"
@@ -55,7 +60,7 @@
 }
 
 const Option *OptTable::getOption(options::ID id) const {
-  if (id == 0)
+  if (id == NotOption)
     return 0;
 
   assert((unsigned) (id - 1) < numOptions && "Invalid ID.");
@@ -75,24 +80,26 @@
 
   Option *Opt = 0;
   switch (info.Kind) {
-  default:
-    assert(0 && "Invalid option kind.");
+  case Option::InputClass:
+    Opt = new InputOption(); break;
+  case Option::UnknownClass:
+    Opt = new UnknownOption(); break;
   case Option::GroupClass:
-    Opt = new OptionGroup(info.Name, Group); break;
+    Opt = new OptionGroup(id, info.Name, Group); break;
   case Option::FlagClass:
-    Opt = new FlagOption(info.Name, Group, Alias); break;
+    Opt = new FlagOption(id, info.Name, Group, Alias); break;
   case Option::JoinedClass:
-    Opt = new JoinedOption(info.Name, Group, Alias); break;
+    Opt = new JoinedOption(id, info.Name, Group, Alias); break;
   case Option::SeparateClass:
-    Opt = new SeparateOption(info.Name, Group, Alias); break;
+    Opt = new SeparateOption(id, info.Name, Group, Alias); break;
   case Option::CommaJoinedClass:
-    Opt = new CommaJoinedOption(info.Name, Group, Alias); break;
+    Opt = new CommaJoinedOption(id, info.Name, Group, Alias); break;
   case Option::MultiArgClass:
-    Opt = new MultiArgOption(info.Name, Group, Alias, info.Param); break;
+    Opt = new MultiArgOption(id, info.Name, Group, Alias, info.Param); break;
   case Option::JoinedOrSeparateClass:
-    Opt = new JoinedOrSeparateOption(info.Name, Group, Alias); break;
+    Opt = new JoinedOrSeparateOption(id, info.Name, Group, Alias); break;
   case Option::JoinedAndSeparateClass:
-    Opt = new JoinedAndSeparateOption(info.Name, Group, Alias); break;
+    Opt = new JoinedAndSeparateOption(id, info.Name, Group, Alias); break;
   }
 
   for (const char *s = info.Flags; *s; ++s) {
diff --git a/lib/Driver/Option.cpp b/lib/Driver/Option.cpp
index 368f004..583650f 100644
--- a/lib/Driver/Option.cpp
+++ b/lib/Driver/Option.cpp
@@ -13,9 +13,9 @@
 using namespace clang;
 using namespace clang::driver;
 
-Option::Option(OptionClass _Kind, const char *_Name,
+Option::Option(OptionClass _Kind, options::ID _ID, const char *_Name,
                const OptionGroup *_Group, const Option *_Alias) 
-  : Kind(_Kind), Name(_Name), Group(_Group), Alias(_Alias),
+  : Kind(_Kind), ID(_ID), Name(_Name), Group(_Group), Alias(_Alias),
     Unsupported(false), LinkerInput(false), NoOptAsInput(false),
     ForceSeparateRender(false), ForceJoinedRender(false)
 {
@@ -82,8 +82,9 @@
   return false;
 }
 
-OptionGroup::OptionGroup(const char *Name, const OptionGroup *Group)
-  : Option(Option::GroupClass, Name, Group, 0) {
+OptionGroup::OptionGroup(options::ID ID, const char *Name, 
+                         const OptionGroup *Group)
+  : Option(Option::GroupClass, ID, Name, Group, 0) {
 }
 
 Arg *OptionGroup::accept(const ArgList &Args, unsigned &Index) const {
@@ -92,7 +93,7 @@
 }
 
 InputOption::InputOption()
-  : Option(Option::InputClass, "<input>", 0, 0) {
+  : Option(Option::InputClass, options::InputOpt, "<input>", 0, 0) {
 }
 
 Arg *InputOption::accept(const ArgList &Args, unsigned &Index) const {
@@ -101,7 +102,7 @@
 }
 
 UnknownOption::UnknownOption()
-  : Option(Option::UnknownClass, "<unknown>", 0, 0) {
+  : Option(Option::UnknownClass, options::UnknownOpt, "<unknown>", 0, 0) {
 }
 
 Arg *UnknownOption::accept(const ArgList &Args, unsigned &Index) const {
@@ -109,9 +110,9 @@
   return 0;
 }
 
-FlagOption::FlagOption(const char *Name, const OptionGroup *Group, 
-                       const Option *Alias)
-  : Option(Option::FlagClass, Name, Group, Alias) {
+FlagOption::FlagOption(options::ID ID, const char *Name, 
+                       const OptionGroup *Group, const Option *Alias)
+  : Option(Option::FlagClass, ID, Name, Group, Alias) {
 }
 
 Arg *FlagOption::accept(const ArgList &Args, unsigned &Index) const {
@@ -119,9 +120,9 @@
   return 0;
 }
 
-JoinedOption::JoinedOption(const char *Name, const OptionGroup *Group, 
-                           const Option *Alias)
-  : Option(Option::JoinedClass, Name, Group, Alias) {
+JoinedOption::JoinedOption(options::ID ID, const char *Name, 
+                           const OptionGroup *Group, const Option *Alias)
+  : Option(Option::JoinedClass, ID, Name, Group, Alias) {
 }
 
 Arg *JoinedOption::accept(const ArgList &Args, unsigned &Index) const {
@@ -129,9 +130,10 @@
   return 0;
 }
 
-CommaJoinedOption::CommaJoinedOption(const char *Name, const OptionGroup *Group, 
+CommaJoinedOption::CommaJoinedOption(options::ID ID, const char *Name, 
+                                     const OptionGroup *Group, 
                                      const Option *Alias)
-  : Option(Option::CommaJoinedClass, Name, Group, Alias) {
+  : Option(Option::CommaJoinedClass, ID, Name, Group, Alias) {
 }
 
 Arg *CommaJoinedOption::accept(const ArgList &Args, unsigned &Index) const {
@@ -139,9 +141,9 @@
   return 0;
 }
 
-SeparateOption::SeparateOption(const char *Name, const OptionGroup *Group, 
-                               const Option *Alias)
-  : Option(Option::SeparateClass, Name, Group, Alias) {
+SeparateOption::SeparateOption(options::ID ID, const char *Name, 
+                               const OptionGroup *Group, const Option *Alias)
+  : Option(Option::SeparateClass, ID, Name, Group, Alias) {
 }
 
 Arg *SeparateOption::accept(const ArgList &Args, unsigned &Index) const {
@@ -149,9 +151,10 @@
   return 0;
 }
 
-MultiArgOption::MultiArgOption(const char *Name, const OptionGroup *Group, 
-                               const Option *Alias, unsigned _NumArgs)
-  : Option(Option::MultiArgClass, Name, Group, Alias), NumArgs(_NumArgs) {
+MultiArgOption::MultiArgOption(options::ID ID, const char *Name, 
+                               const OptionGroup *Group, const Option *Alias, 
+                               unsigned _NumArgs)
+  : Option(Option::MultiArgClass, ID, Name, Group, Alias), NumArgs(_NumArgs) {
 }
 
 Arg *MultiArgOption::accept(const ArgList &Args, unsigned &Index) const {
@@ -159,10 +162,10 @@
   return 0;
 }
 
-JoinedOrSeparateOption::JoinedOrSeparateOption(const char *Name, 
+JoinedOrSeparateOption::JoinedOrSeparateOption(options::ID ID, const char *Name,
                                                const OptionGroup *Group, 
                                                const Option *Alias)
-  : Option(Option::JoinedOrSeparateClass, Name, Group, Alias) {
+  : Option(Option::JoinedOrSeparateClass, ID, Name, Group, Alias) {
 }
 
 Arg *JoinedOrSeparateOption::accept(const ArgList &Args, unsigned &Index) const {
@@ -170,10 +173,11 @@
   return 0;
 }
 
-JoinedAndSeparateOption::JoinedAndSeparateOption(const char *Name, 
+JoinedAndSeparateOption::JoinedAndSeparateOption(options::ID ID,
+                                                 const char *Name, 
                                                  const OptionGroup *Group, 
                                                  const Option *Alias)
-  : Option(Option::JoinedAndSeparateClass, Name, Group, Alias) {
+  : Option(Option::JoinedAndSeparateClass, ID, Name, Group, Alias) {
 }
 
 Arg *JoinedAndSeparateOption::accept(const ArgList &Args, unsigned &Index) const {
