[clang] 0d16c23 - [OpenMP] Do not create offloading entries for internal or hidden symbols

Joseph Huber via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 23 15:27:23 PDT 2022


Author: Joseph Huber
Date: 2022-03-23T18:27:16-04:00
New Revision: 0d16c23af1da2e7c83c84cf64f8b76947f038044

URL: https://github.com/llvm/llvm-project/commit/0d16c23af1da2e7c83c84cf64f8b76947f038044
DIFF: https://github.com/llvm/llvm-project/commit/0d16c23af1da2e7c83c84cf64f8b76947f038044.diff

LOG: [OpenMP] Do not create offloading entries for internal or hidden symbols

Currently we create offloading entries to register device variables with
the host. When we register a variable we will look up the symbol in the
device image and map the device address to the host address. This is a
problem when the symbol is declared with hidden visibility or internal
linkage. This means the symbol is not accessible externally and we
cannot get its address. We should still allow static variables to be
declared on the device, but ew should not create an offloading entry for
them so they exist independently on the host and device.

Fixes #54309

Reviewed By: jdoerfert

Differential Revision: https://reviews.llvm.org/D122352

Added: 
    clang/test/OpenMP/declare_target_visibility_codegen.cpp

Modified: 
    clang/lib/CodeGen/CGOpenMPRuntime.cpp
    clang/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index a1986c2f8796b..cd58a1b67a166 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -3325,6 +3325,13 @@ void CGOpenMPRuntime::createOffloadEntriesAndInfoMetadata() {
         }
         break;
       }
+
+      // Hidden or internal symbols on the device are not externally visible. We
+      // should not attempt to register them by creating an offloading entry.
+      if (auto *GV = dyn_cast<llvm::GlobalValue>(CE->getAddress()))
+        if (GV->hasLocalLinkage() || GV->hasHiddenVisibility())
+          continue;
+
       createOffloadEntry(CE->getAddress(), CE->getAddress(),
                          CE->getVarSize().getQuantity(), Flags,
                          CE->getLinkage());

diff  --git a/clang/test/OpenMP/declare_target_visibility_codegen.cpp b/clang/test/OpenMP/declare_target_visibility_codegen.cpp
new file mode 100644
index 0000000000000..6518bac50623a
--- /dev/null
+++ b/clang/test/OpenMP/declare_target_visibility_codegen.cpp
@@ -0,0 +1,30 @@
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix=HOST
+
+// expected-no-diagnostics
+class C {
+public:
+//.
+// HOST: @[[C:.+]] = internal global %class.C zeroinitializer, align 4
+// HOST: @[[X:.+]] = internal global i32 0, align 4
+// HOST: @y = hidden global i32 0
+// HOST: @z = global i32 0
+// HOST-NOT: @.omp_offloading.entry.c
+// HOST-NOT: @.omp_offloading.entry.x
+// HOST-NOT: @.omp_offloading.entry.y
+// HOST: @.omp_offloading.entry.z
+  C() : x(0) {}
+
+  int x;
+};
+
+static C c;
+#pragma omp declare target(c)
+
+static int x;
+#pragma omp declare target(x)
+
+int __attribute__((visibility("hidden"))) y;
+#pragma omp declare target(y)
+
+int z;
+#pragma omp declare target(z)

diff  --git a/clang/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp b/clang/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp
index 0b8c17f1d3279..45b8372bf64ec 100644
--- a/clang/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp
+++ b/clang/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp
@@ -72,8 +72,6 @@ S cd = doo() + car() + caz() + baz();
 // DEVICE-DAG: call void
 // DEVICE-DAG: ret void
 
-// HOST-DAG: @.omp_offloading.entry_name{{.*}} = internal unnamed_addr constant [{{[0-9]+}} x i8] c"[[C_ADDR]]\00"
-// HOST-DAG: @.omp_offloading.entry.[[C_ADDR]] = weak{{.*}} constant %struct.__tgt_offload_entry { i8* bitcast (i32* @[[C_ADDR]] to i8*), i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* @.omp_offloading.entry_name{{.*}}, i32 0, i32 0), i64 4, i32 0, i32 0 }, section "omp_offloading_entries", align 1
 // HOST-DAG: @.omp_offloading.entry_name{{.*}} = internal unnamed_addr constant [{{[0-9]+}} x i8] c"[[CD_ADDR]]\00"
 // HOST-DAG: @.omp_offloading.entry.[[CD_ADDR]] = weak{{.*}} constant %struct.__tgt_offload_entry { i8* bitcast (%struct.S* @[[CD_ADDR]] to i8*), i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* @.omp_offloading.entry_name{{.*}}, i32 0, i32 0), i64 4, i32 0, i32 0 }, section "omp_offloading_entries", align 1
 // HOST-DAG: @.omp_offloading.entry_name{{.*}} = internal unnamed_addr constant [{{[0-9]+}} x i8] c"[[C_CTOR]]\00"


        


More information about the cfe-commits mailing list