[cfe-commits] [PATCH] Make Option non clang specific.
Michael Spencer
bigcheesegs at gmail.com
Wed Oct 10 15:10:30 PDT 2012
On Wed, Oct 10, 2012 at 3:08 PM, Michael Spencer
<reviews at llvm-reviews.chandlerc.com> wrote:
> This patch extracts non-option-paring specific flags from the Option class.
>
> http://llvm-reviews.chandlerc.com/D58
>
> Files:
> include/clang/Driver/Option.h
> lib/Driver/Driver.cpp
> lib/Driver/ToolChains.cpp
> lib/Driver/Tools.cpp
> lib/Frontend/CompilerInvocation.cpp
>
> Index: include/clang/Driver/Option.h
> ===================================================================
> --- include/clang/Driver/Option.h
> +++ include/clang/Driver/Option.h
> @@ -21,15 +21,20 @@
> 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 @@
> RenderValuesStyle
> };
>
> - private:
> + protected:
> const OptTable::Info *Info;
> const OptTable *Owner;
>
> @@ -80,18 +85,15 @@
> return Info != 0;
> }
>
> + const Option getGroup() const { return Owner->getOption(Info->GroupID); }
> + const Option getAlias() const { return Owner->getOption(Info->AliasID); }
> +
> 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); }
>
> 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 {
> @@ -118,18 +120,9 @@
> 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
> Index: lib/Driver/Driver.cpp
> ===================================================================
> --- lib/Driver/Driver.cpp
> +++ lib/Driver/Driver.cpp
> @@ -98,7 +98,7 @@
> 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 @@
> } 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 @@
> // 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
> Index: lib/Driver/ToolChains.cpp
> ===================================================================
> --- lib/Driver/ToolChains.cpp
> +++ lib/Driver/ToolChains.cpp
> @@ -737,7 +737,7 @@
> 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 @@
> // 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,
> Index: lib/Driver/Tools.cpp
> ===================================================================
> --- lib/Driver/Tools.cpp
> +++ lib/Driver/Tools.cpp
> @@ -200,6 +200,12 @@
> 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,
> @@ -3193,7 +3199,7 @@
> 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))
> @@ -3418,7 +3424,7 @@
> 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))
> Index: lib/Frontend/CompilerInvocation.cpp
> ===================================================================
> --- lib/Frontend/CompilerInvocation.cpp
> +++ lib/Frontend/CompilerInvocation.cpp
> @@ -2325,7 +2325,7 @@
> // 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;
> }
CCing Daniel. Can't add arbitrary addresses on Phabricator.
- Michael Spencer
More information about the cfe-commits
mailing list