summaryrefslogtreecommitdiffstats
path: root/openmp/runtime/src/z_Linux_util.cpp
diff options
context:
space:
mode:
authorDavid Carlier <devnexen@gmail.com>2019-09-28 19:01:59 +0000
committerDavid Carlier <devnexen@gmail.com>2019-09-28 19:01:59 +0000
commitfef62e1a684350292a5dac310ab887cde58955da (patch)
tree4bc6ca9f9a9aabb2e31e82668fcdfc1655e13555 /openmp/runtime/src/z_Linux_util.cpp
parent2adae76cc601a990ba0ab9881d636930d3cc3399 (diff)
downloadbcm5719-llvm-fef62e1a684350292a5dac310ab887cde58955da.tar.gz
bcm5719-llvm-fef62e1a684350292a5dac310ab887cde58955da.zip
[OpenMP] FreeBSD address check if mapped more native
/proc unless Linux layer compatibility is activated for CentOS is activated is not present thus relying on a more native for checking the address. Reviewers: Hahnfeld, kongyl, jdoerfert, jlpeyton, AndreyChurbanov, emaster, dim Reviewed By: Hahnfeld Differential Revision: https://reviews.llvm.org/D67326 llvm-svn: 373152
Diffstat (limited to 'openmp/runtime/src/z_Linux_util.cpp')
-rw-r--r--openmp/runtime/src/z_Linux_util.cpp43
1 files changed, 42 insertions, 1 deletions
diff --git a/openmp/runtime/src/z_Linux_util.cpp b/openmp/runtime/src/z_Linux_util.cpp
index 5f572ab0b0e..871be6283c2 100644
--- a/openmp/runtime/src/z_Linux_util.cpp
+++ b/openmp/runtime/src/z_Linux_util.cpp
@@ -50,6 +50,9 @@
#include <mach/mach.h>
#include <sys/sysctl.h>
#elif KMP_OS_DRAGONFLY || KMP_OS_FREEBSD
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <sys/user.h>
#include <pthread_np.h>
#elif KMP_OS_NETBSD
#include <sys/types.h>
@@ -1979,7 +1982,7 @@ int __kmp_is_address_mapped(void *addr) {
int found = 0;
int rc;
-#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_HURD
+#if KMP_OS_LINUX || KMP_OS_HURD
/* On GNUish OSes, read the /proc/<pid>/maps pseudo-file to get all the address
ranges mapped into the address space. */
@@ -2017,6 +2020,44 @@ int __kmp_is_address_mapped(void *addr) {
// Free resources.
fclose(file);
KMP_INTERNAL_FREE(name);
+#elif KMP_OS_FREEBSD
+ char *buf;
+ size_t lstsz;
+ int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_VMMAP, getpid()};
+ rc = sysctl(mib, 4, NULL, &lstsz, NULL, 0);
+ if (rc < 0)
+ return 0;
+ // We pass from number of vm entry's semantic
+ // to size of whole entry map list.
+ lstsz = lstsz * 4 / 3;
+ buf = reinterpret_cast<char *>(kmpc_malloc(lstsz));
+ rc = sysctl(mib, 4, buf, &lstsz, NULL, 0);
+ if (rc < 0) {
+ kmpc_free(buf);
+ return 0;
+ }
+
+ char *lw = buf;
+ char *up = buf + lstsz;
+
+ while (lw < up) {
+ struct kinfo_vmentry *cur = reinterpret_cast<struct kinfo_vmentry *>(lw);
+ size_t cursz = cur->kve_structsize;
+ if (cursz == 0)
+ break;
+ void *start = reinterpret_cast<void *>(cur->kve_start);
+ void *end = reinterpret_cast<void *>(cur->kve_end);
+ // Readable/Writable addresses within current map entry
+ if ((addr >= start) && (addr < end)) {
+ if ((cur->kve_protection & KVME_PROT_READ) != 0 &&
+ (cur->kve_protection & KVME_PROT_WRITE) != 0) {
+ found = 1;
+ break;
+ }
+ }
+ lw += cursz;
+ }
+ kmpc_free(buf);
#elif KMP_OS_DARWIN
OpenPOWER on IntegriCloud