aboutsummaryrefslogtreecommitdiff
path: root/openmp/runtime/src/z_Linux_util.cpp
diff options
context:
space:
mode:
authorRainer Orth <ro@gcc.gnu.org>2025-06-04 10:28:38 +0200
committerGitHub <noreply@github.com>2025-06-04 10:28:38 +0200
commitba4f140ef6ae277ac5ec896061adfeb67372f3a2 (patch)
tree4a5836a0617d127dc0045c0c1e72937311a11c0c /openmp/runtime/src/z_Linux_util.cpp
parent370d01765c96da019e7970e875ce525819896464 (diff)
downloadllvm-ba4f140ef6ae277ac5ec896061adfeb67372f3a2.zip
llvm-ba4f140ef6ae277ac5ec896061adfeb67372f3a2.tar.gz
llvm-ba4f140ef6ae277ac5ec896061adfeb67372f3a2.tar.bz2
[OpenMP] Don't use libproc on Solaris (#142379)
`openmp` currently doesn't compile on 32-bit Solaris: ``` FAILED: projects/openmp/runtime/src/CMakeFiles/omp.dir/z_Linux_util.cpp.o [...] In file included from openmp/runtime/src/z_Linux_util.cpp:78: In file included from /usr/include/libproc.h:25: In file included from /usr/include/gelf.h:10: /usr/include/libelf.h:22:2: error: "large files are not supported by libelf" 22 | #error "large files are not supported by libelf" | ^ In file included from openmp/runtime/src/z_Linux_util.cpp:78: /usr/include/libproc.h:42:2: error: "Cannot use libproc in the large file compilation environment" 42 | #error "Cannot use libproc in the large file compilation environment" | ^ ``` Looking closer, there's no point in using `Pgrab` (the only interface from `<libproc.h>`) at all: the resulting `ps_prochandle_t *` isn't used in the remainder of the code and the original PR #82930 gives no indication why it is deemed necessary/useful. While at it, this patch switches to use `/proc/self/xmap`, matching `compiler-rt`'s `sanitizer_procmaps_solaris.cpp`, and makes some minor formatting fixes. Tested on `sparc-sun-solaris2.11`, `sparcv9-sun-solaris2.11`, `i386-pc-solaris2.11`, and `amd64-pc-solaris2.11`.
Diffstat (limited to 'openmp/runtime/src/z_Linux_util.cpp')
-rw-r--r--openmp/runtime/src/z_Linux_util.cpp30
1 files changed, 10 insertions, 20 deletions
diff --git a/openmp/runtime/src/z_Linux_util.cpp b/openmp/runtime/src/z_Linux_util.cpp
index 3b82b45..368c0b6 100644
--- a/openmp/runtime/src/z_Linux_util.cpp
+++ b/openmp/runtime/src/z_Linux_util.cpp
@@ -75,7 +75,6 @@
#include <pthread_np.h>
#endif
#elif KMP_OS_SOLARIS
-#include <libproc.h>
#include <procfs.h>
#include <thread.h>
#include <sys/loadavg.h>
@@ -2232,43 +2231,34 @@ int __kmp_is_address_mapped(void *addr) {
kvm_close(fd);
#elif KMP_OS_SOLARIS
- prmap_t *cur, *map;
+ prxmap_t *cur, *map;
void *buf;
uintptr_t uaddr;
ssize_t rd;
- int err;
- int file;
-
+ int fd;
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) {
+ char *name = __kmp_str_format("/proc/%d/xmap", pid);
+ fd = open(name, O_RDONLY);
+ if (fd == -1) {
KMP_INTERNAL_FREE(name);
return 0;
}
+ size_t sz = (1 << 20);
buf = KMP_INTERNAL_MALLOC(sz);
- while (sz > 0 && (rd = pread(file, buf, sz, 0)) == sz) {
+ while (sz > 0 && (rd = pread(fd, buf, sz, 0)) == sz) {
void *newbuf;
sz <<= 1;
newbuf = KMP_INTERNAL_REALLOC(buf, sz);
buf = newbuf;
}
- map = reinterpret_cast<prmap_t *>(buf);
+ map = reinterpret_cast<prxmap_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 (uaddr >= cur->pr_vaddr && uaddr < cur->pr_vaddr) {
if ((cur->pr_mflags & MA_READ) != 0 && (cur->pr_mflags & MA_WRITE) != 0) {
found = 1;
break;
@@ -2277,7 +2267,7 @@ int __kmp_is_address_mapped(void *addr) {
}
KMP_INTERNAL_FREE(map);
- close(file);
+ close(fd);
KMP_INTERNAL_FREE(name);
#elif KMP_OS_DARWIN