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

David Blaikie dblaikie at gmail.com
Mon Aug 20 15:24:49 PDT 2012


On Mon, Aug 20, 2012 at 2:41 PM, Michael J. Spencer
<bigcheesegs at gmail.com> wrote:
> Author: mspencer
> Date: Mon Aug 20 16:41:17 2012
> New Revision: 162231
>
> URL: http://llvm.org/viewvc/llvm-project?rev=162231&view=rev
> Log:
> Make Option non virtual.
>
> Modified:
>     cfe/trunk/include/clang/Driver/Option.h
>     cfe/trunk/lib/Driver/Driver.cpp
>     cfe/trunk/lib/Driver/OptTable.cpp
>     cfe/trunk/lib/Driver/Option.cpp
>
> Modified: cfe/trunk/include/clang/Driver/Option.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Option.h?rev=162231&r1=162230&r2=162231&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/Option.h (original)
> +++ cfe/trunk/include/clang/Driver/Option.h Mon Aug 20 16:41:17 2012
> @@ -18,7 +18,6 @@
>  namespace driver {
>    class Arg;
>    class ArgList;
> -  class OptionGroup;
>
>    /// Option - Abstract representation for a single form of driver
>    /// argument.
> @@ -63,11 +62,13 @@
>      StringRef Name;
>
>      /// Group this option is a member of, if any.
> -    const OptionGroup *Group;
> +    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;
>
> @@ -94,16 +95,15 @@
>      /// CC1Option - This option should be accepted by clang -cc1.
>      bool CC1Option : 1;
>
> -  protected:
> -    Option(OptionClass Kind, OptSpecifier ID, const char *Name,
> -           const OptionGroup *Group, const Option *Alias);
>    public:
> -    virtual ~Option();
> +    Option(OptionClass Kind, OptSpecifier ID, const char *Name,
> +           const Option *Group, const Option *Alias, unsigned Args);
> +    ~Option();
>
>      unsigned getID() const { return ID.getID(); }
>      OptionClass getKind() const { return Kind; }
>      StringRef getName() const { return Name; }
> -    const OptionGroup *getGroup() const { return Group; }
> +    const Option *getGroup() const { return Group; }
>      const Option *getAlias() const { return Alias; }
>
>      bool isUnsupported() const { return Unsupported; }
> @@ -164,158 +164,9 @@
>      /// If the option accepts the current argument, accept() sets
>      /// Index to the position where argument parsing should resume
>      /// (even if the argument is missing values).
> -    virtual Arg *accept(const ArgList &Args, unsigned &Index) const = 0;
> +    Arg *accept(const ArgList &Args, unsigned &Index) const;
>
>      void dump() const;
> -
> -    static bool classof(const Option *) { return true; }
> -  };
> -
> -  /// OptionGroup - A set of options which are can be handled uniformly
> -  /// by the driver.
> -  class OptionGroup : public Option {
> -  public:
> -    OptionGroup(OptSpecifier ID, const char *Name, const OptionGroup *Group);
> -
> -    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
> -
> -    static bool classof(const Option *O) {
> -      return O->getKind() == Option::GroupClass;
> -    }
> -    static bool classof(const OptionGroup *) { return true; }
> -  };
> -
> -  // Dummy option classes.
> -
> -  /// InputOption - Dummy option class for representing driver inputs.
> -  class InputOption : public Option {
> -  public:
> -    InputOption(OptSpecifier ID);
> -
> -    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
> -
> -    static bool classof(const Option *O) {
> -      return O->getKind() == Option::InputClass;
> -    }
> -    static bool classof(const InputOption *) { return true; }
> -  };
> -
> -  /// UnknownOption - Dummy option class for represent unknown arguments.
> -  class UnknownOption : public Option {
> -  public:
> -    UnknownOption(OptSpecifier ID);
> -
> -    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
> -
> -    static bool classof(const Option *O) {
> -      return O->getKind() == Option::UnknownClass;
> -    }
> -    static bool classof(const UnknownOption *) { return true; }
> -  };
> -
> -  // Normal options.
> -
> -  class FlagOption : public Option {
> -  public:
> -    FlagOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
> -               const Option *Alias);
> -
> -    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
> -
> -    static bool classof(const Option *O) {
> -      return O->getKind() == Option::FlagClass;
> -    }
> -    static bool classof(const FlagOption *) { return true; }
> -  };
> -
> -  class JoinedOption : public Option {
> -  public:
> -    JoinedOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
> -                 const Option *Alias);
> -
> -    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
> -
> -    static bool classof(const Option *O) {
> -      return O->getKind() == Option::JoinedClass;
> -    }
> -    static bool classof(const JoinedOption *) { return true; }
> -  };
> -
> -  class SeparateOption : public Option {
> -  public:
> -    SeparateOption(OptSpecifier ID, const char *Name,
> -                   const OptionGroup *Group, const Option *Alias);
> -
> -    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
> -
> -    static bool classof(const Option *O) {
> -      return O->getKind() == Option::SeparateClass;
> -    }
> -    static bool classof(const SeparateOption *) { return true; }
> -  };
> -
> -  class CommaJoinedOption : public Option {
> -  public:
> -    CommaJoinedOption(OptSpecifier ID, const char *Name,
> -                      const OptionGroup *Group, const Option *Alias);
> -
> -    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
> -
> -    static bool classof(const Option *O) {
> -      return O->getKind() == Option::CommaJoinedClass;
> -    }
> -    static bool classof(const CommaJoinedOption *) { return true; }
> -  };
> -
> -  // FIXME: Fold MultiArgOption into SeparateOption?
> -
> -  /// MultiArgOption - An option which takes multiple arguments (these
> -  /// are always separate arguments).
> -  class MultiArgOption : public Option {
> -    unsigned NumArgs;
> -
> -  public:
> -    MultiArgOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
> -                   const Option *Alias, unsigned NumArgs);
> -
> -    unsigned getNumArgs() const { return NumArgs; }
> -
> -    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
> -
> -    static bool classof(const Option *O) {
> -      return O->getKind() == Option::MultiArgClass;
> -    }
> -    static bool classof(const MultiArgOption *) { return true; }
> -  };
> -
> -  /// JoinedOrSeparateOption - An option which either literally
> -  /// prefixes its (non-empty) value, or is follwed by a value.
> -  class JoinedOrSeparateOption : public Option {
> -  public:
> -    JoinedOrSeparateOption(OptSpecifier ID, const char *Name,
> -                           const OptionGroup *Group, const Option *Alias);
> -
> -    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
> -
> -    static bool classof(const Option *O) {
> -      return O->getKind() == Option::JoinedOrSeparateClass;
> -    }
> -    static bool classof(const JoinedOrSeparateOption *) { return true; }
> -  };
> -
> -  /// JoinedAndSeparateOption - An option which literally prefixes its
> -  /// value and is followed by another value.
> -  class JoinedAndSeparateOption : public Option {
> -  public:
> -    JoinedAndSeparateOption(OptSpecifier ID, const char *Name,
> -                            const OptionGroup *Group, const Option *Alias);
> -
> -    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
> -
> -    static bool classof(const Option *O) {
> -      return O->getKind() == Option::JoinedAndSeparateClass;
> -    }
> -    static bool classof(const JoinedAndSeparateOption *) { return true; }
>    };
>
>  } // end namespace driver
>
> Modified: cfe/trunk/lib/Driver/Driver.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=162231&r1=162230&r2=162231&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/Driver.cpp (original)
> +++ cfe/trunk/lib/Driver/Driver.cpp Mon Aug 20 16:41:17 2012
> @@ -981,7 +981,7 @@
>         it != ie; ++it) {
>      Arg *A = *it;
>
> -    if (isa<InputOption>(A->getOption())) {
> +    if (A->getOption().getKind() == Option::InputClass) {
>        const char *Value = A->getValue(Args);
>        types::ID Ty = types::TY_INVALID;
>
> @@ -1337,7 +1337,7 @@
>        // Suppress the warning automatically if this is just a flag, and it is an
>        // instance of an argument we already claimed.
>        const Option &Opt = A->getOption();
> -      if (isa<FlagOption>(Opt)) {
> +      if (Opt.getKind() == Option::FlagClass) {
>          bool DuplicateClaimed = false;
>
>          for (arg_iterator it = C.getArgs().filtered_begin(&Opt),
>
> Modified: cfe/trunk/lib/Driver/OptTable.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/OptTable.cpp?rev=162231&r1=162230&r2=162231&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/OptTable.cpp (original)
> +++ cfe/trunk/lib/Driver/OptTable.cpp Mon Aug 20 16:41:17 2012
> @@ -131,33 +131,11 @@
>
>  Option *OptTable::CreateOption(unsigned id) const {
>    const Info &info = getInfo(id);
> -  const OptionGroup *Group =
> -    cast_or_null<OptionGroup>(getOption(info.GroupID));
> +  const Option *Group = getOption(info.GroupID);
>    const Option *Alias = getOption(info.AliasID);
>
> -  Option *Opt = 0;
> -  switch (info.Kind) {
> -  case Option::InputClass:
> -    Opt = new InputOption(id); break;
> -  case Option::UnknownClass:
> -    Opt = new UnknownOption(id); break;
> -  case Option::GroupClass:
> -    Opt = new OptionGroup(id, info.Name, Group); break;
> -  case Option::FlagClass:
> -    Opt = new FlagOption(id, info.Name, Group, Alias); break;
> -  case Option::JoinedClass:
> -    Opt = new JoinedOption(id, info.Name, Group, Alias); break;
> -  case Option::SeparateClass:
> -    Opt = new SeparateOption(id, info.Name, Group, Alias); break;
> -  case Option::CommaJoinedClass:
> -    Opt = new CommaJoinedOption(id, info.Name, Group, Alias); break;
> -  case Option::MultiArgClass:
> -    Opt = new MultiArgOption(id, info.Name, Group, Alias, info.Param); break;
> -  case Option::JoinedOrSeparateClass:
> -    Opt = new JoinedOrSeparateOption(id, info.Name, Group, Alias); break;
> -  case Option::JoinedAndSeparateClass:
> -    Opt = new JoinedAndSeparateOption(id, info.Name, Group, Alias); break;
> -  }
> +  Option *Opt = new Option(Option::OptionClass(info.Kind),
> +                           id, info.Name, Group, Alias, info.Param);
>
>    if (info.Flags & DriverOption)
>      Opt->setDriverOption(true);
>
> Modified: cfe/trunk/lib/Driver/Option.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Option.cpp?rev=162231&r1=162230&r2=162231&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/Option.cpp (original)
> +++ cfe/trunk/lib/Driver/Option.cpp Mon Aug 20 16:41:17 2012
> @@ -18,9 +18,9 @@
>  using namespace clang::driver;
>
>  Option::Option(OptionClass _Kind, OptSpecifier _ID, const char *_Name,
> -               const OptionGroup *_Group, const Option *_Alias)
> +               const Option *_Group, const Option *_Alias, unsigned Args)
>    : Kind(_Kind), ID(_ID.getID()), Name(_Name), Group(_Group), Alias(_Alias),
> -    Unsupported(false), LinkerInput(false), NoOptAsInput(false),
> +    NumArgs(Args), Unsupported(false), LinkerInput(false), NoOptAsInput(false),
>      DriverOption(false), NoArgumentUnused(false), NoForward(false) {
>
>    // Multi-level aliases are not supported, and alias options cannot
> @@ -87,8 +87,8 @@
>      Alias->dump();
>    }
>
> -  if (const MultiArgOption *MOA = dyn_cast<MultiArgOption>(this))
> -    llvm::errs() << " NumArgs:" << MOA->getNumArgs();
> +  if (Kind == MultiArgClass)
> +    llvm::errs() << " NumArgs:" << NumArgs;
>
>    llvm::errs() << ">\n";
>  }
> @@ -107,174 +107,98 @@
>    return false;
>  }
>
> -OptionGroup::OptionGroup(OptSpecifier ID, const char *Name,
> -                         const OptionGroup *Group)
> -  : Option(Option::GroupClass, ID, Name, Group, 0) {
> -}
> -
> -Arg *OptionGroup::accept(const ArgList &Args, unsigned &Index) const {
> -  llvm_unreachable("accept() should never be called on an OptionGroup");
> -}
> -
> -InputOption::InputOption(OptSpecifier ID)
> -  : Option(Option::InputClass, ID, "<input>", 0, 0) {
> -}
> -
> -Arg *InputOption::accept(const ArgList &Args, unsigned &Index) const {
> -  llvm_unreachable("accept() should never be called on an InputOption");
> -}
> -
> -UnknownOption::UnknownOption(OptSpecifier ID)
> -  : Option(Option::UnknownClass, ID, "<unknown>", 0, 0) {
> -}
> -
> -Arg *UnknownOption::accept(const ArgList &Args, unsigned &Index) const {
> -  llvm_unreachable("accept() should never be called on an UnknownOption");
> -}
> -
> -FlagOption::FlagOption(OptSpecifier 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 {
> -  // Matches iff this is an exact match.
> -  // FIXME: Avoid strlen.
> -  if (getName().size() != strlen(Args.getArgString(Index)))
> -    return 0;
> -
> -  return new Arg(getUnaliasedOption(), Index++);
> -}
> -
> -JoinedOption::JoinedOption(OptSpecifier ID, const char *Name,
> -                           const OptionGroup *Group, const Option *Alias)
> -  : Option(Option::JoinedClass, ID, Name, Group, Alias) {
> -}
> +Arg *Option::accept(const ArgList &Args, unsigned &Index) const {
> +  switch (Kind) {
> +  case FlagClass:
> +    if (getName().size() != strlen(Args.getArgString(Index)))
> +      return 0;
>
> -Arg *JoinedOption::accept(const ArgList &Args, unsigned &Index) const {
> -  // Always matches.
> -  const char *Value = Args.getArgString(Index) + getName().size();
> -  return new Arg(getUnaliasedOption(), Index++, Value);
> -}
> +    return new Arg(getUnaliasedOption(), Index++);
> +  case JoinedClass: {
> +    const char *Value = Args.getArgString(Index) + getName().size();
> +    return new Arg(getUnaliasedOption(), Index++, Value);
> +  }
> +  case CommaJoinedClass: {
> +    // Always matches.
> +    const char *Str = Args.getArgString(Index) + getName().size();
> +    Arg *A = new Arg(getUnaliasedOption(), Index++);
> +
> +    // Parse out the comma separated values.
> +    const char *Prev = Str;
> +    for (;; ++Str) {
> +      char c = *Str;
> +
> +      if (!c || c == ',') {
> +        if (Prev != Str) {
> +          char *Value = new char[Str - Prev + 1];
> +          memcpy(Value, Prev, Str - Prev);
> +          Value[Str - Prev] = '\0';
> +          A->getValues().push_back(Value);
> +        }
>
> -CommaJoinedOption::CommaJoinedOption(OptSpecifier ID, const char *Name,
> -                                     const OptionGroup *Group,
> -                                     const Option *Alias)
> -  : Option(Option::CommaJoinedClass, ID, Name, Group, Alias) {
> -}
> +        if (!c)
> +          break;
>
> -Arg *CommaJoinedOption::accept(const ArgList &Args,
> -                               unsigned &Index) const {
> -  // Always matches.
> -  const char *Str = Args.getArgString(Index) + getName().size();
> -  Arg *A = new Arg(getUnaliasedOption(), Index++);
> -
> -  // Parse out the comma separated values.
> -  const char *Prev = Str;
> -  for (;; ++Str) {
> -    char c = *Str;
> -
> -    if (!c || c == ',') {
> -      if (Prev != Str) {
> -        char *Value = new char[Str - Prev + 1];
> -        memcpy(Value, Prev, Str - Prev);
> -        Value[Str - Prev] = '\0';
> -        A->getValues().push_back(Value);
> +        Prev = Str + 1;
>        }
> -
> -      if (!c)
> -        break;
> -
> -      Prev = Str + 1;
>      }
> -  }
> -  A->setOwnsValues(true);
> -
> -  return A;
> -}
> -
> -SeparateOption::SeparateOption(OptSpecifier 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 {
> -  // Matches iff this is an exact match.
> -  // FIXME: Avoid strlen.
> -  if (getName().size() != strlen(Args.getArgString(Index)))
> -    return 0;
> -
> -  Index += 2;
> -  if (Index > Args.getNumInputArgStrings())
> -    return 0;
> -
> -  return new Arg(getUnaliasedOption(), Index - 2, Args.getArgString(Index - 1));
> -}
> -
> -MultiArgOption::MultiArgOption(OptSpecifier ID, const char *Name,
> -                               const OptionGroup *Group, const Option *Alias,
> -                               unsigned _NumArgs)
> -  : Option(Option::MultiArgClass, ID, Name, Group, Alias), NumArgs(_NumArgs) {
> -  assert(NumArgs > 1  && "Invalid MultiArgOption!");
> -}
> -
> -Arg *MultiArgOption::accept(const ArgList &Args, unsigned &Index) const {
> -  // Matches iff this is an exact match.
> -  // FIXME: Avoid strlen.
> -  if (getName().size() != strlen(Args.getArgString(Index)))
> -    return 0;
> -
> -  Index += 1 + NumArgs;
> -  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));
> -  return A;
> -}
> +    A->setOwnsValues(true);
>
> -JoinedOrSeparateOption::JoinedOrSeparateOption(OptSpecifier ID,
> -                                               const char *Name,
> -                                               const OptionGroup *Group,
> -                                               const Option *Alias)
> -  : Option(Option::JoinedOrSeparateClass, ID, Name, Group, Alias) {
> -}
> -
> -Arg *JoinedOrSeparateOption::accept(const ArgList &Args,
> -                                    unsigned &Index) const {
> -  // If this is not an exact match, it is a joined arg.
> -  // FIXME: Avoid strlen.
> -  if (getName().size() != strlen(Args.getArgString(Index))) {
> -    const char *Value = Args.getArgString(Index) + getName().size();
> -    return new Arg(this, Index++, Value);
> +    return A;
>    }
> +  case SeparateClass:
> +    // Matches iff this is an exact match.
> +    // FIXME: Avoid strlen.
> +    if (getName().size() != strlen(Args.getArgString(Index)))
> +      return 0;
> +
> +    Index += 2;
> +    if (Index > Args.getNumInputArgStrings())
> +      return 0;
> +
> +    return new Arg(getUnaliasedOption(),
> +                   Index - 2, Args.getArgString(Index - 1));
> +  case MultiArgClass: {
> +    // Matches iff this is an exact match.
> +    // FIXME: Avoid strlen.
> +    if (getName().size() != strlen(Args.getArgString(Index)))
> +      return 0;
> +
> +    Index += 1 + NumArgs;
> +    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));
> +    return A;
> +  }
> +  case JoinedOrSeparateClass: {
> +    // If this is not an exact match, it is a joined arg.
> +    // FIXME: Avoid strlen.
> +    if (getName().size() != strlen(Args.getArgString(Index))) {
> +      const char *Value = Args.getArgString(Index) + getName().size();
> +      return new Arg(this, Index++, Value);
> +    }
>
> -  // Otherwise it must be separate.
> -  Index += 2;
> -  if (Index > Args.getNumInputArgStrings())
> -    return 0;
> -
> -  return new Arg(getUnaliasedOption(), Index - 2, Args.getArgString(Index - 1));
> -}
> -
> -JoinedAndSeparateOption::JoinedAndSeparateOption(OptSpecifier ID,
> -                                                 const char *Name,
> -                                                 const OptionGroup *Group,
> -                                                 const Option *Alias)
> -  : Option(Option::JoinedAndSeparateClass, ID, Name, Group, Alias) {
> -}
> +    // Otherwise it must be separate.
> +    Index += 2;
> +    if (Index > Args.getNumInputArgStrings())
> +      return 0;
>
> -Arg *JoinedAndSeparateOption::accept(const ArgList &Args,
> -                                     unsigned &Index) const {
> -  // Always matches.
> -
> -  Index += 2;
> -  if (Index > Args.getNumInputArgStrings())
> -    return 0;
> -
> -  return new Arg(getUnaliasedOption(), Index - 2,
> -                 Args.getArgString(Index-2)+getName().size(),
> -                 Args.getArgString(Index-1));
> +    return new Arg(getUnaliasedOption(),
> +                   Index - 2, Args.getArgString(Index - 1));
> +  }
> +  case JoinedAndSeparateClass:
> +    // Always matches.
> +    Index += 2;
> +    if (Index > Args.getNumInputArgStrings())
> +      return 0;
> +
> +    return new Arg(getUnaliasedOption(), Index - 2,
> +                   Args.getArgString(Index-2)+getName().size(),
> +                   Args.getArgString(Index-1));
> +  }
> +  llvm_unreachable("Invalid option kind!");

Moved this unreachable into a default in the switch in r162236 to
suppress a -Werror build break:

/home/blaikie/local/Development/llvm/src/tools/clang/lib/Driver/Option.cpp:111:11:
error: enumeration values 'GroupClass', 'InputClass', and
'UnknownClass' not handled in switch [-Werror,-Wswitch]
  switch (Kind) {
          ^

If you would prefer to list those 3 types explicitly rather than use a
default, that would be a valid alternative fix. (& you could move the
unreachable to outside the loop & leave the cases empty to fall
through if that's more suitable too)

- David

>  }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list