[flang-commits] [flang] 6eb0dac - [flang][cuda] Only strip internal linkage for device globals (#207521)
via flang-commits
flang-commits at lists.llvm.org
Mon Jul 6 06:14:29 PDT 2026
Author: Valentin Clement (バレンタイン クレメン)
Date: 2026-07-06T06:14:25-07:00
New Revision: 6eb0dac37aa409390bd96a91a99f216c35a0b8cb
URL: https://github.com/llvm/llvm-project/commit/6eb0dac37aa409390bd96a91a99f216c35a0b8cb
DIFF: https://github.com/llvm/llvm-project/commit/6eb0dac37aa409390bd96a91a99f216c35a0b8cb.diff
LOG: [flang][cuda] Only strip internal linkage for device globals (#207521)
Stripping all linkage was too much. Only strip internal linkage so the
symbol is visible to CUDA API.
Added:
Modified:
flang/lib/Optimizer/Transforms/CUDA/CUFDeviceGlobal.cpp
flang/test/Fir/CUDA/cuda-device-global.f90
Removed:
################################################################################
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