[PATCH] clang-cl: add support for /? and /help

Chandler Carruth chandlerc at gmail.com
Fri Jul 26 16:43:22 PDT 2013


LGTM thanks!
On Jul 26, 2013 1:17 PM, "Hans Wennborg" <hans at chromium.org> wrote:

>   Please take another look.
>
> Hi chandlerc, rnk,
>
> http://llvm-reviews.chandlerc.com/D1215
>
> CHANGE SINCE LAST DIFF
>   http://llvm-reviews.chandlerc.com/D1215?vs=3017&id=3040#toc
>
> Files:
>   include/clang/Driver/CLCompatOptions.td
>   include/clang/Driver/Driver.h
>   include/clang/Driver/Makefile
>   include/clang/Driver/Options.h
>   include/clang/Driver/Options.td
>   lib/Driver/Driver.cpp
>   test/Driver/cl.c
>
> Index: include/clang/Driver/CLCompatOptions.td
> ===================================================================
> --- /dev/null
> +++ include/clang/Driver/CLCompatOptions.td
> @@ -0,0 +1,21 @@
> +//===--- CLCompatOptions.td - Options for clang-cl
> ------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +//  This file defines the options accepted by clang-cl.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +def cl_Group : OptionGroup<"<clang-cl options>">,
> +    HelpText<"CL.EXE COMPATIBILITY OPTIONS">;
> +
> +class CLFlag<string name> : Option<["/", "-"], name, KIND_FLAG>,
> +    Group<cl_Group>, Flags<[CLOption]>;
> +
> +def _QUESTION : CLFlag<"?">, Alias<help>, HelpText<"Display available
> options">;
> +def cl_help : CLFlag<"help">, Alias<help>, HelpText<"Display available
> options">;
> Index: include/clang/Driver/Driver.h
> ===================================================================
> --- include/clang/Driver/Driver.h
> +++ include/clang/Driver/Driver.h
> @@ -396,6 +396,10 @@
>
>    /// @}
>
> +  /// \brief Get bitmasks for which option flags to include and exclude
> based on
> +  /// the driver mode.
> +  std::pair<unsigned, unsigned> getIncludeExcludeOptionFlagMasks() const;
> +
>  public:
>    /// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and
>    /// return the grouped values as integers. Numbers which are not
> Index: include/clang/Driver/Makefile
> ===================================================================
> --- include/clang/Driver/Makefile
> +++ include/clang/Driver/Makefile
> @@ -5,7 +5,7 @@
>
>  include $(CLANG_LEVEL)/Makefile
>
> -$(ObjDir)/Options.inc.tmp : Options.td CC1Options.td $(LLVM_TBLGEN)
> $(ObjDir)/.dir
> +$(ObjDir)/Options.inc.tmp : Options.td CC1Options.td CLCompatOptions.td
> $(LLVM_TBLGEN) $(ObjDir)/.dir
>         $(Echo) "Building Clang Driver Option tables with tblgen"
>         $(Verb) $(LLVMTableGen) -gen-opt-parser-defs -o $(call SYSPATH,
> $@) $<
>
> Index: include/clang/Driver/Options.h
> ===================================================================
> --- include/clang/Driver/Options.h
> +++ include/clang/Driver/Options.h
> @@ -27,8 +27,9 @@
>    LinkerInput = (1 << 5),
>    NoArgumentUnused = (1 << 6),
>    Unsupported = (1 << 7),
> -  CC1Option = (1 << 8),
> -  NoDriverOption = (1 << 9)
> +  CLOption = (1 << 8),
> +  CC1Option = (1 << 9),
> +  NoDriverOption = (1 << 10)
>  };
>
>  enum ID {
> Index: include/clang/Driver/Options.td
> ===================================================================
> --- include/clang/Driver/Options.td
> +++ include/clang/Driver/Options.td
> @@ -33,6 +33,10 @@
>  // lines that use it.
>  def Unsupported : OptionFlag;
>
> +// CLOption - This is a cl.exe compatibility option. Options with this
> flag
> +// are made available when the driver is running in CL compatibility mode.
> +def CLOption : OptionFlag;
> +
>  // CC1Option - This option should be accepted by clang -cc1.
>  def CC1Option : OptionFlag;
>
> @@ -97,6 +101,7 @@
>  //   _ => __
>  //   - => _
>  //   # => _HASH
> +//   ? => _QUESTION
>  //   , => _COMMA
>  //   = => _EQ
>  //   C++ => CXX
> @@ -1314,4 +1319,6 @@
>  def Z_reserved_lib_cckext : Flag<["-"], "Z-reserved-lib-cckext">,
>      Flags<[LinkerInput, NoArgumentUnused, Unsupported]>,
> Group<reserved_lib_Group>;
>
> +include "CLCompatOptions.td"
> +
>  include "CC1Options.td"
> Index: lib/Driver/Driver.cpp
> ===================================================================
> --- lib/Driver/Driver.cpp
> +++ lib/Driver/Driver.cpp
> @@ -20,6 +20,7 @@
>  #include "clang/Driver/ToolChain.h"
>  #include "llvm/ADT/ArrayRef.h"
>  #include "llvm/ADT/OwningPtr.h"
> +#include "llvm/ADT/STLExtras.h"
>  #include "llvm/ADT/StringSet.h"
>  #include "llvm/ADT/StringSwitch.h"
>  #include "llvm/Option/Arg.h"
> @@ -108,9 +109,17 @@
>
>  InputArgList *Driver::ParseArgStrings(ArrayRef<const char *> ArgList) {
>    llvm::PrettyStackTraceString CrashInfo("Command line argument parsing");
> +
> +  unsigned IncludedFlagsBitmask;
> +  unsigned ExcludedFlagsBitmask;
> +  llvm::tie(IncludedFlagsBitmask, ExcludedFlagsBitmask) =
> +    getIncludeExcludeOptionFlagMasks();
> +
>    unsigned MissingArgIndex, MissingArgCount;
>    InputArgList *Args = getOpts().ParseArgs(ArgList.begin(), ArgList.end(),
> -                                           MissingArgIndex,
> MissingArgCount);
> +                                           MissingArgIndex,
> MissingArgCount,
> +                                           IncludedFlagsBitmask,
> +                                           ExcludedFlagsBitmask);
>
>    // Check for missing argument error.
>    if (MissingArgCount)
> @@ -607,9 +616,17 @@
>  }
>
>  void Driver::PrintHelp(bool ShowHidden) const {
> -  getOpts().PrintHelp(
> -      llvm::outs(), Name.c_str(), DriverTitle.c_str(), /*Include*/ 0,
> -      /*Exclude*/ options::NoDriverOption | (ShowHidden ? 0 :
> HelpHidden));
> +  unsigned IncludedFlagsBitmask;
> +  unsigned ExcludedFlagsBitmask;
> +  llvm::tie(IncludedFlagsBitmask, ExcludedFlagsBitmask) =
> +    getIncludeExcludeOptionFlagMasks();
> +
> +  ExcludedFlagsBitmask |= options::NoDriverOption;
> +  if (!ShowHidden)
> +    ExcludedFlagsBitmask |= HelpHidden;
> +
> +  getOpts().PrintHelp(llvm::outs(), Name.c_str(), DriverTitle.c_str(),
> +                      IncludedFlagsBitmask, ExcludedFlagsBitmask);
>  }
>
>  void Driver::PrintVersion(const Compilation &C, raw_ostream &OS) const {
> @@ -1856,3 +1873,18 @@
>    HadExtra = true;
>    return true;
>  }
> +
> +std::pair<unsigned, unsigned> Driver::getIncludeExcludeOptionFlagMasks()
> const {
> +  unsigned IncludedFlagsBitmask = 0;
> +  unsigned ExcludedFlagsBitmask = 0;
> +
> +  if (Mode == CLMode) {
> +    // Only allow CL options.
> +    // FIXME: Also allow "core" Clang options.
> +    IncludedFlagsBitmask = options::CLOption;
> +  } else {
> +    ExcludedFlagsBitmask |= options::CLOption;
> +  }
> +
> +  return std::make_pair(IncludedFlagsBitmask, ExcludedFlagsBitmask);
> +}
> Index: test/Driver/cl.c
> ===================================================================
> --- test/Driver/cl.c
> +++ test/Driver/cl.c
> @@ -1,3 +1,21 @@
> -// RUN: %clang_cl -fsyntax-only -c %s
> +// Check that clang-cl options are not available by default.
> +// RUN: %clang -help | FileCheck %s -check-prefix=DEFAULT
> +// DEFAULT-NOT: CL.EXE COMPATIBILITY OPTIONS
> +// DEFAULT-NOT: {{/[?]}}
> +// DEFAULT-NOT: /help
> +// RUN: not %clang /?
> +// RUN: not %clang -?
> +// RUN: not %clang /help
>
> -void f();
> +// Check that /? and /help are available as clang-cl options.
> +// RUN: %clang_cl /? | FileCheck %s -check-prefix=CL
> +// RUN: %clang_cl /help | FileCheck %s -check-prefix=CL
> +// RUN: %clang_cl -help | FileCheck %s -check-prefix=CL
> +// CL: CL.EXE COMPATIBILITY OPTIONS
> +// CL: {{/[?]}}
> +// CL: /help
> +
> +// Options which are not "core" clang options nor cl.exe compatible
> options
> +// are not available in clang-cl.
> +// DEFAULT: -fapple-kext
> +// CL-NOT: -fapple-kext
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130726/e7116b3d/attachment.html>


More information about the cfe-commits mailing list