<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Feb 2, 2015 at 1:56 PM, Ben Langmuir <span dir="ltr"><<a href="mailto:blangmuir@apple.com" target="_blank">blangmuir@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: benlangmuir<br>
Date: Mon Feb  2 15:56:15 2015<br>
New Revision: 227868<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D227868-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=d3XnLXZrmIk2hShNdkSBmfNbLja-xHtK8pLE4tSefHE&s=m9La69UVoTpAhIKeg21FL-UyPhBHIT-1UX5297Wngm8&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=227868&view=rev</a><br>
Log:<br>
Add cc1 option '-fmodule-feature' to add custom values for 'requires' decls<br>
<br>
This allows clang-based tools to specify custom features that can be<br>
tested by the 'requires' declaration in a module map file.<br></blockquote><div><br></div><div>Hi Ben,</div><div><br></div><div>It looks like this isn't getting added to the module hash, nor even checked when we pull a module out of the cache.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Modified:<br>
    cfe/trunk/include/clang/Basic/LangOptions.h<br>
    cfe/trunk/include/clang/Driver/CC1Options.td<br>
    cfe/trunk/lib/Basic/Module.cpp<br>
    cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
    cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map<br>
    cfe/trunk/test/Modules/requires.m<br>
<br>
Modified: cfe/trunk/include/clang/Basic/LangOptions.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Basic_LangOptions.h-3Frev-3D227868-26r1-3D227867-26r2-3D227868-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=d3XnLXZrmIk2hShNdkSBmfNbLja-xHtK8pLE4tSefHE&s=1sGvOqF6dqjFOKkRWtFKOUOAM-sN7WUH2vP_hRQ81QA&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=227868&r1=227867&r2=227868&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/LangOptions.h (original)<br>
+++ cfe/trunk/include/clang/Basic/LangOptions.h Mon Feb  2 15:56:15 2015<br>
@@ -92,6 +92,10 @@ public:<br>
   /// treat this as the CurrentModule.<br>
   std::string ImplementationOfModule;<br>
<br>
+  /// \brief The names of any features to enable in module 'requires' decls<br>
+  /// in addition to the hard-coded list in Module.cpp and the target features.<br>
+  std::vector<std::string> ModuleFeatures;<br>
+<br>
   /// \brief Options for parsing comments.<br>
   CommentOptions CommentOpts;<br>
<br>
<br>
Modified: cfe/trunk/include/clang/Driver/CC1Options.td<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Driver_CC1Options.td-3Frev-3D227868-26r1-3D227867-26r2-3D227868-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=d3XnLXZrmIk2hShNdkSBmfNbLja-xHtK8pLE4tSefHE&s=WsUyfc4592vWHELtWSybJGDmaI1qr1kIfFdu264i7rc&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=227868&r1=227867&r2=227868&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/CC1Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/CC1Options.td Mon Feb  2 15:56:15 2015<br>
@@ -342,6 +342,9 @@ def fmodule_implementation_of : Separate<br>
 def fmodule_map_file_home_is_cwd : Flag<["-"], "fmodule-map-file-home-is-cwd">,<br>
   HelpText<"Use the current working directory as the home directory of "<br>
            "module maps specified by -fmodule-map-file=<FILE>">;<br>
+def fmodule_feature : Separate<["-"], "fmodule-feature">,<br>
+  MetaVarName<"<feature>">,<br>
+  HelpText<"Enable <feature> in module map requires declarations">;<br>
<br>
 let Group = Action_Group in {<br>
<br>
<br>
Modified: cfe/trunk/lib/Basic/Module.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Basic_Module.cpp-3Frev-3D227868-26r1-3D227867-26r2-3D227868-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=d3XnLXZrmIk2hShNdkSBmfNbLja-xHtK8pLE4tSefHE&s=XVNRDPO344IAVW3Zjg_SDBiyfc78lpkduu4PTmzfuJo&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Module.cpp?rev=227868&r1=227867&r2=227868&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Basic/Module.cpp (original)<br>
+++ cfe/trunk/lib/Basic/Module.cpp Mon Feb  2 15:56:15 2015<br>
@@ -58,16 +58,21 @@ Module::~Module() {<br>
 /// language options has the given feature.<br>
 static bool hasFeature(StringRef Feature, const LangOptions &LangOpts,<br>
                        const TargetInfo &Target) {<br>
-  return llvm::StringSwitch<bool>(Feature)<br>
-           .Case("altivec", LangOpts.AltiVec)<br>
-           .Case("blocks", LangOpts.Blocks)<br>
-           .Case("cplusplus", LangOpts.CPlusPlus)<br>
-           .Case("cplusplus11", LangOpts.CPlusPlus11)<br>
-           .Case("objc", LangOpts.ObjC1)<br>
-           .Case("objc_arc", LangOpts.ObjCAutoRefCount)<br>
-           .Case("opencl", LangOpts.OpenCL)<br>
-           .Case("tls", Target.isTLSSupported())<br>
-           .Default(Target.hasFeature(Feature));<br>
+  bool HasFeature = llvm::StringSwitch<bool>(Feature)<br>
+                        .Case("altivec", LangOpts.AltiVec)<br>
+                        .Case("blocks", LangOpts.Blocks)<br>
+                        .Case("cplusplus", LangOpts.CPlusPlus)<br>
+                        .Case("cplusplus11", LangOpts.CPlusPlus11)<br>
+                        .Case("objc", LangOpts.ObjC1)<br>
+                        .Case("objc_arc", LangOpts.ObjCAutoRefCount)<br>
+                        .Case("opencl", LangOpts.OpenCL)<br>
+                        .Case("tls", Target.isTLSSupported())<br>
+                        .Default(Target.hasFeature(Feature));<br>
+  if (!HasFeature)<br>
+    HasFeature = std::find(LangOpts.ModuleFeatures.begin(),<br>
+                           LangOpts.ModuleFeatures.end(),<br>
+                           Feature) != LangOpts.ModuleFeatures.end();<br>
+  return HasFeature;<br>
 }<br>
<br>
 bool Module::isAvailable(const LangOptions &LangOpts, const TargetInfo &Target,<br>
<br>
Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Frontend_CompilerInvocation.cpp-3Frev-3D227868-26r1-3D227867-26r2-3D227868-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=d3XnLXZrmIk2hShNdkSBmfNbLja-xHtK8pLE4tSefHE&s=Vs8EsGd2mR1iZchlUHa965pmANM4KIoM0xQoyNbwpeg&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=227868&r1=227867&r2=227868&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Feb  2 15:56:15 2015<br>
@@ -1568,6 +1568,7 @@ static void ParseLangArgs(LangOptions &O<br>
   Opts.CurrentModule = Args.getLastArgValue(OPT_fmodule_name);<br>
   Opts.ImplementationOfModule =<br>
       Args.getLastArgValue(OPT_fmodule_implementation_of);<br>
+  Opts.ModuleFeatures = Args.getAllArgValues(OPT_fmodule_feature);<br>
   Opts.NativeHalfType = Opts.NativeHalfType;<br>
   Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns);<br>
   Opts.GNUAsm = !Args.hasArg(OPT_fno_gnu_inline_asm);<br>
<br>
Modified: cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Modules_Inputs_DependsOnModule.framework_module.map-3Frev-3D227868-26r1-3D227867-26r2-3D227868-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=d3XnLXZrmIk2hShNdkSBmfNbLja-xHtK8pLE4tSefHE&s=OkbvQFgu1C53mWfbfhp17sPyqHQyZU48bkyXCqdj-UQ&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map?rev=227868&r1=227867&r2=227868&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map (original)<br>
+++ cfe/trunk/test/Modules/Inputs/DependsOnModule.framework/module.map Mon Feb  2 15:56:15 2015<br>
@@ -16,6 +16,12 @@ framework module DependsOnModule {<br>
     requires !objc<br>
     header "not_objc.h"<br>
   }<br>
+  explicit module CustomReq1 {<br>
+    requires custom_req1<br>
+  }<br>
+  explicit module CustomReq2 {<br>
+    requires custom_req2<br>
+  }<br>
<br>
   explicit framework module SubFramework {<br>
     umbrella header "SubFramework.h"<br>
<br>
Modified: cfe/trunk/test/Modules/requires.m<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Modules_requires.m-3Frev-3D227868-26r1-3D227867-26r2-3D227868-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=d3XnLXZrmIk2hShNdkSBmfNbLja-xHtK8pLE4tSefHE&s=DaVsFiAwWsu3A4gQv6S856m7M8QmITwZZXfWN8qy52k&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/requires.m?rev=227868&r1=227867&r2=227868&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/requires.m (original)<br>
+++ cfe/trunk/test/Modules/requires.m Mon Feb  2 15:56:15 2015<br>
@@ -1,6 +1,8 @@<br>
 // RUN: rm -rf %t<br>
-// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -F %S/Inputs %s -verify<br>
+// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -F %S/Inputs %s -verify -fmodule-feature custom_req1<br>
<br>
 @import DependsOnModule.CXX; // expected-error{{module 'DependsOnModule.CXX' requires feature 'cplusplus'}}<br>
 @import DependsOnModule.NotCXX;<br>
 @import DependsOnModule.NotObjC; // expected-error{{module 'DependsOnModule.NotObjC' is incompatible with feature 'objc'}}<br>
+@import DependsOnModule.CustomReq1; // OK<br>
+@import DependsOnModule.CustomReq2; // expected-error{{module 'DependsOnModule.CustomReq2' requires feature 'custom_req2'}}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>