r227868 - Add cc1 option '-fmodule-feature' to add custom values for 'requires' decls

Richard Smith richard at metafoo.co.uk
Mon Jun 15 12:03:38 PDT 2015


On Mon, Feb 2, 2015 at 1:56 PM, Ben Langmuir <blangmuir at apple.com> wrote:

> Author: benlangmuir
> Date: Mon Feb  2 15:56:15 2015
> New Revision: 227868
>
> URL: http://llvm.org/viewvc/llvm-project?rev=227868&view=rev
> Log:
> Add cc1 option '-fmodule-feature' to add custom values for 'requires' decls
>
> This allows clang-based tools to specify custom features that can be
> tested by the 'requires' declaration in a module map file.
>

Hi Ben,

It looks like this isn't getting added to the module hash, nor even checked
when we pull a module out of the cache.


> Modified:
>     cfe/trunk/include/clang/Basic/LangOptions.h
>     cfe/trunk/include/clang/Driver/CC1Options.td
>     cfe/trunk/lib/Basic/Module.cpp
>     cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>     cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map
>     cfe/trunk/test/Modules/requires.m
>
> Modified: cfe/trunk/include/clang/Basic/LangOptions.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=227868&r1=227867&r2=227868&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/LangOptions.h (original)
> +++ cfe/trunk/include/clang/Basic/LangOptions.h Mon Feb  2 15:56:15 2015
> @@ -92,6 +92,10 @@ public:
>    /// treat this as the CurrentModule.
>    std::string ImplementationOfModule;
>
> +  /// \brief The names of any features to enable in module 'requires'
> decls
> +  /// in addition to the hard-coded list in Module.cpp and the target
> features.
> +  std::vector<std::string> ModuleFeatures;
> +
>    /// \brief Options for parsing comments.
>    CommentOptions CommentOpts;
>
>
> Modified: cfe/trunk/include/clang/Driver/CC1Options.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=227868&r1=227867&r2=227868&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/CC1Options.td (original)
> +++ cfe/trunk/include/clang/Driver/CC1Options.td Mon Feb  2 15:56:15 2015
> @@ -342,6 +342,9 @@ def fmodule_implementation_of : Separate
>  def fmodule_map_file_home_is_cwd : Flag<["-"],
> "fmodule-map-file-home-is-cwd">,
>    HelpText<"Use the current working directory as the home directory of "
>             "module maps specified by -fmodule-map-file=<FILE>">;
> +def fmodule_feature : Separate<["-"], "fmodule-feature">,
> +  MetaVarName<"<feature>">,
> +  HelpText<"Enable <feature> in module map requires declarations">;
>
>  let Group = Action_Group in {
>
>
> Modified: cfe/trunk/lib/Basic/Module.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Module.cpp?rev=227868&r1=227867&r2=227868&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Basic/Module.cpp (original)
> +++ cfe/trunk/lib/Basic/Module.cpp Mon Feb  2 15:56:15 2015
> @@ -58,16 +58,21 @@ Module::~Module() {
>  /// language options has the given feature.
>  static bool hasFeature(StringRef Feature, const LangOptions &LangOpts,
>                         const TargetInfo &Target) {
> -  return llvm::StringSwitch<bool>(Feature)
> -           .Case("altivec", LangOpts.AltiVec)
> -           .Case("blocks", LangOpts.Blocks)
> -           .Case("cplusplus", LangOpts.CPlusPlus)
> -           .Case("cplusplus11", LangOpts.CPlusPlus11)
> -           .Case("objc", LangOpts.ObjC1)
> -           .Case("objc_arc", LangOpts.ObjCAutoRefCount)
> -           .Case("opencl", LangOpts.OpenCL)
> -           .Case("tls", Target.isTLSSupported())
> -           .Default(Target.hasFeature(Feature));
> +  bool HasFeature = llvm::StringSwitch<bool>(Feature)
> +                        .Case("altivec", LangOpts.AltiVec)
> +                        .Case("blocks", LangOpts.Blocks)
> +                        .Case("cplusplus", LangOpts.CPlusPlus)
> +                        .Case("cplusplus11", LangOpts.CPlusPlus11)
> +                        .Case("objc", LangOpts.ObjC1)
> +                        .Case("objc_arc", LangOpts.ObjCAutoRefCount)
> +                        .Case("opencl", LangOpts.OpenCL)
> +                        .Case("tls", Target.isTLSSupported())
> +                        .Default(Target.hasFeature(Feature));
> +  if (!HasFeature)
> +    HasFeature = std::find(LangOpts.ModuleFeatures.begin(),
> +                           LangOpts.ModuleFeatures.end(),
> +                           Feature) != LangOpts.ModuleFeatures.end();
> +  return HasFeature;
>  }
>
>  bool Module::isAvailable(const LangOptions &LangOpts, const TargetInfo
> &Target,
>
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=227868&r1=227867&r2=227868&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Feb  2 15:56:15 2015
> @@ -1568,6 +1568,7 @@ static void ParseLangArgs(LangOptions &O
>    Opts.CurrentModule = Args.getLastArgValue(OPT_fmodule_name);
>    Opts.ImplementationOfModule =
>        Args.getLastArgValue(OPT_fmodule_implementation_of);
> +  Opts.ModuleFeatures = Args.getAllArgValues(OPT_fmodule_feature);
>    Opts.NativeHalfType = Opts.NativeHalfType;
>    Opts.HalfArgsAndReturns =
> Args.hasArg(OPT_fallow_half_arguments_and_returns);
>    Opts.GNUAsm = !Args.hasArg(OPT_fno_gnu_inline_asm);
>
> Modified:
> cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map?rev=227868&r1=227867&r2=227868&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map
> (original)
> +++ cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map Mon
> Feb  2 15:56:15 2015
> @@ -16,6 +16,12 @@ framework module DependsOnModule {
>      requires !objc
>      header "not_objc.h"
>    }
> +  explicit module CustomReq1 {
> +    requires custom_req1
> +  }
> +  explicit module CustomReq2 {
> +    requires custom_req2
> +  }
>
>    explicit framework module SubFramework {
>      umbrella header "SubFramework.h"
>
> Modified: cfe/trunk/test/Modules/requires.m
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/requires.m?rev=227868&r1=227867&r2=227868&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Modules/requires.m (original)
> +++ cfe/trunk/test/Modules/requires.m Mon Feb  2 15:56:15 2015
> @@ -1,6 +1,8 @@
>  // RUN: rm -rf %t
> -// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -F
> %S/Inputs %s -verify
> +// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -F
> %S/Inputs %s -verify -fmodule-feature custom_req1
>
>  @import DependsOnModule.CXX; // expected-error{{module
> 'DependsOnModule.CXX' requires feature 'cplusplus'}}
>  @import DependsOnModule.NotCXX;
>  @import DependsOnModule.NotObjC; // expected-error{{module
> 'DependsOnModule.NotObjC' is incompatible with feature 'objc'}}
> + at import DependsOnModule.CustomReq1; // OK
> + at import DependsOnModule.CustomReq2; // expected-error{{module
> 'DependsOnModule.CustomReq2' requires feature 'custom_req2'}}
>
>
> _______________________________________________
> 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/20150615/39ab38a2/attachment.html>


More information about the cfe-commits mailing list