[PATCH] D56975: [Support] Reimplement getMainExecutable() using sysctl on NetBSD

Michał Górny via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 20 05:14:00 PST 2019


mgorny created this revision.
mgorny added reviewers: krytarowski, dim, joerg.
Herald added subscribers: kristina, emaste.

Use sysctl() to implement getMainExecutable() on NetBSD, rather than
trying to guess the correct path from argv[0].  This is one
of the fixes to recent clang-check-mac-libcxx-fixed-compilation-db.cpp
test failure on NetBSD.

This has been historically done on both FreeBSD and NetBSD in r303015,
and reverted in r303285 due to buggy implementation on FreeBSD.
However, FWIK the NetBSD implementation does not suffer from the same
bugs and is more reliable than playing with argv[0].


Repository:
  rL LLVM

https://reviews.llvm.org/D56975

Files:
  lib/Support/Unix/Path.inc


Index: lib/Support/Unix/Path.inc
===================================================================
--- lib/Support/Unix/Path.inc
+++ lib/Support/Unix/Path.inc
@@ -90,6 +90,11 @@
 #define STATVFS_F_FLAG(vfs) (vfs).f_flags
 #endif
 
+#if defined(__NetBSD__)
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#endif
+
 using namespace llvm;
 
 namespace llvm {
@@ -98,7 +103,7 @@
 
 const file_t kInvalidFile = -1;
 
-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) ||     \
+#if defined(__FreeBSD__) || defined(__OpenBSD__) ||     \
     defined(__minix) || defined(__FreeBSD_kernel__) || defined(__linux__) ||   \
     defined(__CYGWIN__) || defined(__DragonFly__) || defined(_AIX) || defined(__GNU__)
 static int
@@ -169,7 +174,14 @@
     if (realpath(exe_path, link_path))
       return link_path;
   }
-#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) ||   \
+#elif defined(__NetBSD__)
+  char exe_path[PATH_MAX];
+  int mib[4] = {CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME};
+  size_t len = sizeof(exe_path);
+
+  if (sysctl(mib, 4, exe_path, &len, nullptr, 0) == 0)
+    return exe_path;
+#elif defined(__FreeBSD__) || defined(__OpenBSD__) ||   \
     defined(__minix) || defined(__DragonFly__) ||                              \
     defined(__FreeBSD_kernel__) || defined(_AIX)
   char exe_path[PATH_MAX];


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D56975.182696.patch
Type: text/x-patch
Size: 1368 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190120/99dc980d/attachment.bin>


More information about the llvm-commits mailing list