diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp index 875599098b3dc..68619f699ebb2 100644 --- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp +++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp @@ -882,8 +882,11 @@ bool ClauseProcessor::processMap( // Explicit map captures are captured ByRef by default, // optimisation passes may alter this to ByCopy or other capture // types to optimise + auto location = mlir::NameLoc::get( + mlir::StringAttr::get(firOpBuilder.getContext(), asFortran.str()), + symAddr.getLoc()); mlir::omp::MapInfoOp mapOp = createMapInfoOp( - firOpBuilder, clauseLocation, symAddr, + firOpBuilder, location, symAddr, /*varPtrPtr=*/mlir::Value{}, asFortran.str(), bounds, /*members=*/{}, /*membersIndex=*/mlir::DenseIntElementsAttr{}, static_cast< diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index 17b362cc2f32e..1569605e785b0 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -1604,9 +1604,12 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable, mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO; mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_FROM; } - + auto location = + mlir::NameLoc::get(mlir::StringAttr::get(firOpBuilder.getContext(), + sym.name().ToString()), + baseOp.getLoc()); mlir::Value mapOp = createMapInfoOp( - firOpBuilder, baseOp.getLoc(), baseOp, /*varPtrPtr=*/mlir::Value{}, + firOpBuilder, location, baseOp, /*varPtrPtr=*/mlir::Value{}, name.str(), bounds, /*members=*/{}, /*membersIndex=*/mlir::DenseIntElementsAttr{}, static_cast< diff --git a/offload/test/offloading/fortran/dump_map_tables.f90 b/offload/test/offloading/fortran/dump_map_tables.f90 new file mode 100644 index 0000000000000..cb66ef348e3c2 --- /dev/null +++ b/offload/test/offloading/fortran/dump_map_tables.f90 @@ -0,0 +1,38 @@ +! Offloading test with runtine call to ompx_dump_mapping_tables +! Fortran array writing some values and printing the variable mapped to device +! correctly receives the updates made on the device. +! REQUIRES: flang +! UNSUPPORTED: nvptx64-nvidia-cuda-LTO +! UNSUPPORTED: aarch64-unknown-linux-gnu +! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO +! UNSUPPORTED: x86_64-pc-linux-gnu +! UNSUPPORTED: x86_64-pc-linux-gnu-LTO + +! RUN: %libomptarget-compile-fortran-run-and-check-generic + +program map_dump_example + INTERFACE + SUBROUTINE ompx_dump_mapping_tables() BIND(C) + END SUBROUTINE ompx_dump_mapping_tables + END INTERFACE + + integer i,j,k,N + integer async_q(4) + real :: A(5000000) + N=5000000 + do i=1, N + A(i)=0 + enddo +! clang-format off +! CHECK: omptarget device 0 info: OpenMP Host-Device pointer mappings after block +! CHECK-NEXT: omptarget device 0 info: Host Ptr Target Ptr Size (B) DynRefCount HoldRefCount Declaration +! CHECK-NEXT: omptarget device 0 info: {{(0x[0-9a-f]{16})}} {{(0x[0-9a-f]{16})}} 20000000 1 0 {{.*}} at a(:n):21:11 +! clang-format on +!$omp target enter data map(to:A(:N)) + call ompx_dump_mapping_tables() +!$omp target parallel do + do i=1, N + A(i)=A(i)*2 + enddo +!$omp target exit data map(from:A) +end program