[Openmp-commits] [openmp] [OpenMP] Implements __kmp_is_address_mapped for Solaris/Illumos. (PR #82930)
David CARLIER via Openmp-commits
openmp-commits at lists.llvm.org
Sun Feb 25 09:48:58 PST 2024
https://github.com/devnexen created https://github.com/llvm/llvm-project/pull/82930
Also fixing OpenMP build itself for this platform.
>From 444ec06d19290e1fa0071e7b20f4cda3039117d7 Mon Sep 17 00:00:00 2001
From: David Carlier <devnexen at gmail.com>
Date: Sun, 25 Feb 2024 17:46:44 +0000
Subject: [PATCH] [OpenMP] Implements __kmp_is_address_mapped for
Solaris/Illumos.
Also fixing OpenMP build itself for this platform.
---
openmp/runtime/cmake/LibompHandleFlags.cmake | 5 +-
openmp/runtime/src/z_Linux_util.cpp | 75 +++++++++++++++++++-
2 files changed, 76 insertions(+), 4 deletions(-)
diff --git a/openmp/runtime/cmake/LibompHandleFlags.cmake b/openmp/runtime/cmake/LibompHandleFlags.cmake
index eed98036dd51a6..1aba1fbea82909 100644
--- a/openmp/runtime/cmake/LibompHandleFlags.cmake
+++ b/openmp/runtime/cmake/LibompHandleFlags.cmake
@@ -147,8 +147,11 @@ function(libomp_get_libflags libflags)
if (${CMAKE_SYSTEM_NAME} STREQUAL "DragonFly")
libomp_append(libflags_local "-lkvm")
endif()
- elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux|NetBSD|Solaris")
+ elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux|NetBSD|SunOS")
libomp_append(libflags_local -lm)
+ if (${CMAKE_SYSTEM_NAME} STREQUAL "SunOS")
+ libomp_append(libflags_local "-lproc")
+ endif()
endif()
set(libflags_local ${libflags_local} ${LIBOMP_LIBFLAGS})
libomp_setup_flags(libflags_local)
diff --git a/openmp/runtime/src/z_Linux_util.cpp b/openmp/runtime/src/z_Linux_util.cpp
index 3636266677d99e..d6c50ad62da1fd 100644
--- a/openmp/runtime/src/z_Linux_util.cpp
+++ b/openmp/runtime/src/z_Linux_util.cpp
@@ -66,6 +66,12 @@
#include <sys/types.h>
#include <sys/sysctl.h>
#elif KMP_OS_SOLARIS
+#if defined(__LP64__)
+#define _STRUCTURED_PROC 1
+#include <sys/procfs.h>
+#include <libproc.h>
+#endif
+#include <thread.h>
#include <sys/loadavg.h>
#endif
@@ -426,7 +432,6 @@ static kmp_int32 __kmp_set_stack_info(int gtid, kmp_info_t *th) {
int stack_data;
#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_AIX
- pthread_attr_t attr;
int status;
size_t size = 0;
void *addr = 0;
@@ -436,6 +441,8 @@ static kmp_int32 __kmp_set_stack_info(int gtid, kmp_info_t *th) {
pthread_attr_getstack may cause thread gtid aliasing */
if (!KMP_UBER_GTID(gtid)) {
+#if !KMP_OS_SOLARIS
+ pthread_attr_t attr;
/* Fetch the real thread attributes */
status = pthread_attr_init(&attr);
KMP_CHECK_SYSFAIL("pthread_attr_init", status);
@@ -454,6 +461,18 @@ static kmp_int32 __kmp_set_stack_info(int gtid, kmp_info_t *th) {
gtid, size, addr));
status = pthread_attr_destroy(&attr);
KMP_CHECK_SYSFAIL("pthread_attr_destroy", status);
+#else
+ stack_t s;
+ if ((status = thr_stksegment(&s)) < 0) {
+ KMP_CHECK_SYSFAIL("thr_stksegment", status);
+ }
+
+ addr = s.ss_sp;
+ size = s.ss_size;
+ KA_TRACE(60, ("__kmp_set_stack_info: T#%d thr_stksegment returned size:"
+ " %lu, low addr: %p\n",
+ gtid, size, addr));
+#endif
}
if (size != 0 && addr != 0) { // was stack parameter determination successful?
@@ -2175,6 +2194,56 @@ int __kmp_is_address_mapped(void *addr) {
}
kvm_close(fd);
+#elif KMP_OS_SOLARIS
+#if defined(__LP64__)
+ prmap_t *cur, *map;
+ void *buf;
+ uintptr_t uaddr;
+ ssize_t rd;
+ int err;
+ int file;
+
+ pid_t pid = getpid();
+ struct ps_prochandle *fd = Pgrab(pid, PGRAB_RDONLY, &err);
+ ;
+
+ if (!fd) {
+ return 0;
+ }
+
+ char *name = __kmp_str_format("/proc/%d/map", pid);
+ size_t sz = (1 << 20);
+ file = open(name, O_RDONLY);
+ if (file == -1) {
+ KMP_INTERNAL_FREE(name);
+ return 0;
+ }
+
+ buf = kmpc_malloc(sz);
+
+ while (sz > 0 && (rd = pread(file, buf, sz, 0)) == sz) {
+ void *newbuf;
+ sz <<= 1;
+ newbuf = kmpc_realloc(buf, sz);
+ buf = newbuf;
+ }
+
+ map = reinterpret_cast<prmap_t *>(buf);
+ uaddr = reinterpret_cast<uintptr_t>(addr);
+
+ for (cur = map; rd > 0; cur++, rd = -sizeof(*map)) {
+ if ((uaddr >= cur->pr_vaddr) && (uaddr < cur->pr_vaddr)) {
+ if ((cur->pr_mflags & MA_READ) != 0 && (cur->pr_mflags & MA_WRITE) != 0) {
+ found = 1;
+ break;
+ }
+ }
+ }
+
+ kmpc_free(map);
+ close(file);
+ KMP_INTERNAL_FREE(name);
+#endif
#elif KMP_OS_DARWIN
/* On OS X*, /proc pseudo filesystem is not available. Try to read memory
@@ -2253,9 +2322,9 @@ int __kmp_is_address_mapped(void *addr) {
}
#elif KMP_OS_WASI
found = (int)addr < (__builtin_wasm_memory_size(0) * PAGESIZE);
-#elif KMP_OS_SOLARIS || KMP_OS_AIX
+#elif KMP_OS_AIX
- // FIXME(Solaris, AIX): Implement this
+ // FIXME(AIX): Implement this
found = 1;
#else
More information about the Openmp-commits
mailing list