diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2012-10-19 22:37:06 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2012-10-19 22:37:06 +0000 |
commit | 91e06dab9335ed6b4474a74353549c708cf3d936 (patch) | |
tree | f5a541b2ebdbc4913640834d301122d9857c6e90 | |
parent | e4151c5d1b48efac740b89cc16e5054850cbdecb (diff) |
[Options] Make Option non clang specific.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166348 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Driver/Option.h | 50 | ||||
-rw-r--r-- | lib/Driver/Driver.cpp | 6 | ||||
-rw-r--r-- | lib/Driver/ToolChains.cpp | 4 | ||||
-rw-r--r-- | lib/Driver/Tools.cpp | 10 | ||||
-rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 2 |
5 files changed, 35 insertions, 37 deletions
diff --git a/include/clang/Driver/Option.h b/include/clang/Driver/Option.h index 9cda2801d4..11e417149d 100644 --- a/include/clang/Driver/Option.h +++ b/include/clang/Driver/Option.h @@ -21,15 +21,20 @@ namespace driver { class ArgList; namespace options { + /// Base flags for all options. Custom flags may be added after. enum DriverFlag { - DriverOption = (1 << 0), - HelpHidden = (1 << 1), - LinkerInput = (1 << 2), - NoArgumentUnused = (1 << 3), - NoForward = (1 << 4), - RenderAsInput = (1 << 5), - RenderJoined = (1 << 6), - RenderSeparate = (1 << 7), + 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), Unsupported = (1 << 8), CC1Option = (1 << 9) }; @@ -68,7 +73,7 @@ namespace options { RenderValuesStyle }; - private: + protected: const OptTable::Info *Info; const OptTable *Owner; @@ -84,23 +89,23 @@ namespace options { 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!"); @@ -109,10 +114,6 @@ namespace options { unsigned getNumArgs() const { return Info->Param; } - bool isUnsupported() const { return Info->Flags & options::Unsupported; } - - bool isLinkerInput() const { return Info->Flags & options::LinkerInput; } - bool hasNoOptAsInput() const { return Info->Flags & options::RenderAsInput;} RenderStyleKind getRenderStyle() const { @@ -139,18 +140,9 @@ namespace options { llvm_unreachable("Unexpected kind!"); } - 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(); + /// Test if this option has the flag \a Val. + bool hasFlag(unsigned Val) const { + return Info->Flags & Val; } /// getUnaliasedOption - Return the final option this option diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index f747621b8c..59cebf58c1 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -98,7 +98,7 @@ InputArgList *Driver::ParseArgStrings(ArrayRef<const char *> ArgList) { for (ArgList::const_iterator it = Args->begin(), ie = Args->end(); it != ie; ++it) { Arg *A = *it; - if (A->getOption().isUnsupported()) { + if (A->getOption().hasFlag(options::Unsupported)) { 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().isLinkerInput()) { + } else if (A->getOption().hasFlag(options::LinkerInput)) { // 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().hasNoArgumentUnused()) + if (A->getOption().hasFlag(options::NoArgumentUnused)) continue; // Suppress the warning automatically if this is just a flag, and it is an diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index de18f53fbe..e5773fbe4a 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -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().isDriverOption()) { + } else if (XarchArg->getOption().hasFlag(options::DriverOption)) { 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().isLinkerInput()) { + if (A->getOption().hasFlag(options::LinkerInput)) { // Convert the argument into individual Zlinker_input_args. for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) { DAL->AddSeparateArg(OriginalArg, diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 07d24b411c..80691ee9c4 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -200,6 +200,12 @@ 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, @@ -3195,7 +3201,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 (A->getOption().hasForwardToGCC()) { + if (forwardToGCC(A->getOption())) { // Don't forward any -g arguments to assembly steps. if (isa<AssembleJobAction>(JA) && A->getOption().matches(options::OPT_g_Group)) @@ -3420,7 +3426,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 (A->getOption().hasForwardToGCC()) { + if (forwardToGCC(A->getOption())) { // Don't forward any -g arguments to assembly steps. if (isa<AssembleJobAction>(JA) && A->getOption().matches(options::OPT_g_Group)) diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 5327951ab7..4f0cfa8001 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().isCC1Option()) { + if (!(*I)->getOption().hasFlag(options::CC1Option)) { Diags.Report(diag::err_drv_unknown_argument) << (*I)->getAsString(*Args); Success = false; } |