<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>