<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>The error message is a too strict solution. I think we can emit
      just a warning in this case to warn the user that there might be
      the variable with the same name in the different TU.<br>
    </p>
    <pre class="moz-signature" cols="72">-------------
Best regards,
Alexey Bataev</pre>
    <div class="moz-cite-prefix">27.07.2018 14:24, Jonas Hahnfeld via
      cfe-commits пишет:<br>
    </div>
    <blockquote type="cite"
      cite="mid:%3C34ec978be8932ba5225b7f9f10672169@hahnjo.de%3E">Hi
      Alexey,
      <br>
      <br>
      from what I can see this change can't handle the case where there
      are static variables with the same name in multiple TUs.
      <br>
      (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.)
      <br>
      <br>
      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.
      <br>
      <br>
      My 2 cents,
      <br>
      Jonas
      <br>
      <br>
      On 2018-07-27 19:37, Alexey Bataev via cfe-commits wrote:
      <br>
      <blockquote type="cite">Author: abataev
        <br>
        Date: Fri Jul 27 10:37:32 2018
        <br>
        New Revision: 338139
        <br>
        <br>
        URL: <a class="moz-txt-link-freetext" href="http://llvm.org/viewvc/llvm-project?rev=338139&view=rev">http://llvm.org/viewvc/llvm-project?rev=338139&view=rev</a>
        <br>
        Log:
        <br>
        [OPENMP] Static variables on device must be externally visible.
        <br>
        <br>
        Do not mark static variable as internal on the device as they
        must be
        <br>
        visible from the host to be mapped correctly.
        <br>
        <br>
        Modified:
        <br>
            cfe/trunk/lib/AST/ASTContext.cpp
        <br>
            cfe/trunk/test/OpenMP/declare_target_codegen.cpp
        <br>
           
        cfe/trunk/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp
        <br>
        <br>
        Modified: cfe/trunk/lib/AST/ASTContext.cpp
        <br>
        URL:
        <br>
<a class="moz-txt-link-freetext" href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=338139&r1=338138&r2=338139&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=338139&r1=338138&r2=338139&view=diff</a>
        <br>
==============================================================================
        <br>
        --- cfe/trunk/lib/AST/ASTContext.cpp (original)
        <br>
        +++ cfe/trunk/lib/AST/ASTContext.cpp Fri Jul 27 10:37:32 2018
        <br>
        @@ -9504,6 +9504,21 @@ static GVALinkage basicGVALinkageForFunc
        <br>
           return GVA_DiscardableODR;
        <br>
         }
        <br>
        <br>
        +static bool isDeclareTargetToDeclaration(const Decl *VD) {
        <br>
        +  for (const Decl *D : VD->redecls()) {
        <br>
        +    if (!D->hasAttrs())
        <br>
        +      continue;
        <br>
        +    if (const auto *Attr =
        D->getAttr<OMPDeclareTargetDeclAttr>())
        <br>
        +      return Attr->getMapType() ==
        OMPDeclareTargetDeclAttr::MT_To;
        <br>
        +  }
        <br>
        +  if (const auto *V = dyn_cast<VarDecl>(VD)) {
        <br>
        +    if (const VarDecl *TD =
        V->getTemplateInstantiationPattern())
        <br>
        +      return isDeclareTargetToDeclaration(TD);
        <br>
        +  }
        <br>
        +
        <br>
        +  return false;
        <br>
        +}
        <br>
        +
        <br>
         static GVALinkage adjustGVALinkageForAttributes(const
        ASTContext &Context,
        <br>
                                                         const Decl *D,
        GVALinkage L) {
        <br>
           // See <a class="moz-txt-link-freetext" href="http://msdn.microsoft.com/en-us/library/xa0d9ste.aspx">http://msdn.microsoft.com/en-us/library/xa0d9ste.aspx</a>
        <br>
        @@ -9520,6 +9535,12 @@ static GVALinkage adjustGVALinkageForAtt
        <br>
             // visible externally so they can be launched from host.
        <br>
             if (L == GVA_DiscardableODR || L == GVA_Internal)
        <br>
               return GVA_StrongODR;
        <br>
        +  } else if (Context.getLangOpts().OpenMP &&
        <br>
        Context.getLangOpts().OpenMPIsDevice &&
        <br>
        +             isDeclareTargetToDeclaration(D)) {
        <br>
        +    // Static variables must be visible externally so they can
        be mapped from
        <br>
        +    // host.
        <br>
        +    if (L == GVA_Internal)
        <br>
        +      return GVA_StrongODR;
        <br>
           }
        <br>
           return L;
        <br>
         }
        <br>
        <br>
        Modified: cfe/trunk/test/OpenMP/declare_target_codegen.cpp
        <br>
        URL:
        <br>
<a class="moz-txt-link-freetext" href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_target_codegen.cpp?rev=338139&r1=338138&r2=338139&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_target_codegen.cpp?rev=338139&r1=338138&r2=338139&view=diff</a>
        <br>
==============================================================================
        <br>
        --- cfe/trunk/test/OpenMP/declare_target_codegen.cpp (original)
        <br>
        +++ cfe/trunk/test/OpenMP/declare_target_codegen.cpp Fri Jul 27
        10:37:32 2018
        <br>
        @@ -18,12 +18,14 @@
        <br>
         // CHECK-DAG: @d = global i32 0,
        <br>
         // CHECK-DAG: @c = external global i32,
        <br>
         // CHECK-DAG: @globals = global %struct.S zeroinitializer,
        <br>
        -// CHECK-DAG: @llvm.used = appending global [1 x i8*] [i8*
        bitcast
        <br>
        (void ()* @__omp_offloading__{{.+}}_globals_l[[@LINE+41]]_ctor
        to
        <br>
        i8*)], section "llvm.metadata"
        <br>
        +// CHECK-DAG: @{{.+}}stat = weak_odr global %struct.S
        zeroinitializer,
        <br>
        +// CHECK-DAG: @llvm.used = appending global [2 x i8*] [i8*
        bitcast
        <br>
        (void ()* @__omp_offloading__{{.+}}_globals_l[[@LINE+42]]_ctor
        to
        <br>
        i8*), i8* bitcast (void ()*
        <br>
        @__omp_offloading__{{.+}}_stat_l[[@LINE+43]]_ctor to i8*)],
        section
        <br>
        "llvm.metadata"
        <br>
        <br>
         // CHECK-DAG: define {{.*}}i32
        @{{.*}}{{foo|bar|baz2|baz3|FA|f_method}}{{.*}}()
        <br>
         // CHECK-DAG: define {{.*}}void
        <br>
        @{{.*}}TemplateClass{{.*}}(%class.TemplateClass* %{{.*}})
        <br>
         // CHECK-DAG: define {{.*}}i32
        <br>
        @{{.*}}TemplateClass{{.*}}f_method{{.*}}(%class.TemplateClass*
        <br>
        %{{.*}})
        <br>
        -// CHECK-DAG: define {{.*}}void
        <br>
        @__omp_offloading__{{.*}}_globals_l[[@LINE+36]]_ctor()
        <br>
        +// CHECK-DAG: define {{.*}}void
        <br>
        @__omp_offloading__{{.*}}_globals_l[[@LINE+37]]_ctor()
        <br>
        +// CHECK-DAG: define {{.*}}void
        <br>
        @__omp_offloading__{{.*}}_stat_l[[@LINE+37]]_ctor()
        <br>
        <br>
         #ifndef HEADER
        <br>
         #define HEADER
        <br>
        @@ -60,6 +62,7 @@ int foo() { return 0; }
        <br>
         int b = 15;
        <br>
         int d;
        <br>
         S globals(d);
        <br>
        +static S stat(d);
        <br>
         #pragma omp end declare target
        <br>
         int c;
        <br>
        <br>
        <br>
        Modified:
        cfe/trunk/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp
        <br>
        URL:
        <br>
<a class="moz-txt-link-freetext" href="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">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</a>
        <br>
==============================================================================
        <br>
        ---
        <br>
cfe/trunk/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp
        <br>
        (original)
        <br>
        +++
        <br>
cfe/trunk/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp
        <br>
        Fri Jul 27 10:37:32 2018
        <br>
        @@ -15,7 +15,7 @@
        <br>
        <br>
         // SIMD-ONLY-NOT: {{__kmpc|__tgt}}
        <br>
        <br>
        -// DEVICE-DAG: [[C_ADDR:.+]] = internal global i32 0,
        <br>
        +// DEVICE-DAG: [[C_ADDR:.+]] = weak_odr global i32 0,
        <br>
         // DEVICE-DAG: [[<a class="moz-txt-link-abbreviated" href="mailto:CD_ADDR:@.+">CD_ADDR:@.+</a>]] = global %struct.S
        zeroinitializer,
        <br>
         // HOST-DAG: @[[C_ADDR:.+]] = internal global i32 0,
        <br>
         // HOST-DAG: @[[CD_ADDR:.+]] = global %struct.S
        zeroinitializer,
        <br>
        <br>
        <br>
        _______________________________________________
        <br>
        cfe-commits mailing list
        <br>
        <a class="moz-txt-link-abbreviated" href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>
        <br>
        <a class="moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a>
        <br>
      </blockquote>
      <br>
    </blockquote>
    <br>
  </body>
</html>