r338139 - [OPENMP] Static variables on device must be externally visible.

Jonas Hahnfeld via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 27 11:24:15 PDT 2018


Hi Alexey,

from what I can see this change can't handle the case where there are 
static variables with the same name in multiple TUs.
(The same problem exists for static CUDA kernels with -fcuda-rdc. I 
found that nvcc mangles the function names in this case, but didn't have 
time yet to prepare a similar patch for Clang.)

I think for now it would be better to emit a meaningful error instead of 
generating incorrect code and letting the user figure out what went 
wrong.

My 2 cents,
Jonas

On 2018-07-27 19:37, Alexey Bataev via cfe-commits wrote:
> Author: abataev
> Date: Fri Jul 27 10:37:32 2018
> New Revision: 338139
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=338139&view=rev
> Log:
> [OPENMP] Static variables on device must be externally visible.
> 
> Do not mark static variable as internal on the device as they must be
> visible from the host to be mapped correctly.
> 
> Modified:
>     cfe/trunk/lib/AST/ASTContext.cpp
>     cfe/trunk/test/OpenMP/declare_target_codegen.cpp
>     
> cfe/trunk/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp
> 
> Modified: cfe/trunk/lib/AST/ASTContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=338139&r1=338138&r2=338139&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTContext.cpp (original)
> +++ cfe/trunk/lib/AST/ASTContext.cpp Fri Jul 27 10:37:32 2018
> @@ -9504,6 +9504,21 @@ static GVALinkage basicGVALinkageForFunc
>    return GVA_DiscardableODR;
>  }
> 
> +static bool isDeclareTargetToDeclaration(const Decl *VD) {
> +  for (const Decl *D : VD->redecls()) {
> +    if (!D->hasAttrs())
> +      continue;
> +    if (const auto *Attr = D->getAttr<OMPDeclareTargetDeclAttr>())
> +      return Attr->getMapType() == OMPDeclareTargetDeclAttr::MT_To;
> +  }
> +  if (const auto *V = dyn_cast<VarDecl>(VD)) {
> +    if (const VarDecl *TD = V->getTemplateInstantiationPattern())
> +      return isDeclareTargetToDeclaration(TD);
> +  }
> +
> +  return false;
> +}
> +
>  static GVALinkage adjustGVALinkageForAttributes(const ASTContext 
> &Context,
>                                                  const Decl *D, 
> GVALinkage L) {
>    // See http://msdn.microsoft.com/en-us/library/xa0d9ste.aspx
> @@ -9520,6 +9535,12 @@ static GVALinkage adjustGVALinkageForAtt
>      // visible externally so they can be launched from host.
>      if (L == GVA_DiscardableODR || L == GVA_Internal)
>        return GVA_StrongODR;
> +  } else if (Context.getLangOpts().OpenMP &&
> Context.getLangOpts().OpenMPIsDevice &&
> +             isDeclareTargetToDeclaration(D)) {
> +    // Static variables must be visible externally so they can be 
> mapped from
> +    // host.
> +    if (L == GVA_Internal)
> +      return GVA_StrongODR;
>    }
>    return L;
>  }
> 
> Modified: cfe/trunk/test/OpenMP/declare_target_codegen.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_target_codegen.cpp?rev=338139&r1=338138&r2=338139&view=diff
> ==============================================================================
> --- cfe/trunk/test/OpenMP/declare_target_codegen.cpp (original)
> +++ cfe/trunk/test/OpenMP/declare_target_codegen.cpp Fri Jul 27 
> 10:37:32 2018
> @@ -18,12 +18,14 @@
>  // CHECK-DAG: @d = global i32 0,
>  // CHECK-DAG: @c = external global i32,
>  // CHECK-DAG: @globals = global %struct.S zeroinitializer,
> -// CHECK-DAG: @llvm.used = appending global [1 x i8*] [i8* bitcast
> (void ()* @__omp_offloading__{{.+}}_globals_l[[@LINE+41]]_ctor to
> i8*)], section "llvm.metadata"
> +// CHECK-DAG: @{{.+}}stat = weak_odr global %struct.S zeroinitializer,
> +// CHECK-DAG: @llvm.used = appending global [2 x i8*] [i8* bitcast
> (void ()* @__omp_offloading__{{.+}}_globals_l[[@LINE+42]]_ctor to
> i8*), i8* bitcast (void ()*
> @__omp_offloading__{{.+}}_stat_l[[@LINE+43]]_ctor to i8*)], section
> "llvm.metadata"
> 
>  // CHECK-DAG: define {{.*}}i32 
> @{{.*}}{{foo|bar|baz2|baz3|FA|f_method}}{{.*}}()
>  // CHECK-DAG: define {{.*}}void
> @{{.*}}TemplateClass{{.*}}(%class.TemplateClass* %{{.*}})
>  // CHECK-DAG: define {{.*}}i32
> @{{.*}}TemplateClass{{.*}}f_method{{.*}}(%class.TemplateClass*
> %{{.*}})
> -// CHECK-DAG: define {{.*}}void
> @__omp_offloading__{{.*}}_globals_l[[@LINE+36]]_ctor()
> +// CHECK-DAG: define {{.*}}void
> @__omp_offloading__{{.*}}_globals_l[[@LINE+37]]_ctor()
> +// CHECK-DAG: define {{.*}}void
> @__omp_offloading__{{.*}}_stat_l[[@LINE+37]]_ctor()
> 
>  #ifndef HEADER
>  #define HEADER
> @@ -60,6 +62,7 @@ int foo() { return 0; }
>  int b = 15;
>  int d;
>  S globals(d);
> +static S stat(d);
>  #pragma omp end declare target
>  int c;
> 
> 
> Modified: 
> cfe/trunk/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp?rev=338139&r1=338138&r2=338139&view=diff
> ==============================================================================
> ---
> cfe/trunk/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp
> (original)
> +++
> cfe/trunk/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp
> Fri Jul 27 10:37:32 2018
> @@ -15,7 +15,7 @@
> 
>  // SIMD-ONLY-NOT: {{__kmpc|__tgt}}
> 
> -// DEVICE-DAG: [[C_ADDR:.+]] = internal global i32 0,
> +// DEVICE-DAG: [[C_ADDR:.+]] = weak_odr global i32 0,
>  // DEVICE-DAG: [[CD_ADDR:@.+]] = global %struct.S zeroinitializer,
>  // HOST-DAG: @[[C_ADDR:.+]] = internal global i32 0,
>  // HOST-DAG: @[[CD_ADDR:.+]] = global %struct.S zeroinitializer,
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list