From: Daniel Dunbar Date: Wed, 4 Mar 2009 21:53:04 +0000 (+0000) Subject: Driver: Option's need to know their ID. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=30b055f553ffa50ae5413ecf0f0ac8061c58f475;p=clang Driver: Option's need to know their ID. - Also, add Input and Unknown opts to OptTable. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66079 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Option.h b/include/clang/Driver/Option.h index 0c74f345f2..546f9561d8 100644 --- a/include/clang/Driver/Option.h +++ b/include/clang/Driver/Option.h @@ -10,6 +10,8 @@ #ifndef CLANG_DRIVER_OPTION_H_ #define CLANG_DRIVER_OPTION_H_ +#include "Options.h" + #include "llvm/Support/Casting.h" using llvm::isa; using llvm::cast; @@ -52,6 +54,8 @@ namespace driver { private: OptionClass Kind; + options::ID ID; + /// The option name. const char *Name; @@ -79,7 +83,7 @@ namespace driver { bool ForceJoinedRender : 1; protected: - Option(OptionClass Kind, const char *Name, + Option(OptionClass Kind, options::ID ID, const char *Name, const OptionGroup *Group, const Option *Alias); public: virtual ~Option(); @@ -137,7 +141,7 @@ namespace driver { /// by the driver. class OptionGroup : public Option { public: - OptionGroup(const char *Name, const OptionGroup *Group); + OptionGroup(options::ID ID, const char *Name, const OptionGroup *Group); virtual Arg *accept(const ArgList &Args, unsigned &Index) const; @@ -179,7 +183,8 @@ namespace driver { class FlagOption : public Option { public: - FlagOption(const char *Name, const OptionGroup *Group, const Option *Alias); + FlagOption(options::ID ID, const char *Name, const OptionGroup *Group, + const Option *Alias); virtual Arg *accept(const ArgList &Args, unsigned &Index) const; @@ -191,7 +196,7 @@ namespace driver { class JoinedOption : public Option { public: - JoinedOption(const char *Name, const OptionGroup *Group, + JoinedOption(options::ID ID, const char *Name, const OptionGroup *Group, const Option *Alias); virtual Arg *accept(const ArgList &Args, unsigned &Index) const; @@ -204,7 +209,7 @@ namespace driver { class SeparateOption : public Option { public: - SeparateOption(const char *Name, const OptionGroup *Group, + SeparateOption(options::ID ID, const char *Name, const OptionGroup *Group, const Option *Alias); virtual Arg *accept(const ArgList &Args, unsigned &Index) const; @@ -217,8 +222,8 @@ namespace driver { class CommaJoinedOption : public Option { public: - CommaJoinedOption(const char *Name, const OptionGroup *Group, - const Option *Alias); + CommaJoinedOption(options::ID ID, const char *Name, + const OptionGroup *Group, const Option *Alias); virtual Arg *accept(const ArgList &Args, unsigned &Index) const; @@ -236,7 +241,7 @@ namespace driver { unsigned NumArgs; public: - MultiArgOption(const char *Name, const OptionGroup *Group, + MultiArgOption(options::ID ID, const char *Name, const OptionGroup *Group, const Option *Alias, unsigned NumArgs); unsigned getNumArgs() const { return NumArgs; } @@ -253,8 +258,8 @@ namespace driver { /// prefixes its (non-empty) value, or is follwed by a value. class JoinedOrSeparateOption : public Option { public: - JoinedOrSeparateOption(const char *Name, const OptionGroup *Group, - const Option *Alias); + JoinedOrSeparateOption(options::ID ID, const char *Name, + const OptionGroup *Group, const Option *Alias); virtual Arg *accept(const ArgList &Args, unsigned &Index) const; @@ -268,8 +273,8 @@ namespace driver { /// value and is followed by another value. class JoinedAndSeparateOption : public Option { public: - JoinedAndSeparateOption(const char *Name, const OptionGroup *Group, - const Option *Alias); + JoinedAndSeparateOption(options::ID ID, const char *Name, + const OptionGroup *Group, const Option *Alias); virtual Arg *accept(const ArgList &Args, unsigned &Index) const; diff --git a/include/clang/Driver/Options.h b/include/clang/Driver/Options.h index ad737635c4..d98a530bbf 100644 --- a/include/clang/Driver/Options.h +++ b/include/clang/Driver/Options.h @@ -15,6 +15,8 @@ namespace driver { namespace options { enum ID { NotOption = 0, // This is not an option ID. + InputOpt, // Reserved ID for input option. + UnknownOpt, // Reserved ID for unknown option. #define OPTION(ID, KIND, NAME, GROUP, ALIAS, FLAGS, PARAM) ID, #include "clang/Driver/Options.def" LastOption diff --git a/lib/Driver/OptTable.cpp b/lib/Driver/OptTable.cpp index 335d7720bf..070c12e154 100644 --- a/lib/Driver/OptTable.cpp +++ b/lib/Driver/OptTable.cpp @@ -26,6 +26,11 @@ struct Info { }; static Info OptionInfos[] = { + // The InputOption info + { Option::InputClass, "", 0, 0, "", 0 }, + // The UnknownOption info + { Option::UnknownClass, "", 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 char *OptTable::getOptionName(options::ID id) const { } 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 *OptTable::constructOption(options::ID id) const { 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 368f004b60..583650f63b 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 @@ bool Option::matches(const Option *Opt) const { 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 @@ Arg *OptionGroup::accept(const ArgList &Args, unsigned &Index) const { } InputOption::InputOption() - : Option(Option::InputClass, "", 0, 0) { + : Option(Option::InputClass, options::InputOpt, "", 0, 0) { } Arg *InputOption::accept(const ArgList &Args, unsigned &Index) const { @@ -101,7 +102,7 @@ Arg *InputOption::accept(const ArgList &Args, unsigned &Index) const { } UnknownOption::UnknownOption() - : Option(Option::UnknownClass, "", 0, 0) { + : Option(Option::UnknownClass, options::UnknownOpt, "", 0, 0) { } Arg *UnknownOption::accept(const ArgList &Args, unsigned &Index) const { @@ -109,9 +110,9 @@ Arg *UnknownOption::accept(const ArgList &Args, unsigned &Index) const { 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 @@ Arg *FlagOption::accept(const ArgList &Args, unsigned &Index) const { 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 @@ Arg *JoinedOption::accept(const ArgList &Args, unsigned &Index) const { 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 @@ Arg *CommaJoinedOption::accept(const ArgList &Args, unsigned &Index) const { 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 @@ Arg *SeparateOption::accept(const ArgList &Args, unsigned &Index) const { 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 @@ Arg *MultiArgOption::accept(const ArgList &Args, unsigned &Index) const { 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 @@ Arg *JoinedOrSeparateOption::accept(const ArgList &Args, unsigned &Index) const 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 {