LGTM thanks! On Jul 26, 2013 1:17 PM, "Hans Wennborg" <[email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
