[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