[PATCH] D24975: [CUDA] Add #pragma clang force_cuda_host_device_{begin, end} pragmas.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 27 14:07:40 PDT 2016


rsmith added inline comments.

================
Comment at: clang/lib/Parse/ParsePragma.cpp:172
@@ +171,3 @@
+  PragmaForceCUDAHostDeviceStartHandler(Sema &Actions)
+      : PragmaHandler("force_cuda_host_device_begin"), Actions(Actions) {}
+  void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
----------------
I think this would be more consistent with the behavior of our other pragmas as two tokens rather than one:

  #pragma clang force_cuda_host_device begin
  #pragma clang force_cuda_host_device end

It's also more extensible this way, for instance if we later want some kind of push/pop mechanism to temporarily leave force-host-device mode. (Maybe we could even use `#pragma clang cuda force_host_device begin`, but I'm fine with either choice there.)

================
Comment at: clang/lib/Sema/SemaCUDA.cpp:466-472
@@ +465,9 @@
+
+  if (ForceCUDAHostDeviceDepth > 0) {
+    if (!NewD->hasAttr<CUDAHostAttr>())
+      NewD->addAttr(CUDAHostAttr::CreateImplicit(Context));
+    if (!NewD->hasAttr<CUDADeviceAttr>())
+      NewD->addAttr(CUDADeviceAttr::CreateImplicit(Context));
+    return;
+  }
+
----------------
Does this apply within template instantiations? I'm concerned about two cases:

1) Eagerly-instantiated declarations whose instantiation is triggered within one of these scopes:

```
template<typename T> auto f() { return T(); }
template<typename T> struct X { void f(); };
#pragma clang force_cuda_host_device_begin
int n = f<int>(); // is f<int> implicitly __host__ __device__?
X<int> x; // is X<int>::f implicitly __host__ __device__?
#pragma clang force_cuda_host_device_end
```

2) Template instantiation at the end of the TU if we have a begin but no end:
```
    template<typename T> int f() { return T(); }
    #pragma clang force_cuda_host_device_begin
    int n = f<int>(); // is f<int> implicitly __host__ __device__?
```

I would expect the answer in each case to be that the function is __host__. Even if these do work correctly already, please add some testcases.


https://reviews.llvm.org/D24975





More information about the cfe-commits mailing list