Index: lib/Support/Unix/Path.inc =================================================================== --- lib/Support/Unix/Path.inc +++ lib/Support/Unix/Path.inc @@ -77,6 +77,9 @@ #if defined(__OpenBSD__) || defined(__FreeBSD__) #include #include +#if defined(__FreeBSD__) +#include +#endif #elif defined(__linux__) #if defined(HAVE_LINUX_MAGIC_H) #include @@ -108,10 +111,9 @@ namespace llvm { namespace sys { namespace fs { -#if defined(__FreeBSD__) || defined (__NetBSD__) || defined(__Bitrig__) || \ - defined(__OpenBSD__) || defined(__minix) || defined(__FreeBSD_kernel__) || \ - defined(__linux__) || defined(__CYGWIN__) || defined(__DragonFly__) || \ - defined(_AIX) +#if defined (__NetBSD__) || defined(__Bitrig__) || defined(__OpenBSD__) || \ + defined(__minix) || defined(__linux__) || defined(__CYGWIN__) || \ + defined(__DragonFly__) || defined(_AIX) static int test_dir(char ret[PATH_MAX], const char *dir, const char *bin) { @@ -164,7 +166,7 @@ free(pv); return nullptr; } -#endif // __FreeBSD__ || __NetBSD__ || __FreeBSD_kernel__ +#endif // NetBSD || _Bitrig || OpenBSD || minix || linux || CYGWIN || DragonFly || _AIX /// GetMainExecutable - Return the path to the main executable, given the /// value of argv[0] from program startup. @@ -180,9 +182,18 @@ if (realpath(exe_path, link_path)) return link_path; } -#elif defined(__FreeBSD__) || defined (__NetBSD__) || defined(__Bitrig__) || \ - defined(__OpenBSD__) || defined(__minix) || defined(__DragonFly__) || \ - defined(__FreeBSD_kernel__) || defined(_AIX) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + int mib[4]; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PATHNAME; + mib[3] = -1; + 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 (__NetBSD__) || defined(__Bitrig__) || defined(__OpenBSD__) || \ + defined(__minix) || defined(__DragonFly__) || defined(_AIX) char exe_path[PATH_MAX]; if (getprogpath(exe_path, argv0) != NULL) Index: unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp =================================================================== --- unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp +++ unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp @@ -23,8 +23,10 @@ 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("DynamicLibraryTests", Ptr); + std::string Path = fs::getMainExecutable(Argv0, Ptr); llvm::SmallString<256> Buf(path::parent_path(Path)); path::append(Buf, "PipSqueak.so"); return Buf.str();