[Options] make Option a value type.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166347 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Driver/OptTable.cpp b/lib/Driver/OptTable.cpp
index e108106..a1c5ecd 100644
--- a/lib/Driver/OptTable.cpp
+++ b/lib/Driver/OptTable.cpp
@@ -11,6 +11,7 @@
 #include "clang/Driver/Arg.h"
 #include "clang/Driver/ArgList.h"
 #include "clang/Driver/Option.h"
+#include "clang/Driver/Options.h"
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/Support/ErrorHandling.h"
 #include <algorithm>
@@ -78,23 +79,24 @@
 //
 
 OptTable::OptTable(const Info *_OptionInfos, unsigned _NumOptionInfos)
-  : OptionInfos(_OptionInfos), NumOptionInfos(_NumOptionInfos),
-    Options(new Option*[NumOptionInfos]),
-    TheInputOption(0), TheUnknownOption(0), FirstSearchableIndex(0)
+  : OptionInfos(_OptionInfos),
+    NumOptionInfos(_NumOptionInfos),
+    TheInputOptionID(0),
+    TheUnknownOptionID(0),
+    FirstSearchableIndex(0)
 {
   // Explicitly zero initialize the error to work around a bug in array
   // value-initialization on MinGW with gcc 4.3.5.
-  memset(Options, 0, sizeof(*Options) * NumOptionInfos);
 
   // Find start of normal options.
   for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
     unsigned Kind = getInfo(i + 1).Kind;
     if (Kind == Option::InputClass) {
-      assert(!TheInputOption && "Cannot have multiple input options!");
-      TheInputOption = getOption(i + 1);
+      assert(!TheInputOptionID && "Cannot have multiple input options!");
+      TheInputOptionID = getInfo(i + 1).ID;
     } else if (Kind == Option::UnknownClass) {
-      assert(!TheUnknownOption && "Cannot have multiple input options!");
-      TheUnknownOption = getOption(i + 1);
+      assert(!TheUnknownOptionID && "Cannot have multiple unknown options!");
+      TheUnknownOptionID = getInfo(i + 1).ID;
     } else if (Kind != Option::GroupClass) {
       FirstSearchableIndex = i;
       break;
@@ -115,8 +117,8 @@
   // Check that options are in order.
   for (unsigned i = FirstSearchableIndex+1, e = getNumOptions(); i != e; ++i) {
     if (!(getInfo(i) < getInfo(i + 1))) {
-      getOption(i)->dump();
-      getOption(i + 1)->dump();
+      getOption(i).dump();
+      getOption(i + 1).dump();
       llvm_unreachable("Options are not in order!");
     }
   }
@@ -124,26 +126,27 @@
 }
 
 OptTable::~OptTable() {
-  for (unsigned i = 0, e = getNumOptions(); i != e; ++i)
-    delete Options[i];
-  delete[] Options;
+}
+
+const Option OptTable::getOption(OptSpecifier Opt) const {
+  unsigned id = Opt.getID();
+  if (id == 0)
+    return Option(0, 0);
+  assert((unsigned) (id - 1) < getNumOptions() && "Invalid ID.");
+  return Option(&getInfo(id), this);
 }
 
 bool OptTable::isOptionHelpHidden(OptSpecifier id) const {
   return getInfo(id).Flags & options::HelpHidden;
 }
 
-Option *OptTable::CreateOption(unsigned id) const {
-  return new Option(&getInfo(id), this);
-}
-
 Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index) const {
   unsigned Prev = Index;
   const char *Str = Args.getArgString(Index);
 
   // Anything that doesn't start with '-' is an input, as is '-' itself.
   if (Str[0] != '-' || Str[1] == '\0')
-    return new Arg(TheInputOption, Index++, Str);
+    return new Arg(getOption(TheInputOptionID), Index++, Str);
 
   const Info *Start = OptionInfos + FirstSearchableIndex;
   const Info *End = OptionInfos + getNumOptions();
@@ -169,7 +172,7 @@
       break;
 
     // See if this option matches.
-    if (Arg *A = getOption(Start - OptionInfos + 1)->accept(Args, Index))
+    if (Arg *A = getOption(Start - OptionInfos + 1).accept(Args, Index))
       return A;
 
     // Otherwise, see if this argument was missing values.
@@ -177,7 +180,7 @@
       return 0;
   }
 
-  return new Arg(TheUnknownOption, Index++, Str);
+  return new Arg(getOption(TheUnknownOptionID), Index++, Str);
 }
 
 InputArgList *OptTable::ParseArgs(const char* const *ArgBegin,