diff --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp index b2279a319fe92..a673a18cd20d9 100644 --- a/flang/lib/Lower/ConvertVariable.cpp +++ b/flang/lib/Lower/ConvertVariable.cpp @@ -172,9 +172,12 @@ static fir::GlobalOp declareGlobal(Fortran::lower::AbstractConverter &converter, !Fortran::semantics::IsProcedurePointer(ultimate)) mlir::emitError(loc, "processing global declaration: symbol '") << toStringRef(sym.name()) << "' has unexpected details\n"; + fir::CUDADataAttributeAttr cudaAttr = + Fortran::lower::translateSymbolCUDADataAttribute( + converter.getFirOpBuilder().getContext(), sym); return builder.createGlobal(loc, converter.genType(var), globalName, linkage, mlir::Attribute{}, isConstant(ultimate), - var.isTarget()); + var.isTarget(), cudaAttr); } /// Temporary helper to catch todos in initial data target lowering. @@ -1586,7 +1589,7 @@ fir::FortranVariableFlagsAttr Fortran::lower::translateSymbolAttributes( fir::CUDADataAttributeAttr Fortran::lower::translateSymbolCUDADataAttribute( mlir::MLIRContext *mlirContext, const Fortran::semantics::Symbol &sym) { std::optional cudaAttr = - Fortran::semantics::GetCUDADataAttr(&sym); + Fortran::semantics::GetCUDADataAttr(&sym.GetUltimate()); return fir::getCUDADataAttribute(mlirContext, cudaAttr); } diff --git a/flang/test/Lower/CUDA/cuda-mod.cuf b/flang/test/Lower/CUDA/cuda-mod.cuf new file mode 100644 index 0000000000000..2cc6439789a27 --- /dev/null +++ b/flang/test/Lower/CUDA/cuda-mod.cuf @@ -0,0 +1,9 @@ +! RUN: bbc -emit-hlfir -fcuda %s -o - | FileCheck %s + +! Simple module to test module use in + +module cuf_mod + real, device :: md +end module + +! CHECK: fir.global @_QMcuf_modEmd {cuda_attr = #fir.cuda} : f32 diff --git a/flang/test/Lower/CUDA/cuda-module-use.cuf b/flang/test/Lower/CUDA/cuda-module-use.cuf new file mode 100644 index 0000000000000..43ab0f6ff8d68 --- /dev/null +++ b/flang/test/Lower/CUDA/cuda-module-use.cuf @@ -0,0 +1,15 @@ +! RUN: bbc -emit-hlfir -fcuda %S/cuda-mod.cuf +! RUN: bbc -emit-hlfir -fcuda %s -o - | FileCheck %s + +! Test importing module with variable with CUDA attributes. + +subroutine sub1() + use cuf_mod + md = 1.0 +end + +! CHECK-LABEL: func.func @_QPsub1() +! CHECK: %[[ADDR:.*]] = fir.address_of(@_QMcuf_modEmd) : !fir.ref +! CHECK: %{{.*}}:2 = hlfir.declare %[[ADDR]] {cuda_attr = #fir.cuda, uniq_name = "_QMcuf_modEmd"} : (!fir.ref) -> (!fir.ref, !fir.ref) + +! CHECK: fir.global @_QMcuf_modEmd {cuda_attr = #fir.cuda} : f32