[cfe-commits] r162299 - in /cfe/trunk: include/clang/Driver/OptTable.h include/clang/Driver/Option.h lib/Driver/OptTable.cpp lib/Driver/Option.cpp

Michael J. Spencer bigcheesegs at gmail.com
Tue Aug 21 11:51:17 PDT 2012


Author: mspencer
Date: Tue Aug 21 13:51:17 2012
New Revision: 162299

URL: http://llvm.org/viewvc/llvm-project?rev=162299&view=rev
Log:
Reduce the amount of state in the Option class by relying on the data from OptTable::Info.

Modified:
    cfe/trunk/include/clang/Driver/OptTable.h
    cfe/trunk/include/clang/Driver/Option.h
    cfe/trunk/lib/Driver/OptTable.cpp
    cfe/trunk/lib/Driver/Option.cpp

Modified: cfe/trunk/include/clang/Driver/OptTable.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/OptTable.h?rev=162299&r1=162298&r2=162299&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/OptTable.h (original)
+++ cfe/trunk/include/clang/Driver/OptTable.h Tue Aug 21 13:51:17 2012
@@ -15,21 +15,6 @@
 
 namespace clang {
 namespace driver {
-namespace options {
-  enum DriverFlag {
-    DriverOption     = (1 << 0),
-    HelpHidden       = (1 << 1),
-    LinkerInput      = (1 << 2),
-    NoArgumentUnused = (1 << 3),
-    NoForward        = (1 << 4),
-    RenderAsInput    = (1 << 5),
-    RenderJoined     = (1 << 6),
-    RenderSeparate   = (1 << 7),
-    Unsupported      = (1 << 8),
-    CC1Option        = (1 << 9)
-  };
-}
-
   class Arg;
   class ArgList;
   class InputArgList;
@@ -123,9 +108,7 @@
     }
 
     /// \brief Should the help for the given option be hidden by default.
-    bool isOptionHelpHidden(OptSpecifier id) const {
-      return getInfo(id).Flags & options::HelpHidden;
-    }
+    bool isOptionHelpHidden(OptSpecifier id) const;
 
     /// \brief Get the help text to use to describe this option.
     const char *getOptionHelpText(OptSpecifier id) const {

Modified: cfe/trunk/include/clang/Driver/Option.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Option.h?rev=162299&r1=162298&r2=162299&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/Option.h (original)
+++ cfe/trunk/include/clang/Driver/Option.h Tue Aug 21 13:51:17 2012
@@ -10,8 +10,9 @@
 #ifndef CLANG_DRIVER_OPTION_H_
 #define CLANG_DRIVER_OPTION_H_
 
-#include "clang/Driver/OptSpecifier.h"
+#include "clang/Driver/OptTable.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/Support/ErrorHandling.h"
 #include "clang/Basic/LLVM.h"
 
 namespace clang {
@@ -19,6 +20,21 @@
   class Arg;
   class ArgList;
 
+namespace options {
+  enum DriverFlag {
+    DriverOption     = (1 << 0),
+    HelpHidden       = (1 << 1),
+    LinkerInput      = (1 << 2),
+    NoArgumentUnused = (1 << 3),
+    NoForward        = (1 << 4),
+    RenderAsInput    = (1 << 5),
+    RenderJoined     = (1 << 6),
+    RenderSeparate   = (1 << 7),
+    Unsupported      = (1 << 8),
+    CC1Option        = (1 << 9)
+  };
+}
+
   /// Option - Abstract representation for a single form of driver
   /// argument.
   ///
@@ -53,87 +69,72 @@
     };
 
   private:
-    OptionClass Kind;
+    const OptTable::Info *Info;
 
     /// The option ID.
     OptSpecifier ID;
 
-    /// The option name.
-    StringRef Name;
-
     /// Group this option is a member of, if any.
     const Option *Group;
 
     /// Option that this is an alias for, if any.
     const Option *Alias;
 
-    unsigned NumArgs;
-
-    /// Unsupported options will be rejected.
-    bool Unsupported : 1;
-
-    /// Treat this option like a linker input?
-    bool LinkerInput : 1;
-
-    /// When rendering as an input, don't render the option.
-
-    // FIXME: We should ditch the render/renderAsInput distinction.
-    bool NoOptAsInput : 1;
-
-    /// The style to using when rendering arguments parsed by this option.
-    unsigned RenderStyle : 2;
-
-    /// This option is only consumed by the driver.
-    bool DriverOption : 1;
-
-    /// This option should not report argument unused errors.
-    bool NoArgumentUnused : 1;
-
-    /// This option should not be implicitly forwarded.
-    bool NoForward : 1;
-
-    /// CC1Option - This option should be accepted by clang -cc1.
-    bool CC1Option : 1;
-
   public:
-    Option(OptionClass Kind, OptSpecifier ID, const char *Name,
-           const Option *Group, const Option *Alias, unsigned Args);
+    Option(const OptTable::Info *Info, OptSpecifier ID,
+           const Option *Group, const Option *Alias);
     ~Option();
 
     unsigned getID() const { return ID.getID(); }
-    OptionClass getKind() const { return Kind; }
-    StringRef getName() const { return Name; }
+    OptionClass getKind() const { return OptionClass(Info->Kind); }
+    StringRef getName() const { return Info->Name; }
     const Option *getGroup() const { return Group; }
     const Option *getAlias() const { return Alias; }
 
-    bool isUnsupported() const { return Unsupported; }
-    void setUnsupported(bool Value) { Unsupported = Value; }
+    unsigned getNumArgs() const { return Info->Param; }
+
+    bool isUnsupported() const { return Info->Flags & options::Unsupported; }
 
-    bool isLinkerInput() const { return LinkerInput; }
-    void setLinkerInput(bool Value) { LinkerInput = Value; }
+    bool isLinkerInput() const { return Info->Flags & options::LinkerInput; }
 
-    bool hasNoOptAsInput() const { return NoOptAsInput; }
-    void setNoOptAsInput(bool Value) { NoOptAsInput = Value; }
+    bool hasNoOptAsInput() const { return Info->Flags & options::RenderAsInput;}
 
     RenderStyleKind getRenderStyle() const {
-      return RenderStyleKind(RenderStyle);
+      if (Info->Flags & options::RenderJoined)
+        return RenderJoinedStyle;
+      if (Info->Flags & options::RenderSeparate)
+        return RenderSeparateStyle;
+      switch (getKind()) {
+      case GroupClass:
+      case InputClass:
+      case UnknownClass:
+        return RenderValuesStyle;
+      case JoinedClass:
+      case JoinedAndSeparateClass:
+        return RenderJoinedStyle;
+      case CommaJoinedClass:
+        return RenderCommaJoinedStyle;
+      case FlagClass:
+      case SeparateClass:
+      case MultiArgClass:
+      case JoinedOrSeparateClass:
+        return RenderSeparateStyle;
+      }
+      llvm_unreachable("Unexpected kind!");
     }
-    void setRenderStyle(RenderStyleKind Value) { RenderStyle = Value; }
 
-    bool isDriverOption() const { return DriverOption; }
-    void setDriverOption(bool Value) { DriverOption = Value; }
+    bool isDriverOption() const { return Info->Flags & options::DriverOption; }
 
-    bool hasNoArgumentUnused() const { return NoArgumentUnused; }
-    void setNoArgumentUnused(bool Value) { NoArgumentUnused = Value; }
+    bool hasNoArgumentUnused() const {
+      return Info->Flags & options::NoArgumentUnused;
+    }
 
-    bool hasNoForward() const { return NoForward; }
-    void setNoForward(bool Value) { NoForward = Value; }
+    bool hasNoForward() const { return Info->Flags & options::NoForward; }
 
-    bool isCC1Option() const { return CC1Option; }
-    void setIsCC1Option(bool Value) { CC1Option = Value; }
+    bool isCC1Option() const { return Info->Flags & options::CC1Option; }
 
     bool hasForwardToGCC() const {
-      return !NoForward && !DriverOption && !LinkerInput;
+      return !hasNoForward() && !isDriverOption() && !isLinkerInput();
     }
 
     /// getUnaliasedOption - Return the final option this option

Modified: cfe/trunk/lib/Driver/OptTable.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/OptTable.cpp?rev=162299&r1=162298&r2=162299&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/OptTable.cpp (original)
+++ cfe/trunk/lib/Driver/OptTable.cpp Tue Aug 21 13:51:17 2012
@@ -129,38 +129,16 @@
   delete[] Options;
 }
 
+bool OptTable::isOptionHelpHidden(OptSpecifier id) const {
+  return getInfo(id).Flags & options::HelpHidden;
+}
+
 Option *OptTable::CreateOption(unsigned id) const {
   const Info &info = getInfo(id);
   const Option *Group = getOption(info.GroupID);
   const Option *Alias = getOption(info.AliasID);
 
-  Option *Opt = new Option(Option::OptionClass(info.Kind),
-                           id, info.Name, Group, Alias, info.Param);
-
-  if (info.Flags & DriverOption)
-    Opt->setDriverOption(true);
-  if (info.Flags & LinkerInput)
-    Opt->setLinkerInput(true);
-  if (info.Flags & NoArgumentUnused)
-    Opt->setNoArgumentUnused(true);
-  if (info.Flags & NoForward)
-    Opt->setNoForward(true);
-  if (info.Flags & RenderAsInput)
-    Opt->setNoOptAsInput(true);
-  if (info.Flags & RenderJoined) {
-    assert((info.Kind == Option::JoinedOrSeparateClass ||
-            info.Kind == Option::SeparateClass) && "Invalid option.");
-    Opt->setRenderStyle(Option::RenderJoinedStyle);
-  }
-  if (info.Flags & RenderSeparate) {
-    assert((info.Kind == Option::JoinedOrSeparateClass ||
-            info.Kind == Option::JoinedClass) && "Invalid option.");
-    Opt->setRenderStyle(Option::RenderSeparateStyle);
-  }
-  if (info.Flags & Unsupported)
-    Opt->setUnsupported(true);
-  if (info.Flags & CC1Option)
-    Opt->setIsCC1Option(true);
+  Option *Opt = new Option(&info, id, Group, Alias);
 
   return Opt;
 }

Modified: cfe/trunk/lib/Driver/Option.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Option.cpp?rev=162299&r1=162298&r2=162299&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Option.cpp (original)
+++ cfe/trunk/lib/Driver/Option.cpp Tue Aug 21 13:51:17 2012
@@ -17,42 +17,15 @@
 #include <algorithm>
 using namespace clang::driver;
 
-Option::Option(OptionClass _Kind, OptSpecifier _ID, const char *_Name,
-               const Option *_Group, const Option *_Alias, unsigned Args)
-  : Kind(_Kind), ID(_ID.getID()), Name(_Name), Group(_Group), Alias(_Alias),
-    NumArgs(Args), Unsupported(false), LinkerInput(false), NoOptAsInput(false),
-    DriverOption(false), NoArgumentUnused(false), NoForward(false) {
+Option::Option(const OptTable::Info *info, OptSpecifier _ID,
+               const Option *_Group, const Option *_Alias)
+  : Info(info), ID(_ID.getID()), Group(_Group), Alias(_Alias) {
 
   // Multi-level aliases are not supported, and alias options cannot
   // have groups. This just simplifies option tracking, it is not an
   // inherent limitation.
   assert((!Alias || (!Alias->Alias && !Group)) &&
          "Multi-level aliases and aliases with groups are unsupported.");
-
-  // Initialize rendering options based on the class.
-  switch (Kind) {
-  case GroupClass:
-  case InputClass:
-  case UnknownClass:
-    RenderStyle = RenderValuesStyle;
-    break;
-
-  case JoinedClass:
-  case JoinedAndSeparateClass:
-    RenderStyle = RenderJoinedStyle;
-    break;
-
-  case CommaJoinedClass:
-    RenderStyle = RenderCommaJoinedStyle;
-    break;
-
-  case FlagClass:
-  case SeparateClass:
-  case MultiArgClass:
-  case JoinedOrSeparateClass:
-    RenderStyle = RenderSeparateStyle;
-    break;
-  }
 }
 
 Option::~Option() {
@@ -60,7 +33,7 @@
 
 void Option::dump() const {
   llvm::errs() << "<";
-  switch (Kind) {
+  switch (getKind()) {
 #define P(N) case N: llvm::errs() << #N; break
     P(GroupClass);
     P(InputClass);
@@ -75,7 +48,7 @@
 #undef P
   }
 
-  llvm::errs() << " Name:\"" << Name << '"';
+  llvm::errs() << " Name:\"" << getName() << '"';
 
   if (Group) {
     llvm::errs() << " Group:";
@@ -87,8 +60,8 @@
     Alias->dump();
   }
 
-  if (Kind == MultiArgClass)
-    llvm::errs() << " NumArgs:" << NumArgs;
+  if (getKind() == MultiArgClass)
+    llvm::errs() << " NumArgs:" << getNumArgs();
 
   llvm::errs() << ">\n";
 }
@@ -108,7 +81,7 @@
 }
 
 Arg *Option::accept(const ArgList &Args, unsigned &Index) const {
-  switch (Kind) {
+  switch (getKind()) {
   case FlagClass:
     if (getName().size() != strlen(Args.getArgString(Index)))
       return 0;
@@ -164,14 +137,14 @@
     if (getName().size() != strlen(Args.getArgString(Index)))
       return 0;
 
-    Index += 1 + NumArgs;
+    Index += 1 + getNumArgs();
     if (Index > Args.getNumInputArgStrings())
       return 0;
 
-    Arg *A = new Arg(getUnaliasedOption(), Index - 1 - NumArgs,
-                      Args.getArgString(Index - NumArgs));
-    for (unsigned i = 1; i != NumArgs; ++i)
-      A->getValues().push_back(Args.getArgString(Index - NumArgs + i));
+    Arg *A = new Arg(getUnaliasedOption(), Index - 1 - getNumArgs(),
+                      Args.getArgString(Index - getNumArgs()));
+    for (unsigned i = 1; i != getNumArgs(); ++i)
+      A->getValues().push_back(Args.getArgString(Index - getNumArgs() + i));
     return A;
   }
   case JoinedOrSeparateClass: {





More information about the cfe-commits mailing list