<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi Richard,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I guess the problem is that the header file itself is really large and we have all these configurations that depending on versions/extensions expose different
 builtin libraries. They are all based on the core part though which is already large.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Ideally it would be nice to test the full functionality but I agree the price is probably quite high at the moment. Something we could immediately cut down
 though is all configurations with –fblocks. I think we are implicitly setting it now with –std=CL2.0.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Also I am not sure why we are testing different targets. I don’t think we have many target specific bits in the header? Apart from the common code I can I only
 see AMD specific part. Perhaps testing for SPIR and AMD targets only should be enough? Also the tests doesn’t really check for anything AMD specific. Perhaps that could be improved as well…<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Cheers,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Anastasia<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> cfe-commits [mailto:cfe-commits-bounces@lists.llvm.org]
<b>On Behalf Of </b>Richard Smith via cfe-commits<br>
<b>Sent:</b> 03 November 2016 22:10<br>
<b>To:</b> Yaxun Liu<br>
<b>Cc:</b> cfe-commits<br>
<b>Subject:</b> Re: r273191 - [OpenCL] Include opencl-c.h by default as a clang module<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Hi,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">This test (test/Headers/<a href="http://opencl-c-header.cl">opencl-c-header.cl</a>) is *extremely* slow -- it parses the 17KLoC opencl-c.h header 40 times, and on my Debug builds it's the slowest test by far, taking nearly 2 minutes to
 run *alone*. (For reference, the *entire clang test suite* finishes in 90s on my machine with this test removed.)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Please can you do something about this? Do we really need to parse this header in 40 configurations here?<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Mon, Jun 20, 2016 at 12:26 PM, Yaxun Liu via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<o:p></o:p></p>
<p class="MsoNormal">Author: yaxunl<br>
Date: Mon Jun 20 14:26:00 2016<br>
New Revision: 273191<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=273191&view=rev" target="_blank">
http://llvm.org/viewvc/llvm-project?rev=273191&view=rev</a><br>
Log:<br>
[OpenCL] Include opencl-c.h by default as a clang module<br>
<br>
Include opencl-c.h by default as a module to utilize the automatic AST caching mechanism of clang modules.<br>
<br>
Add an option -finclude-default-header to enable default header for OpenCL, which is off by default.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D20444" target="_blank">http://reviews.llvm.org/D20444</a><br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/LangOptions.def<br>
    cfe/trunk/include/clang/Driver/CC1Options.td<br>
    cfe/trunk/include/clang/Frontend/CompilerInvocation.h<br>
    cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
    cfe/trunk/lib/Headers/module.modulemap<br>
    cfe/trunk/test/Headers/<a href="http://opencl-c-header.cl" target="_blank">opencl-c-header.cl</a><br>
<br>
Modified: cfe/trunk/include/clang/Basic/LangOptions.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=273191&r1=273190&r2=273191&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=273191&r1=273190&r2=273191&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/LangOptions.def (original)<br>
+++ cfe/trunk/include/clang/Basic/LangOptions.def Mon Jun 20 14:26:00 2016<br>
@@ -218,7 +218,7 @@ LANGOPT(ObjCWeak            , 1, 0, "Obj<br>
 LANGOPT(ObjCSubscriptingLegacyRuntime         , 1, 0, "Subscripting support in legacy ObjectiveC runtime")<br>
 LANGOPT(FakeAddressSpaceMap , 1, 0, "OpenCL fake address space map")<br>
 ENUM_LANGOPT(AddressSpaceMapMangling , AddrSpaceMapMangling, 2, ASMM_Target, "OpenCL address space map mangling mode")<br>
-<br>
+LANGOPT(IncludeDefaultHeader, 1, 0, "Include default header file for OpenCL")<br>
 BENIGN_LANGOPT(DelayedTemplateParsing , 1, 0, "delayed template parsing")<br>
 LANGOPT(BlocksRuntimeOptional , 1, 0, "optional blocks runtime")<br>
<br>
<br>
Modified: cfe/trunk/include/clang/Driver/CC1Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=273191&r1=273190&r2=273191&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=273191&r1=273190&r2=273191&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/CC1Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/CC1Options.td Mon Jun 20 14:26:00 2016<br>
@@ -612,6 +612,8 @@ def fallow_half_arguments_and_returns :<br>
   HelpText<"Allow function arguments and returns of type half">;<br>
 def fdefault_calling_conv_EQ : Joined<["-"], "fdefault-calling-conv=">,<br>
   HelpText<"Set default MS calling convention">;<br>
+def finclude_default_header : Flag<["-"], "finclude-default-header">,<br>
+  HelpText<"Include the default header file for OpenCL">;<br>
<br>
 // C++ TSes.<br>
 def fcoroutines : Flag<["-"], "fcoroutines">,<br>
<br>
Modified: cfe/trunk/include/clang/Frontend/CompilerInvocation.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CompilerInvocation.h?rev=273191&r1=273190&r2=273191&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CompilerInvocation.h?rev=273191&r1=273190&r2=273191&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Frontend/CompilerInvocation.h (original)<br>
+++ cfe/trunk/include/clang/Frontend/CompilerInvocation.h Mon Jun 20 14:26:00 2016<br>
@@ -155,9 +155,10 @@ public:<br>
   /// \param Opts - The LangOptions object to set up.<br>
   /// \param IK - The input language.<br>
   /// \param T - The target triple.<br>
+  /// \param PPOpts - The PreprocessorOptions affected.<br>
   /// \param LangStd - The input language standard.<br>
   static void setLangDefaults(LangOptions &Opts, InputKind IK,<br>
-                   const llvm::Triple &T,<br>
+                   const llvm::Triple &T, PreprocessorOptions &PPOpts,<br>
                    LangStandard::Kind LangStd = LangStandard::lang_unspecified);<br>
<br>
   /// \brief Retrieve a module hash string that is suitable for uniquely<br>
<br>
Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=273191&r1=273190&r2=273191&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=273191&r1=273190&r2=273191&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Jun 20 14:26:00 2016<br>
@@ -1459,6 +1459,7 @@ bool isOpenCL(LangStandard::Kind LangStd<br>
<br>
 void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,<br>
                                          const llvm::Triple &T,<br>
+                                         PreprocessorOptions &PPOpts,<br>
                                          LangStandard::Kind LangStd) {<br>
   // Set some properties which depend solely on the input kind; it would be nice<br>
   // to move these to the language standard, and have the driver resolve the<br>
@@ -1543,6 +1544,10 @@ void CompilerInvocation::setLangDefaults<br>
     Opts.DefaultFPContract = 1;<br>
     Opts.NativeHalfType = 1;<br>
     Opts.NativeHalfArgsAndReturns = 1;<br>
+    // Include default header file for OpenCL.<br>
+    if (Opts.IncludeDefaultHeader) {<br>
+      PPOpts.Includes.push_back("opencl-c.h");<br>
+    }<br>
   }<br>
<br>
   Opts.CUDA = IK == IK_CUDA || IK == IK_PreprocessedCuda ||<br>
@@ -1589,6 +1594,7 @@ static Visibility parseVisibility(Arg *a<br>
<br>
 static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,<br>
                           const TargetOptions &TargetOpts,<br>
+                          PreprocessorOptions &PPOpts,<br>
                           DiagnosticsEngine &Diags) {<br>
   // FIXME: Cleanup per-file based stuff.<br>
   LangStandard::Kind LangStd = LangStandard::lang_unspecified;<br>
@@ -1660,8 +1666,10 @@ static void ParseLangArgs(LangOptions &O<br>
       LangStd = OpenCLLangStd;<br>
   }<br>
<br>
+  Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);<br>
+<br>
   llvm::Triple T(TargetOpts.Triple);<br>
-  CompilerInvocation::setLangDefaults(Opts, IK, T, LangStd);<br>
+  CompilerInvocation::setLangDefaults(Opts, IK, T, PPOpts, LangStd);<br>
<br>
   // We abuse '-f[no-]gnu-keywords' to force overriding all GNU-extension<br>
   // keywords. This behavior is provided by GCC's poorly named '-fasm' flag,<br>
@@ -2331,7 +2339,8 @@ bool CompilerInvocation::CreateFromArgs(<br>
                         Diags, LangOpts.Sanitize);<br>
   } else {<br>
     // Other LangOpts are only initialzed when the input is not AST or LLVM IR.<br>
-    ParseLangArgs(LangOpts, Args, DashX, Res.getTargetOpts(), Diags);<br>
+    ParseLangArgs(LangOpts, Args, DashX, Res.getTargetOpts(),<br>
+      Res.getPreprocessorOpts(), Diags);<br>
     if (Res.getFrontendOpts().ProgramAction == frontend::RewriteObjC)<br>
       LangOpts.ObjCExceptions = 1;<br>
   }<br>
<br>
Modified: cfe/trunk/lib/Headers/module.modulemap<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/module.modulemap?rev=273191&r1=273190&r2=273191&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/module.modulemap?rev=273191&r1=273190&r2=273191&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Headers/module.modulemap (original)<br>
+++ cfe/trunk/lib/Headers/module.modulemap Mon Jun 20 14:26:00 2016<br>
@@ -157,3 +157,8 @@ module _Builtin_intrinsics [system] [ext<br>
 module _Builtin_stddef_max_align_t [system] [extern_c] {<br>
   header "__stddef_max_align_t.h"<br>
 }<br>
+<br>
+module opencl_c {<br>
+  requires opencl<br>
+  header "opencl-c.h"<br>
+}<br>
<br>
Modified: cfe/trunk/test/Headers/<a href="http://opencl-c-header.cl" target="_blank">opencl-c-header.cl</a><br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/opencl-c-header.cl?rev=273191&r1=273190&r2=273191&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/opencl-c-header.cl?rev=273191&r1=273190&r2=273191&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Headers/<a href="http://opencl-c-header.cl" target="_blank">opencl-c-header.cl</a> (original)<br>
+++ cfe/trunk/test/Headers/<a href="http://opencl-c-header.cl" target="_blank">opencl-c-header.cl</a> Mon Jun 20 14:26:00 2016<br>
@@ -1,33 +1,90 @@<br>
 // RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s<br>
 // RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1| FileCheck %s<br>
 // RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2| FileCheck %s<br>
-// RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck %s<br>
+// RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s<br>
 // RUN: %clang_cc1 -triple spir64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s<br>
 // RUN: %clang_cc1 -triple spir64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1| FileCheck %s<br>
 // RUN: %clang_cc1 -triple spir64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2| FileCheck %s<br>
-// RUN: %clang_cc1 -triple spir64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck %s<br>
+// RUN: %clang_cc1 -triple spir64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s<br>
 // RUN: %clang_cc1 -triple amdgcn-unknown-amdhsa -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s<br>
 // RUN: %clang_cc1 -triple amdgcn-unknown-amdhsa -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1| FileCheck %s<br>
 // RUN: %clang_cc1 -triple amdgcn-unknown-amdhsa -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2| FileCheck %s<br>
-// RUN: %clang_cc1 -triple amdgcn-unknown-amdhsa -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck %s<br>
+// RUN: %clang_cc1 -triple amdgcn-unknown-amdhsa -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s<br>
 // RUN: %clang_cc1 -triple ppc64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s<br>
 // RUN: %clang_cc1 -triple ppc64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1| FileCheck %s<br>
 // RUN: %clang_cc1 -triple ppc64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2| FileCheck %s<br>
-// RUN: %clang_cc1 -triple ppc64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck %s<br>
+// RUN: %clang_cc1 -triple ppc64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s<br>
 // RUN: %clang_cc1 -triple powerpc-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s<br>
 // RUN: %clang_cc1 -triple powerpc-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1| FileCheck %s<br>
 // RUN: %clang_cc1 -triple powerpc-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2| FileCheck %s<br>
-// RUN: %clang_cc1 -triple powerpc-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck %s<br>
+// RUN: %clang_cc1 -triple powerpc-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s<br>
 // RUN: %clang_cc1 -triple nvptx-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s<br>
 // RUN: %clang_cc1 -triple nvptx-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1| FileCheck %s<br>
 // RUN: %clang_cc1 -triple nvptx-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2| FileCheck %s<br>
-// RUN: %clang_cc1 -triple nvptx-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck %s<br>
+// RUN: %clang_cc1 -triple nvptx-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s<br>
 // RUN: %clang_cc1 -triple nvptx64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s<br>
 // RUN: %clang_cc1 -triple nvptx64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1| FileCheck %s<br>
 // RUN: %clang_cc1 -triple nvptx64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2| FileCheck %s<br>
-// RUN: %clang_cc1 -triple nvptx64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck %s<br>
+// RUN: %clang_cc1 -triple nvptx64-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s<br>
<br>
+// RUN: %clang_cc1 -finclude-default-header -emit-llvm -o - %s | FileCheck %s<br>
 // CHECK: _Z16convert_char_rtec<br>
+// CHECK-NOT: _Z3ctzc<br>
+// CHECK20: _Z3ctzc<br>
+// CHECK20-NOT: _Z16convert_char_rtec<br>
+// CHECK-MOD: Reading modules<br>
+<br>
+// Test including the default header as a module.<br>
+// The module should be compiled only once and loaded from cache afterwards.<br>
+// Change the directory mode to read only to make sure no new modules are created.<br>
+// Check time report to make sure module is used.<br>
+<br>
+// ===<br>
+// Clear current directory.<br>
+// RUN: rm -rf %t<br>
+// RUN: mkdir -p %t<br>
+<br>
+// ===<br>
+// Compile for OpenCL 1.0 for the first time. A module should be generated.<br>
+// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o - -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK --check-prefix=CHECK-MOD %s<br>
+// RUN: chmod u-w %t/opencl_c.pcm<br>
+<br>
+// ===<br>
+// Compile for OpenCL 1.0 for the second time. The module should not be re-created.<br>
+// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o - -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK --check-prefix=CHECK-MOD %s<br>
+// RUN: chmod u+w %t/opencl_c.pcm<br>
+// RUN: mv %t/opencl_c.pcm %t/1_0.pcm<br>
+<br>
+// ===<br>
+// Compile for OpenCL 2.0 for the first time. The module should change.<br>
+// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD
 %s<br>
+// RUN: not diff %t/1_0.pcm %t/opencl_c.pcm<br>
+// RUN: chmod u-w %t/opencl_c.pcm<br>
+<br>
+// ===<br>
+// Compile for OpenCL 2.0 for the second time. The module should not change.<br>
+// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD
 %s<br>
+<br>
+// Check cached module works for different OpenCL versions.<br>
+// RUN: rm -rf %t<br>
+// RUN: mkdir -p %t<br>
+// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o - -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK --check-prefix=CHECK-MOD %s<br>
+// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s<br>
+// RUN: %clang_cc1 -triple amdgcn--amdhsa -emit-llvm -o - -cl-std=CL2.0  -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s<br>
+// RUN: chmod u-w %t/*<br>
+// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o - -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK --check-prefix=CHECK-MOD %s<br>
+// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s<br>
+// RUN: %clang_cc1 -triple amdgcn--amdhsa -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s<br>
+// RUN: chmod u+w %t/*<br>
+<br>
 char f(char x) {<br>
+#if __OPENCL_C_VERSION__ != CL_VERSION_2_0<br>
   return convert_char_rte(x);<br>
+#ifdef NO_HEADER<br>
+  //expected-warning@-2{{implicit declaration of function 'convert_char_rte' is invalid in C99}}<br>
+#endif //NO_HEADER<br>
+<br>
+#else //__OPENCL_C_VERSION__<br>
+  return ctz(x);<br>
+#endif //__OPENCL_C_VERSION__<br>
 }<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>