rgreenblatt added a comment.

In D94337#2491515 <https://reviews.llvm.org/D94337#2491515>, @tra wrote:

> Does it make sense?

Yep, most of what your saying makes sense to me. Thanks for taking the time to 
review this.

A few notes:

> That would still require properly defined CUDA macros. CUDA in clang relies 
> on various CUDA attributes, currently wrapped in 
> `__{host|device|global|etc.}__` macros in order to compile the code. Without 
> them, `-fsyntax-only` will not be give you correct results on most of the 
> CUDA code.
> Most likely you'll see tons of errors when compiler sees `__device__` and has 
> no idea what to do with it. Hence my suggestion that clang needs at least a 
> minimum subset of CUDA headers to provide the critical subset of macros 
> sufficient to convey critical semantics of CUDA code.

Actually this already works (roughly) with the changes made so far. 
For example consider the following header:

  #pragma once
  
  __global__ void a() {
    unsigned block_idx = blockIdx.x;
    unsigned thread_idx = threadIdx.x;
  
    __shfl_down_sync(1, 2, 1);
  }

When saved as a .cuh and compiled as `clang++ file.cuh -fsyntax-only 
--cuda-gpu-arch=sm_75` (using clang++ built from this commit), this works fine 
other than an invalid diagnostic for the #pragma once.
Obviously there are several errors when building this with -x c++-header.
The reason why this "works" is because of the change to Driver.cpp. This change 
makes it so that -x cuda-header is similar (identical?) to that of -x cuda.
Further changes to Driver.cpp will need to happen to avoid warning about 
#pragma once and (if desired) to actually output a precompiled header.

>> A secondary goal was to make it so that header tab completion recognizes 
>> .cuh files.
>> This change doesn't depend on the other changes - it only requires a minor 
>> edit to clang/lib/Sema/SemaCodeComplete.cpp.



> Maybe. It depends on how well clang can recover from the errors induced by 
> the unexpanded CUDA macros. This could range from OK on simple code to rather 
> badly if we fail to instantiate templated code.

I am pretty sure that header tab completion is totally unrelated to the 
syntactic validity of headers; it's just finding the list of files in the 
include path which match the text entered so far and then filtering out files 
without a accepted extension. This change just adds ".cuh" to the list of 
acceptable extensions.

> We may not need the special CUDA header type after that. The tooling 
> heuristic should be able to deal with detecting whether it deals with CUDA 
> sources better than clang -- compilation database + user input should help. 
> If/when tooling knows it deals with CUDA, it can tell so to clang with -x 
> cuda.

This seems like a decent approach to me, but this will result in incorrectly 
issuing a diagnostic for #pragma once.
This can of course be fixed by directly disabling the warning, but this does 
seem a bit hacky. There may also be other header specific behavior, but I can't 
think of any.
On the whole, it does seem a bit gross for tooling to have to compile headers 
as though they are main files.



================
Comment at: clang/lib/Driver/Driver.cpp:2466
         if (!(IA->getType() == types::TY_CUDA ||
+              IA->getType() == types::TY_CUDAHeader ||
               IA->getType() == types::TY_HIP ||
----------------
From my understanding this basically makes the treatment of TY_CUDAHeader 
(-xcuda-header)  identical to TY_CUDA (-xcuda).
Some changes will need to happen below this for correct handling of header 
files (for example not warning about using #pragma once).


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D94337

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

Reply via email to