diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/clang/Driver/Arg.h | 13 | ||||
-rw-r--r-- | include/clang/Driver/ArgList.h | 17 | ||||
-rw-r--r-- | include/clang/Driver/OptTable.h | 24 | ||||
-rw-r--r-- | include/clang/Driver/Option.h | 45 |
4 files changed, 54 insertions, 45 deletions
diff --git a/include/clang/Driver/Arg.h b/include/clang/Driver/Arg.h index 70f0741520..bd4fa872ea 100644 --- a/include/clang/Driver/Arg.h +++ b/include/clang/Driver/Arg.h @@ -15,6 +15,8 @@ #ifndef CLANG_DRIVER_ARG_H_ #define CLANG_DRIVER_ARG_H_ +#include "clang/Driver/Option.h" + #include "Util.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" @@ -23,7 +25,6 @@ namespace clang { namespace driver { class ArgList; - class Option; /// \brief A concrete instance of a particular driver option. /// @@ -38,7 +39,7 @@ namespace driver { private: /// \brief The option this argument is an instance of. - const Option *Opt; + const Option Opt; /// \brief The argument this argument was derived from (during tool chain /// argument translation), if any. @@ -60,14 +61,14 @@ namespace driver { SmallVector<const char *, 2> Values; public: - Arg(const Option *Opt, unsigned Index, const Arg *BaseArg = 0); - Arg(const Option *Opt, unsigned Index, + Arg(const Option Opt, unsigned Index, const Arg *BaseArg = 0); + Arg(const Option Opt, unsigned Index, const char *Value0, const Arg *BaseArg = 0); - Arg(const Option *Opt, unsigned Index, + Arg(const Option Opt, unsigned Index, const char *Value0, const char *Value1, const Arg *BaseArg = 0); ~Arg(); - const Option &getOption() const { return *Opt; } + const Option getOption() const { return Opt; } unsigned getIndex() const { return Index; } /// \brief Return the base argument which generated this arg. diff --git a/include/clang/Driver/ArgList.h b/include/clang/Driver/ArgList.h index b2570b01dd..72ed7bf586 100644 --- a/include/clang/Driver/ArgList.h +++ b/include/clang/Driver/ArgList.h @@ -11,6 +11,7 @@ #define CLANG_DRIVER_ARGLIST_H_ #include "clang/Basic/LLVM.h" +#include "clang/Driver/Option.h" #include "clang/Driver/OptSpecifier.h" #include "clang/Driver/Util.h" #include "llvm/ADT/SmallVector.h" @@ -374,14 +375,14 @@ namespace driver { /// AddFlagArg - Construct a new FlagArg for the given option \p Id and /// append it to the argument list. - void AddFlagArg(const Arg *BaseArg, const Option *Opt) { + void AddFlagArg(const Arg *BaseArg, const Option Opt) { append(MakeFlagArg(BaseArg, Opt)); } /// AddPositionalArg - Construct a new Positional arg for the given option /// \p Id, with the provided \p Value and append it to the argument /// list. - void AddPositionalArg(const Arg *BaseArg, const Option *Opt, + void AddPositionalArg(const Arg *BaseArg, const Option Opt, StringRef Value) { append(MakePositionalArg(BaseArg, Opt, Value)); } @@ -390,7 +391,7 @@ namespace driver { /// AddSeparateArg - Construct a new Positional arg for the given option /// \p Id, with the provided \p Value and append it to the argument /// list. - void AddSeparateArg(const Arg *BaseArg, const Option *Opt, + void AddSeparateArg(const Arg *BaseArg, const Option Opt, StringRef Value) { append(MakeSeparateArg(BaseArg, Opt, Value)); } @@ -398,28 +399,28 @@ namespace driver { /// AddJoinedArg - Construct a new Positional arg for the given option /// \p Id, with the provided \p Value and append it to the argument list. - void AddJoinedArg(const Arg *BaseArg, const Option *Opt, + void AddJoinedArg(const Arg *BaseArg, const Option Opt, StringRef Value) { append(MakeJoinedArg(BaseArg, Opt, Value)); } /// MakeFlagArg - Construct a new FlagArg for the given option \p Id. - Arg *MakeFlagArg(const Arg *BaseArg, const Option *Opt) const; + Arg *MakeFlagArg(const Arg *BaseArg, const Option Opt) const; /// MakePositionalArg - Construct a new Positional arg for the /// given option \p Id, with the provided \p Value. - Arg *MakePositionalArg(const Arg *BaseArg, const Option *Opt, + Arg *MakePositionalArg(const Arg *BaseArg, const Option Opt, StringRef Value) const; /// MakeSeparateArg - Construct a new Positional arg for the /// given option \p Id, with the provided \p Value. - Arg *MakeSeparateArg(const Arg *BaseArg, const Option *Opt, + Arg *MakeSeparateArg(const Arg *BaseArg, const Option Opt, StringRef Value) const; /// MakeJoinedArg - Construct a new Positional arg for the /// given option \p Id, with the provided \p Value. - Arg *MakeJoinedArg(const Arg *BaseArg, const Option *Opt, + Arg *MakeJoinedArg(const Arg *BaseArg, const Option Opt, StringRef Value) const; /// @} diff --git a/include/clang/Driver/OptTable.h b/include/clang/Driver/OptTable.h index ea7e57b12b..51ffe9f9be 100644 --- a/include/clang/Driver/OptTable.h +++ b/include/clang/Driver/OptTable.h @@ -47,14 +47,8 @@ namespace driver { const Info *OptionInfos; unsigned NumOptionInfos; - /// \brief The lazily constructed options table, indexed by option::ID - 1. - mutable Option **Options; - - /// \brief Prebound input option instance. - const Option *TheInputOption; - - /// \brief Prebound unknown option instance. - const Option *TheUnknownOption; + unsigned TheInputOptionID; + unsigned TheUnknownOptionID; /// The index of the first option which can be parsed (i.e., is not a /// special option like 'input' or 'unknown', and is not an option group). @@ -67,8 +61,6 @@ namespace driver { return OptionInfos[id - 1]; } - Option *CreateOption(unsigned id) const; - protected: OptTable(const Info *_OptionInfos, unsigned _NumOptionInfos); public: @@ -81,17 +73,7 @@ namespace driver { /// if necessary. /// /// \return The option, or null for the INVALID option id. - const Option *getOption(OptSpecifier Opt) const { - unsigned id = Opt.getID(); - if (id == 0) - return 0; - - assert((unsigned) (id - 1) < getNumOptions() && "Invalid ID."); - Option *&Entry = Options[id - 1]; - if (!Entry) - Entry = CreateOption(id); - return Entry; - } + const Option getOption(OptSpecifier Opt) const; /// \brief Lookup the name of the given option. const char *getOptionName(OptSpecifier id) const { diff --git a/include/clang/Driver/Option.h b/include/clang/Driver/Option.h index 6fc8bef5da..9cda2801d4 100644 --- a/include/clang/Driver/Option.h +++ b/include/clang/Driver/Option.h @@ -76,11 +76,36 @@ namespace options { Option(const OptTable::Info *Info, const OptTable *Owner); ~Option(); - unsigned getID() const { return Info->ID; } - OptionClass getKind() const { return OptionClass(Info->Kind); } - StringRef getName() const { return Info->Name; } - const Option *getGroup() const { return Owner->getOption(Info->GroupID); } - const Option *getAlias() const { return Owner->getOption(Info->AliasID); } + bool isValid() const { + return Info != 0; + } + + unsigned getID() const { + assert(Info && "Must have a valid info!"); + return Info->ID; + } + + OptionClass getKind() const { + assert(Info && "Must have a valid info!"); + return OptionClass(Info->Kind); + } + + StringRef getName() const { + assert(Info && "Must have a valid info!"); + return Info->Name; + } + + const Option getGroup() const { + assert(Info && "Must have a valid info!"); + assert(Owner && "Must have a valid owner!"); + return Owner->getOption(Info->GroupID); + } + + const Option getAlias() const { + assert(Info && "Must have a valid info!"); + assert(Owner && "Must have a valid owner!"); + return Owner->getOption(Info->AliasID); + } unsigned getNumArgs() const { return Info->Param; } @@ -130,16 +155,16 @@ namespace options { /// getUnaliasedOption - Return the final option this option /// aliases (itself, if the option has no alias). - const Option *getUnaliasedOption() const { - const Option *Alias = getAlias(); - if (Alias) return Alias->getUnaliasedOption(); - return this; + const Option getUnaliasedOption() const { + const Option Alias = getAlias(); + if (Alias.isValid()) return Alias.getUnaliasedOption(); + return *this; } /// getRenderName - Return the name to use when rendering this /// option. StringRef getRenderName() const { - return getUnaliasedOption()->getName(); + return getUnaliasedOption().getName(); } /// matches - Predicate for whether this option is part of the |