[PATCH] [cuda] Preserve TLS storage class of host variable during device-side compilation.

David Blaikie dblaikie at gmail.com
Tue Apr 28 13:47:29 PDT 2015


On Tue, Apr 28, 2015 at 1:31 PM, Artem Belevich <tra at google.com> wrote:

> Added better explanation of the test.
>
>
> http://reviews.llvm.org/D9327
>
> Files:
>   lib/Sema/SemaDecl.cpp
>   test/SemaCUDA/qualifiers.cu
>
> Index: lib/Sema/SemaDecl.cpp
> ===================================================================
> --- lib/Sema/SemaDecl.cpp
> +++ lib/Sema/SemaDecl.cpp
> @@ -5769,12 +5769,16 @@
>             diag::err_thread_non_global)
>          << DeclSpec::getSpecifierName(TSCS);
>      else if (!Context.getTargetInfo().isTLSSupported()) {
> -      if (getLangOpts().CUDA)
> +      if (getLangOpts().CUDA) {
>          // Postpone error emission until we've collected attributes
> required to
>          // figure out whether it's a host or device variable and whether
> the
>          // error should be ignored.
>          EmitTLSUnsupportedError = true;
> -      else
> +        // We still need to mark the variable as TLS so it shows up in
> AST with
> +        // proper storage class for other tools to use even if we're not
> going
> +        // to emit any code for it.
> +        NewVD->setTSCSpec(TSCS);
> +      } else
>          Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
>               diag::err_thread_unsupported);
>      } else
> Index: test/SemaCUDA/qualifiers.cu
> ===================================================================
> --- test/SemaCUDA/qualifiers.cu
> +++ test/SemaCUDA/qualifiers.cu
> @@ -1,21 +1,35 @@
>  // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only -verify
> %s
>  // RUN: %clang_cc1 -triple nvptx-unknown-cuda -fsyntax-only -verify
> -fcuda-is-device %s
> +//
> +// We run clang_cc1 with 'not' because source file contains
> +// intentional errors. CC1 failure is expected and must be ignored
> +// here. We're interested in what ends up in AST and that's what
> +// FileCheck verifies.
>

Why are there errors? (the ast of code that is incorrect isn't really
guaranteed, so this might be an unstable/unreliable test - perhaps we could
split out the error cases from the successful cases (& I'd still like to
consider IRGen testing the successful cases, rather than checking the AST -
the former seems like a better contract for Clang to abide by (the AST is a
bit more of an implementation detail)))


> +// RUN: not %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only
> -ast-dump %s \
> +// RUN:   | FileCheck %s --check-prefix=CHECK-ALL
> --check-prefix=CHECK-HOST
> +// RUN: not %clang_cc1 -triple nvptx-unknown-cuda -fsyntax-only -ast-dump
> -fcuda-is-device %s \
> +// RUN:   | FileCheck %s --check-prefix=CHECK-ALL
> --check-prefix=CHECK-DEVICE
>
>  #include "Inputs/cuda.h"
>
>  // Host (x86) supports TLS and device-side compilation should ignore
>  // host variables. No errors in either case.
>  int __thread host_tls_var;
> +// CHECK-ALL: host_tls_var 'int' tls
>
>  #if defined(__CUDA_ARCH__)
>  // NVPTX does not support TLS
>  __device__ int __thread device_tls_var; // expected-error {{thread-local
> storage is not supported for the current target}}
> +// CHECK-DEVICE: device_tls_var 'int' tls
>  __shared__ int __thread shared_tls_var; // expected-error {{thread-local
> storage is not supported for the current target}}
> +// CHECK-DEVICE: shared_tls_var 'int' tls
>  #else
>  // Device-side vars should not produce any errors during host-side
>  // compilation.
>  __device__ int __thread device_tls_var;
> +// CHECK-HOST: device_tls_var 'int' tls
>  __shared__ int __thread shared_tls_var;
> +// CHECK-HOST: shared_tls_var 'int' tls
>  #endif
>
>  __global__ void g1(int x) {}
>
> EMAIL PREFERENCES
>   http://reviews.llvm.org/settings/panel/emailpreferences/
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150428/288c73b8/attachment.html>


More information about the cfe-commits mailing list