Add support for non-allocatable module-level CUDA managed variables using pointer indirection through a companion global in __nv_managed_data__. The CUDA runtime populates this pointer with the unified memory address via __cudaRegisterManagedVar and __cudaInitModule. 1. Create a .managed.ptr companion global in the __nv_managed_data__ section and register it with _FortranACUFRegisterManagedVariable (CUFAddConstructor.cpp) 2. Call __cudaInitModule after registration to populate the managed pointer (registration.cpp) 3. Annotate managed globals in gpu.module with nvvm.managed for PTX .attribute(.managed) generation (cuda-code-gen.mlir) 4. Suppress cuf.data_transfer for assignments to/from non-allocatable module managed variables, since cudaMemcpy would target the shadow address rather than the actual unified memory (tools.h) 5. Preserve cuf.data_transfer for device_var = managed_var assignments where explicit transfer is still required
Multi-Level Intermediate Representation
See https://mlir.llvm.org/ for more information.