From ba93e02f258a56a5d71cead853caf03f8efa0e0e Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Wed, 17 May 2017 19:33:10 +0000 Subject: [PATCH] Revert r303015, because it has the unintended side effect of breaking driver-mode recognition in clang (this is because the sysctl method always returns one and only one executable path, even for an executable with multiple links): Fix DynamicLibraryTest.cpp on FreeBSD and NetBSD Summary: After rL301562, on FreeBSD the DynamicLibrary unittests fail, because the test uses getMainExecutable("DynamicLibraryTests", Ptr), and since the path does not contain any slashes, retrieving the main executable will not work. Reimplement getMainExecutable() for FreeBSD and NetBSD using sysctl(3), which is more reliable than fiddling with relative or absolute paths. Also add retrieval of the original argv[] from the GoogleTest framework, to use as a fallback for other OSes. Reviewers: emaste, marsupial, hans, krytarowski Reviewed By: krytarowski Subscribers: krytarowski, llvm-commits Differential Revision: https://reviews.llvm.org/D33171 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303285 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Unix/Path.inc | 30 ++++--------------- .../DynamicLibrary/DynamicLibraryTest.cpp | 4 +-- 2 files changed, 7 insertions(+), 27 deletions(-) diff --git a/lib/Support/Unix/Path.inc b/lib/Support/Unix/Path.inc index cdea09be41e..fa28ba1b6ab 100644 --- a/lib/Support/Unix/Path.inc +++ b/lib/Support/Unix/Path.inc @@ -103,16 +103,13 @@ #define STATVFS_F_FLAG(vfs) (vfs).f_flags #endif -#if defined(__FreeBSD__) || defined(__NetBSD__) -#include -#endif - using namespace llvm; namespace llvm { namespace sys { namespace fs { -#if defined(__Bitrig__) || defined(__OpenBSD__) || defined(__minix) || \ +#if defined(__FreeBSD__) || defined (__NetBSD__) || defined(__Bitrig__) || \ + defined(__OpenBSD__) || defined(__minix) || defined(__FreeBSD_kernel__) || \ defined(__linux__) || defined(__CYGWIN__) || defined(__DragonFly__) || \ defined(_AIX) static int @@ -167,7 +164,7 @@ getprogpath(char ret[PATH_MAX], const char *bin) free(pv); return nullptr; } -#endif // Bitrig || OpenBSD || minix || linux || CYGWIN || DragonFly || AIX +#endif // __FreeBSD__ || __NetBSD__ || __FreeBSD_kernel__ /// GetMainExecutable - Return the path to the main executable, given the /// value of argv[0] from program startup. @@ -183,24 +180,9 @@ std::string getMainExecutable(const char *argv0, void *MainAddr) { if (realpath(exe_path, link_path)) return link_path; } -#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) - int mib[4]; - mib[0] = CTL_KERN; -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PATHNAME; - mib[3] = -1; -#else - mib[1] = KERN_PROC_ARGS; - mib[2] = -1; - mib[3] = KERN_PROC_PATHNAME; -#endif - char exe_path[PATH_MAX]; - size_t cb = sizeof(exe_path); - if (sysctl(mib, 4, exe_path, &cb, NULL, 0) == 0) - return exe_path; -#elif defined(__Bitrig__) || defined(__OpenBSD__) || defined(__minix) || \ - defined(__DragonFly__) || defined(_AIX) +#elif defined(__FreeBSD__) || defined (__NetBSD__) || defined(__Bitrig__) || \ + defined(__OpenBSD__) || defined(__minix) || defined(__DragonFly__) || \ + defined(__FreeBSD_kernel__) || defined(_AIX) char exe_path[PATH_MAX]; if (getprogpath(exe_path, argv0) != NULL) diff --git a/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp b/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp index 0674a91282a..d46eadc9a04 100644 --- a/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp +++ b/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp @@ -23,10 +23,8 @@ using namespace llvm::sys; extern "C" PIPSQUEAK_EXPORT const char *TestA() { return "ProcessCall"; } std::string LibPath() { - const std::vector& Argvs = testing::internal::GetArgvs(); - const char *Argv0 = Argvs.size() > 0 ? Argvs[0].c_str() : "DynamicLibraryTests"; void *Ptr = (void*)(intptr_t)TestA; - std::string Path = fs::getMainExecutable(Argv0, Ptr); + std::string Path = fs::getMainExecutable("DynamicLibraryTests", Ptr); llvm::SmallString<256> Buf(path::parent_path(Path)); path::append(Buf, "PipSqueak.so"); return Buf.str(); -- 2.50.1