[flang-commits] [flang] [flang][cuda] Only strip internal linkage for device globals (PR #207521)

Valentin Clement バレンタイン クレメン via flang-commits flang-commits at lists.llvm.org
Sat Jul 4 09:26:09 PDT 2026


https://github.com/clementval created https://github.com/llvm/llvm-project/pull/207521

Stripping all linkage was too much. Only strip internal linkage so the symbol is visible to CUDA API. 

>From 95727c788fe5afb8df7f64d442ac513108e364c4 Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Sat, 4 Jul 2026 09:25:11 -0700
Subject: [PATCH] [flang][cuda] Only strip internal linkage for device globals

---
 .../lib/Optimizer/Transforms/CUDA/CUFDeviceGlobal.cpp  | 10 ++++++----
 flang/test/Fir/CUDA/cuda-device-global.f90             |  6 +++++-
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/flang/lib/Optimizer/Transforms/CUDA/CUFDeviceGlobal.cpp b/flang/lib/Optimizer/Transforms/CUDA/CUFDeviceGlobal.cpp
index 8aa3bcec775d5..4d44533e170a1 100644
--- a/flang/lib/Optimizer/Transforms/CUDA/CUFDeviceGlobal.cpp
+++ b/flang/lib/Optimizer/Transforms/CUDA/CUFDeviceGlobal.cpp
@@ -183,10 +183,12 @@ class CUFDeviceGlobal : public fir::impl::CUFDeviceGlobalBase<CUFDeviceGlobal> {
         clonedGlobal.removeInitValAttr();
         clonedGlobal.removeLinkNameAttr();
       }
-      // Registered CUDA globals must have a visible device symbol so runtime
-      // lookups (cudaGetSymbolAddress) can resolve them. Drop explicit linkage
-      // from the GPU clone so it uses default external linkage.
-      if (cuf::isRegisteredDeviceGlobal(globalOp))
+      // Registered CUDA globals with internal linkage must have a visible
+      // device symbol so runtime lookups (cudaGetSymbolAddress) can resolve
+      // them. Drop internal linkage from the GPU clone so it uses default
+      // external linkage.
+      if (cuf::isRegisteredDeviceGlobal(globalOp) &&
+          globalOp.getLinkName() == "internal")
         clonedGlobal.removeLinkNameAttr();
       gpuSymTable.insert(cloned);
     }
diff --git a/flang/test/Fir/CUDA/cuda-device-global.f90 b/flang/test/Fir/CUDA/cuda-device-global.f90
index 4f4dd222d9eae..fd83d2f50aa13 100644
--- a/flang/test/Fir/CUDA/cuda-device-global.f90
+++ b/flang/test/Fir/CUDA/cuda-device-global.f90
@@ -5,13 +5,17 @@
 
 module attributes {fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", gpu.container_module} {
   fir.global @_QMmtestsEn(dense<[3, 4, 5, 6, 7]> : tensor<5xi32>) {data_attr = #cuf.cuda<device>} : !fir.array<5xi32>
+  fir.global internal @_QMmtestsEinternal(dense<[1, 2]> : tensor<2xi32>) {data_attr = #cuf.cuda<device>} : !fir.array<2xi32>
+  fir.global linkonce_odr @_QMmtestsElinkonce(dense<[8, 9]> : tensor<2xi32>) {data_attr = #cuf.cuda<device>} : !fir.array<2xi32>
 
   gpu.module @cuda_device_mod {
   }
 }
 
 // CHECK: gpu.module @cuda_device_mo
-// CHECK-NEXT: fir.global @_QMmtestsEn(dense<[3, 4, 5, 6, 7]> : tensor<5xi32>) {data_attr = #cuf.cuda<device>} : !fir.array<5xi32>
+// CHECK-DAG: fir.global @_QMmtestsEn(dense<[3, 4, 5, 6, 7]> : tensor<5xi32>) {data_attr = #cuf.cuda<device>} : !fir.array<5xi32>
+// CHECK-DAG: fir.global @_QMmtestsEinternal(dense<[1, 2]> : tensor<2xi32>) {data_attr = #cuf.cuda<device>} : !fir.array<2xi32>
+// CHECK-DAG: fir.global linkonce_odr @_QMmtestsElinkonce(dense<[8, 9]> : tensor<2xi32>) {data_attr = #cuf.cuda<device>} : !fir.array<2xi32>
 
 // -----
 



More information about the flang-commits mailing list