From 9b7dcdb53cee4234c48bb4ceeef39536419945cf Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Wed, 3 Oct 2012 19:58:10 +0000 Subject: [PATCH] [Options] Store the owning OptTable in Option so it can construct Group and Alias. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165150 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Driver/Option.h | 15 +++++---------- lib/Driver/OptTable.cpp | 8 +------- lib/Driver/Option.cpp | 11 +++++++---- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/include/clang/Driver/Option.h b/include/clang/Driver/Option.h index 2adba6b4b7..6fc8bef5da 100644 --- a/include/clang/Driver/Option.h +++ b/include/clang/Driver/Option.h @@ -70,23 +70,17 @@ namespace options { private: const OptTable::Info *Info; - - /// Group this option is a member of, if any. - const Option *Group; - - /// Option that this is an alias for, if any. - const Option *Alias; + const OptTable *Owner; public: - Option(const OptTable::Info *Info, - const Option *Group, const Option *Alias); + 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 Group; } - const Option *getAlias() const { return Alias; } + const Option *getGroup() const { return Owner->getOption(Info->GroupID); } + const Option *getAlias() const { return Owner->getOption(Info->AliasID); } unsigned getNumArgs() const { return Info->Param; } @@ -137,6 +131,7 @@ 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; } diff --git a/lib/Driver/OptTable.cpp b/lib/Driver/OptTable.cpp index a6d3cb3149..680ea9938f 100644 --- a/lib/Driver/OptTable.cpp +++ b/lib/Driver/OptTable.cpp @@ -134,13 +134,7 @@ bool OptTable::isOptionHelpHidden(OptSpecifier id) const { } 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(&info, Group, Alias); - - return Opt; + return new Option(&getInfo(id), this); } Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index) const { diff --git a/lib/Driver/Option.cpp b/lib/Driver/Option.cpp index 3be141e61d..117021b880 100644 --- a/lib/Driver/Option.cpp +++ b/lib/Driver/Option.cpp @@ -17,14 +17,13 @@ #include using namespace clang::driver; -Option::Option(const OptTable::Info *info, - const Option *_Group, const Option *_Alias) - : Info(info), Group(_Group), Alias(_Alias) { +Option::Option(const OptTable::Info *info, const OptTable *owner) + : Info(info), Owner(owner) { // 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)) && + assert((!getAlias() || (!getAlias()->getAlias() && !getGroup())) && "Multi-level aliases and aliases with groups are unsupported."); } @@ -50,11 +49,13 @@ void Option::dump() const { llvm::errs() << " Name:\"" << getName() << '"'; + const Option *Group = getGroup(); if (Group) { llvm::errs() << " Group:"; Group->dump(); } + const Option *Alias = getAlias(); if (Alias) { llvm::errs() << " Alias:"; Alias->dump(); @@ -68,6 +69,7 @@ void Option::dump() const { bool Option::matches(OptSpecifier Opt) const { // Aliases are never considered in matching, look through them. + const Option *Alias = getAlias(); if (Alias) return Alias->matches(Opt); @@ -75,6 +77,7 @@ bool Option::matches(OptSpecifier Opt) const { if (getID() == Opt.getID()) return true; + const Option *Group = getGroup(); if (Group) return Group->matches(Opt); return false; -- 2.40.0