From: Argyrios Kyrtzidis Date: Thu, 18 Oct 2012 22:42:31 +0000 (+0000) Subject: Revert r166223 and the subsequent commits that depend on it, r166230 & r166235. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f38523388174760dcbad810ef60d8504d7df6b4c;p=clang Revert r166223 and the subsequent commits that depend on it, r166230 & r166235. This seems to have introduced assertion hit when building compiler-rt. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166245 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Arg.h b/include/clang/Driver/Arg.h index bd4fa872ea..70f0741520 100644 --- a/include/clang/Driver/Arg.h +++ b/include/clang/Driver/Arg.h @@ -15,8 +15,6 @@ #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" @@ -25,6 +23,7 @@ namespace clang { namespace driver { class ArgList; + class Option; /// \brief A concrete instance of a particular driver option. /// @@ -39,7 +38,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. @@ -61,14 +60,14 @@ namespace driver { SmallVector 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 72ed7bf586..b2570b01dd 100644 --- a/include/clang/Driver/ArgList.h +++ b/include/clang/Driver/ArgList.h @@ -11,7 +11,6 @@ #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" @@ -375,14 +374,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)); } @@ -391,7 +390,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)); } @@ -399,28 +398,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 678d967659..ea7e57b12b 100644 --- a/include/clang/Driver/OptTable.h +++ b/include/clang/Driver/OptTable.h @@ -47,6 +47,15 @@ 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; + /// 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). unsigned FirstSearchableIndex; @@ -58,6 +67,8 @@ namespace driver { return OptionInfos[id - 1]; } + Option *CreateOption(unsigned id) const; + protected: OptTable(const Info *_OptionInfos, unsigned _NumOptionInfos); public: @@ -70,7 +81,17 @@ namespace driver { /// if necessary. /// /// \return The option, or null for the INVALID option id. - const Option getOption(OptSpecifier Opt) const; + 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; + } /// \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 11e417149d..6fc8bef5da 100644 --- a/include/clang/Driver/Option.h +++ b/include/clang/Driver/Option.h @@ -21,20 +21,15 @@ namespace driver { class ArgList; namespace options { - /// Base flags for all options. Custom flags may be added after. enum DriverFlag { - HelpHidden = (1 << 0), - RenderAsInput = (1 << 1), - RenderJoined = (1 << 2), - RenderSeparate = (1 << 3) - }; - - /// Flags specifically for clang options. - enum ClangFlags { - DriverOption = (1 << 4), - LinkerInput = (1 << 5), - NoArgumentUnused = (1 << 6), - NoForward = (1 << 7), + 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) }; @@ -73,7 +68,7 @@ namespace options { RenderValuesStyle }; - protected: + private: const OptTable::Info *Info; const OptTable *Owner; @@ -81,38 +76,17 @@ namespace options { Option(const OptTable::Info *Info, const OptTable *Owner); ~Option(); - 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; - } + 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); } - const Option getGroup() const { - assert(Info && "Must have a valid info!"); - assert(Owner && "Must have a valid owner!"); - return Owner->getOption(Info->GroupID); - } + unsigned getNumArgs() const { return Info->Param; } - const Option getAlias() const { - assert(Info && "Must have a valid info!"); - assert(Owner && "Must have a valid owner!"); - return Owner->getOption(Info->AliasID); - } + bool isUnsupported() const { return Info->Flags & options::Unsupported; } - unsigned getNumArgs() const { return Info->Param; } + bool isLinkerInput() const { return Info->Flags & options::LinkerInput; } bool hasNoOptAsInput() const { return Info->Flags & options::RenderAsInput;} @@ -140,23 +114,32 @@ namespace options { llvm_unreachable("Unexpected kind!"); } - /// Test if this option has the flag \a Val. - bool hasFlag(unsigned Val) const { - return Info->Flags & Val; + bool isDriverOption() const { return Info->Flags & options::DriverOption; } + + bool hasNoArgumentUnused() const { + return Info->Flags & options::NoArgumentUnused; + } + + bool hasNoForward() const { return Info->Flags & options::NoForward; } + + bool isCC1Option() const { return Info->Flags & options::CC1Option; } + + bool hasForwardToGCC() const { + return !hasNoForward() && !isDriverOption() && !isLinkerInput(); } /// 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.isValid()) return Alias.getUnaliasedOption(); - return *this; + const Option *getUnaliasedOption() const { + const Option *Alias = getAlias(); + if (Alias) 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 diff --git a/lib/Driver/Arg.cpp b/lib/Driver/Arg.cpp index b156d7cf71..c0a2a506a6 100644 --- a/lib/Driver/Arg.cpp +++ b/lib/Driver/Arg.cpp @@ -16,19 +16,19 @@ using namespace clang::driver; -Arg::Arg(const Option _Opt, unsigned _Index, const Arg *_BaseArg) +Arg::Arg(const Option *_Opt, unsigned _Index, const Arg *_BaseArg) : Opt(_Opt), BaseArg(_BaseArg), Index(_Index), Claimed(false), OwnsValues(false) { } -Arg::Arg(const Option _Opt, unsigned _Index, +Arg::Arg(const Option *_Opt, unsigned _Index, const char *Value0, const Arg *_BaseArg) : Opt(_Opt), BaseArg(_BaseArg), Index(_Index), Claimed(false), OwnsValues(false) { Values.push_back(Value0); } -Arg::Arg(const Option _Opt, unsigned _Index, +Arg::Arg(const Option *_Opt, unsigned _Index, const char *Value0, const char *Value1, const Arg *_BaseArg) : Opt(_Opt), BaseArg(_BaseArg), Index(_Index), Claimed(false), OwnsValues(false) { @@ -47,7 +47,7 @@ void Arg::dump() const { llvm::errs() << "<"; llvm::errs() << " Opt:"; - Opt.dump(); + Opt->dump(); llvm::errs() << " Index:" << Index; @@ -104,7 +104,7 @@ void Arg::render(const ArgList &Args, ArgStringList &Output) const { Output.push_back(Args.MakeArgString(OS.str())); break; } - + case Option::RenderJoinedStyle: Output.push_back(Args.GetOrMakeJoinedArgString( getIndex(), getOption().getName(), getValue(Args, 0))); diff --git a/lib/Driver/ArgList.cpp b/lib/Driver/ArgList.cpp index 3b824f7c81..7fd439e630 100644 --- a/lib/Driver/ArgList.cpp +++ b/lib/Driver/ArgList.cpp @@ -362,13 +362,13 @@ const char *DerivedArgList::MakeArgString(StringRef Str) const { return BaseArgs.MakeArgString(Str); } -Arg *DerivedArgList::MakeFlagArg(const Arg *BaseArg, const Option Opt) const { - Arg *A = new Arg(Opt, BaseArgs.MakeIndex(Opt.getName()), BaseArg); +Arg *DerivedArgList::MakeFlagArg(const Arg *BaseArg, const Option *Opt) const { + Arg *A = new Arg(Opt, BaseArgs.MakeIndex(Opt->getName()), BaseArg); SynthesizedArgs.push_back(A); return A; } -Arg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option Opt, +Arg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option *Opt, StringRef Value) const { unsigned Index = BaseArgs.MakeIndex(Value); Arg *A = new Arg(Opt, Index, BaseArgs.getArgString(Index), BaseArg); @@ -376,19 +376,19 @@ Arg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option Opt, return A; } -Arg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option Opt, +Arg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option *Opt, StringRef Value) const { - unsigned Index = BaseArgs.MakeIndex(Opt.getName(), Value); + unsigned Index = BaseArgs.MakeIndex(Opt->getName(), Value); Arg *A = new Arg(Opt, Index, BaseArgs.getArgString(Index + 1), BaseArg); SynthesizedArgs.push_back(A); return A; } -Arg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option Opt, +Arg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option *Opt, StringRef Value) const { - unsigned Index = BaseArgs.MakeIndex(Opt.getName().str() + Value.str()); + unsigned Index = BaseArgs.MakeIndex(Opt->getName().str() + Value.str()); Arg *A = new Arg(Opt, Index, - BaseArgs.getArgString(Index) + Opt.getName().size(), + BaseArgs.getArgString(Index) + Opt->getName().size(), BaseArg); SynthesizedArgs.push_back(A); return A; diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 59cebf58c1..f747621b8c 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -98,7 +98,7 @@ InputArgList *Driver::ParseArgStrings(ArrayRef ArgList) { for (ArgList::const_iterator it = Args->begin(), ie = Args->end(); it != ie; ++it) { Arg *A = *it; - if (A->getOption().hasFlag(options::Unsupported)) { + if (A->getOption().isUnsupported()) { Diag(clang::diag::err_drv_unsupported_opt) << A->getAsString(*Args); continue; } @@ -1033,7 +1033,7 @@ void Driver::BuildInputs(const ToolChain &TC, const DerivedArgList &Args, } else Inputs.push_back(std::make_pair(Ty, A)); - } else if (A->getOption().hasFlag(options::LinkerInput)) { + } else if (A->getOption().isLinkerInput()) { // Just treat as object type, we could make a special type for this if // necessary. Inputs.push_back(std::make_pair(types::TY_Object, A)); @@ -1300,7 +1300,7 @@ void Driver::BuildJobs(Compilation &C) const { // DiagnosticsEngine, so that extra values, position, and so on could be // printed. if (!A->isClaimed()) { - if (A->getOption().hasFlag(options::NoArgumentUnused)) + if (A->getOption().hasNoArgumentUnused()) continue; // Suppress the warning automatically if this is just a flag, and it is an diff --git a/lib/Driver/OptTable.cpp b/lib/Driver/OptTable.cpp index 433c3869b5..e108106fa7 100644 --- a/lib/Driver/OptTable.cpp +++ b/lib/Driver/OptTable.cpp @@ -11,7 +11,6 @@ #include "clang/Driver/Arg.h" #include "clang/Driver/ArgList.h" #include "clang/Driver/Option.h" -#include "clang/Driver/Options.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/ErrorHandling.h" #include @@ -80,16 +79,22 @@ OptSpecifier::OptSpecifier(const Option *Opt) : ID(Opt->getID()) {} OptTable::OptTable(const Info *_OptionInfos, unsigned _NumOptionInfos) : OptionInfos(_OptionInfos), NumOptionInfos(_NumOptionInfos), - FirstSearchableIndex(0) + Options(new Option*[NumOptionInfos]), + TheInputOption(0), TheUnknownOption(0), FirstSearchableIndex(0) { // Explicitly zero initialize the error to work around a bug in array // value-initialization on MinGW with gcc 4.3.5. + memset(Options, 0, sizeof(*Options) * NumOptionInfos); // Find start of normal options. for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { unsigned Kind = getInfo(i + 1).Kind; if (Kind == Option::InputClass) { + assert(!TheInputOption && "Cannot have multiple input options!"); + TheInputOption = getOption(i + 1); } else if (Kind == Option::UnknownClass) { + assert(!TheUnknownOption && "Cannot have multiple input options!"); + TheUnknownOption = getOption(i + 1); } else if (Kind != Option::GroupClass) { FirstSearchableIndex = i; break; @@ -110,8 +115,8 @@ OptTable::OptTable(const Info *_OptionInfos, unsigned _NumOptionInfos) // Check that options are in order. for (unsigned i = FirstSearchableIndex+1, e = getNumOptions(); i != e; ++i) { if (!(getInfo(i) < getInfo(i + 1))) { - getOption(i).dump(); - getOption(i + 1).dump(); + getOption(i)->dump(); + getOption(i + 1)->dump(); llvm_unreachable("Options are not in order!"); } } @@ -119,27 +124,26 @@ OptTable::OptTable(const Info *_OptionInfos, unsigned _NumOptionInfos) } OptTable::~OptTable() { -} - -const Option OptTable::getOption(OptSpecifier Opt) const { - unsigned id = Opt.getID(); - if (id == 0) - return Option(0, 0); - assert((unsigned) (id - 1) < getNumOptions() && "Invalid ID."); - return Option(&getInfo(id), this); + for (unsigned i = 0, e = getNumOptions(); i != e; ++i) + delete Options[i]; + delete[] Options; } bool OptTable::isOptionHelpHidden(OptSpecifier id) const { return getInfo(id).Flags & options::HelpHidden; } +Option *OptTable::CreateOption(unsigned id) const { + return new Option(&getInfo(id), this); +} + Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index) const { unsigned Prev = Index; const char *Str = Args.getArgString(Index); // Anything that doesn't start with '-' is an input, as is '-' itself. if (Str[0] != '-' || Str[1] == '\0') - return new Arg(getOption(options::OPT_INPUT), Index++, Str); + return new Arg(TheInputOption, Index++, Str); const Info *Start = OptionInfos + FirstSearchableIndex; const Info *End = OptionInfos + getNumOptions(); @@ -165,7 +169,7 @@ Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index) const { break; // See if this option matches. - if (Arg *A = getOption(Start - OptionInfos + 1).accept(Args, Index)) + if (Arg *A = getOption(Start - OptionInfos + 1)->accept(Args, Index)) return A; // Otherwise, see if this argument was missing values. @@ -173,7 +177,7 @@ Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index) const { return 0; } - return new Arg(getOption(options::OPT_UNKNOWN), Index++, Str); + return new Arg(TheUnknownOption, Index++, Str); } InputArgList *OptTable::ParseArgs(const char* const *ArgBegin, diff --git a/lib/Driver/Option.cpp b/lib/Driver/Option.cpp index 116dbca5b0..117021b880 100644 --- a/lib/Driver/Option.cpp +++ b/lib/Driver/Option.cpp @@ -23,8 +23,7 @@ Option::Option(const OptTable::Info *info, const OptTable *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(!Info || (!getAlias().isValid() || (!getAlias().getAlias().isValid() && - !getGroup().isValid())) && + assert((!getAlias() || (!getAlias()->getAlias() && !getGroup())) && "Multi-level aliases and aliases with groups are unsupported."); } @@ -50,16 +49,16 @@ void Option::dump() const { llvm::errs() << " Name:\"" << getName() << '"'; - const Option Group = getGroup(); - if (Group.isValid()) { + const Option *Group = getGroup(); + if (Group) { llvm::errs() << " Group:"; - Group.dump(); + Group->dump(); } - const Option Alias = getAlias(); - if (Alias.isValid()) { + const Option *Alias = getAlias(); + if (Alias) { llvm::errs() << " Alias:"; - Alias.dump(); + Alias->dump(); } if (getKind() == MultiArgClass) @@ -70,17 +69,17 @@ 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.isValid()) - return Alias.matches(Opt); + const Option *Alias = getAlias(); + if (Alias) + return Alias->matches(Opt); // Check exact match. if (getID() == Opt.getID()) return true; - const Option Group = getGroup(); - if (Group.isValid()) - return Group.matches(Opt); + const Option *Group = getGroup(); + if (Group) + return Group->matches(Opt); return false; } @@ -156,7 +155,7 @@ Arg *Option::accept(const ArgList &Args, unsigned &Index) const { // 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 new Arg(this, Index++, Value); } // Otherwise it must be separate. diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index e5773fbe4a..529f7bff48 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -485,7 +485,7 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { } // When using the define to indicate the simulator, we force // 10.6 macosx target. - const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); + const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); OSXVersion = Args.MakeJoinedArg(0, O, "10.6"); Args.append(OSXVersion); break; @@ -559,21 +559,21 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { } if (!OSXTarget.empty()) { - const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); + const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget); Args.append(OSXVersion); } else if (!iOSTarget.empty()) { - const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); + const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget); Args.append(iOSVersion); } else if (!iOSSimTarget.empty()) { - const Option O = Opts.getOption( + const Option *O = Opts.getOption( options::OPT_mios_simulator_version_min_EQ); iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget); Args.append(iOSSimVersion); } else { // Otherwise, assume we are targeting OS X. - const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); + const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin); Args.append(OSXVersion); } @@ -737,7 +737,7 @@ DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args, getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args) << A->getAsString(Args); continue; - } else if (XarchArg->getOption().hasFlag(options::DriverOption)) { + } else if (XarchArg->getOption().isDriverOption()) { getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver) << A->getAsString(Args); continue; @@ -751,7 +751,7 @@ DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args, // Linker input arguments require custom handling. The problem is that we // have already constructed the phase actions, so we can not treat them as // "input arguments". - if (A->getOption().hasFlag(options::LinkerInput)) { + if (A->getOption().isLinkerInput()) { // Convert the argument into individual Zlinker_input_args. for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) { DAL->AddSeparateArg(OriginalArg, @@ -835,8 +835,8 @@ DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args, // how the driver driver works. if (BoundArch) { StringRef Name = BoundArch; - const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ); - const Option MArch = Opts.getOption(options::OPT_march_EQ); + const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ); + const Option *MArch = Opts.getOption(options::OPT_march_EQ); // This code must be kept in sync with LLVM's getArchTypeForDarwinArch, // which defines the list of which architectures we accept. diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 80691ee9c4..07d24b411c 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -200,12 +200,6 @@ static void addProfileRT(const ToolChain &TC, const ArgList &Args, CmdArgs.push_back(Args.MakeArgString(ProfileRT)); } -static bool forwardToGCC(const Option &O) { - return !O.hasFlag(options::NoForward) && - !O.hasFlag(options::DriverOption) && - !O.hasFlag(options::LinkerInput); -} - void Clang::AddPreprocessingOptions(Compilation &C, const Driver &D, const ArgList &Args, @@ -3201,7 +3195,7 @@ void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) { Arg *A = *it; - if (forwardToGCC(A->getOption())) { + if (A->getOption().hasForwardToGCC()) { // Don't forward any -g arguments to assembly steps. if (isa(JA) && A->getOption().matches(options::OPT_g_Group)) @@ -3426,7 +3420,7 @@ void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA, for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) { Arg *A = *it; - if (forwardToGCC(A->getOption())) { + if (A->getOption().hasForwardToGCC()) { // Don't forward any -g arguments to assembly steps. if (isa(JA) && A->getOption().matches(options::OPT_g_Group)) diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 4f0cfa8001..5327951ab7 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -2330,7 +2330,7 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res, // Issue errors on arguments that are not valid for CC1. for (ArgList::iterator I = Args->begin(), E = Args->end(); I != E; ++I) { - if (!(*I)->getOption().hasFlag(options::CC1Option)) { + if (!(*I)->getOption().isCC1Option()) { Diags.Report(diag::err_drv_unknown_argument) << (*I)->getAsString(*Args); Success = false; }