Fznamznon added a comment.

In D60455#1467018 <https://reviews.llvm.org/D60455#1467018>, @Anastasia wrote:

> Just to understand how this will work. I would imagine you can have a device 
> function definition preceding its use. When the function is being parsed it's 
> not known yet whether it will be called from the device or not, so it won't 
> be possible to set the language mode correctly and hence provide the right 
> diagnostics. So is the plan to launch a separate parsing phase then just to 
> extract the call graph and annotate the device functions?


I'm not an expert in clang terminology but I will try briefly explain our 
current implementation approach. 
In SYCL all kernel functions should be template functions so these functions 
have a deferred instantiation. If we found that we instantiated a sycl kernel 
function - we add it to a special array with sycl device functions (you can see 
the corresponding code here 
<https://github.com/intel/llvm/blob/0df0754f9f0a519a0938fc60de15614b3e0059fd/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp#L5448>
 and here 
<https://github.com/intel/llvm/blob/0df0754f9f0a519a0938fc60de15614b3e0059fd/clang/lib/Sema/SemaSYCL.cpp#L785>,
 actually `AddSyclKernel` adds declaration to the special array inside the 
Sema).  After performing
pending instantiations we run a recursive AST visitor for each SYCL kernel to 
mark all device functions and add them to a special array with SYCL device 
functions (here 
<https://github.com/intel/llvm/blob/0df0754f9f0a519a0938fc60de15614b3e0059fd/clang/lib/Sema/Sema.cpp#L925>
 we start traverse AST from `MarkDevice` function, code of `MarkDevice` is here 
<https://github.com/intel/llvm/blob/0df0754f9f0a519a0938fc60de15614b3e0059fd/clang/lib/Sema/SemaSYCL.cpp#L788>).
To get a correct set of SYCL device functions in produced module we added a 
check for all declarations inside the CodeGen on  `sycl_device` attribute 
existence - so it will ignore declarations without `sycl_device` attribute if 
we are compiling for SYCL device (code is here 
<https://github.com/intel/llvm/blob/0df0754f9f0a519a0938fc60de15614b3e0059fd/clang/lib/CodeGen/CodeGenModule.cpp#L2188>).
 But with this check it's possible situation when function was parsed and 
ignored by the CodeGen before we added `sycl_device' attribute to it so we 
added yet another parsing action inside the clang::ParseAST to generate code 
for all SYCL device functions from the special array (code is here 
<https://github.com/intel/llvm/blob/0df0754f9f0a519a0938fc60de15614b3e0059fd/clang/lib/Parse/ParseAST.cpp#L169>).

> Ok, my question is whether you are planning to duplicate the same logic as 
> for OpenCL kernel which doesn't really seem like an ideal design choice. Is 
> this the only difference then we can simply add an extra check for SYCL 
> compilation mode in this template handling case. The overall interaction 
> between OpenCL and SYCL implementation is still a very big unknown to me so 
> it's not very easy to judge about the implementations details...

Of course, if nothing prevents us to re-use OpenCL kernel attribute for SYCL I 
assume it would be good idea. 
But I'm thinking about the situation with https://reviews.llvm.org/D60454 . If 
we re-use OpenCL kernel attributes - we affected by OpenCL-related changes and 
OpenCL-related changes shouldn't violate SYCL semantics. Will it be usable for 
SYCL/OpenCL clang developers? @bader , what do you think about it?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D60455/new/

https://reviews.llvm.org/D60455



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to