[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