[OpenMP] Fix seg fault in libomptarget when using Info with multiple threads

Summary:
One option for the LIBOMPTARGET_INFO environment variable is to print the current status of the device's data mappings. These are a shared resource among threads so this needs to be protected when using multiple streams.

Reviewed By: jdoerfert

Differential Revision: https://reviews.llvm.org/D95786

GitOrigin-RevId: fda48539988d2a1bdb6395799151e9090312a20b
diff --git a/libomptarget/src/interface.cpp b/libomptarget/src/interface.cpp
index 2395709..7ba405f 100644
--- a/libomptarget/src/interface.cpp
+++ b/libomptarget/src/interface.cpp
@@ -58,7 +58,7 @@
   case tgt_mandatory:
     if (!success) {
       if (getInfoLevel() & OMP_INFOTYPE_DUMP_TABLE)
-        for (const auto &Device : PM->Devices)
+        for (auto &Device : PM->Devices)
           dumpTargetPointerMappings(loc, Device);
       else
         FAILURE_MESSAGE("Run with LIBOMPTARGET_DEBUG=%d to dump host-target "
@@ -76,7 +76,7 @@
           1, "failure of target construct while offloading is mandatory");
     } else {
       if (getInfoLevel() & OMP_INFOTYPE_DUMP_TABLE)
-        for (const auto &Device : PM->Devices)
+        for (auto &Device : PM->Devices)
           dumpTargetPointerMappings(loc, Device);
     }
     break;
diff --git a/libomptarget/src/private.h b/libomptarget/src/private.h
index fb6f681..3b0e57d 100644
--- a/libomptarget/src/private.h
+++ b/libomptarget/src/private.h
@@ -99,7 +99,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 /// dump a table of all the host-target pointer pairs on failure
 static inline void dumpTargetPointerMappings(const ident_t *Loc,
-                                             const DeviceTy &Device) {
+                                             DeviceTy &Device) {
   if (Device.HostDataToTargetMap.empty())
     return;
 
@@ -109,6 +109,7 @@
        Kernel.getFilename(), Kernel.getLine(), Kernel.getColumn());
   INFO(OMP_INFOTYPE_ALL, Device.DeviceID, "%-18s %-18s %s %s %s\n", "Host Ptr",
        "Target Ptr", "Size (B)", "RefCount", "Declaration");
+  Device.DataMapMtx.lock();
   for (const auto &HostTargetMap : Device.HostDataToTargetMap) {
     SourceInfo Info(HostTargetMap.HstPtrName);
     INFO(OMP_INFOTYPE_ALL, Device.DeviceID,
@@ -118,6 +119,7 @@
          HostTargetMap.getRefCount(), Info.getName(), Info.getFilename(),
          Info.getLine(), Info.getColumn());
   }
+  Device.DataMapMtx.unlock();
 }
 
 ////////////////////////////////////////////////////////////////////////////////