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

Ben Langmuir blangmuir at apple.com
Tue Jun 23 11:25:19 PDT 2015


> On Jun 15, 2015, at 12:03 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> 
> On Mon, Feb 2, 2015 at 1:56 PM, Ben Langmuir <blangmuir at apple.com <mailto: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 <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.

Ack, thanks.  Fixed in r240433.

>  
> 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 <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 <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 <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 <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 <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 <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 <mailto:cfe-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits <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/20150623/0afbb188/attachment.html>


More information about the cfe-commits mailing list