Skip to content

Commit

Permalink
Fix DynamicLibraryTest.cpp on FreeBSD and NetBSD
Browse files Browse the repository at this point in the history
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

llvm-svn: 303015
  • Loading branch information
DimitryAndric committed May 14, 2017
1 parent ee97c5f commit 4043373
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 7 deletions.
30 changes: 24 additions & 6 deletions llvm/lib/Support/Unix/Path.inc
Expand Up @@ -103,13 +103,16 @@
#define STATVFS_F_FLAG(vfs) (vfs).f_flags
#endif

#if defined(__FreeBSD__) || defined(__NetBSD__)
#include <sys/sysctl.h>
#endif

using namespace llvm;

namespace llvm {
namespace sys {
namespace fs {
#if defined(__FreeBSD__) || defined (__NetBSD__) || defined(__Bitrig__) || \
defined(__OpenBSD__) || defined(__minix) || defined(__FreeBSD_kernel__) || \
#if defined(__Bitrig__) || defined(__OpenBSD__) || defined(__minix) || \
defined(__linux__) || defined(__CYGWIN__) || defined(__DragonFly__) || \
defined(_AIX)
static int
Expand Down Expand Up @@ -164,7 +167,7 @@ getprogpath(char ret[PATH_MAX], const char *bin)
free(pv);
return nullptr;
}
#endif // __FreeBSD__ || __NetBSD__ || __FreeBSD_kernel__
#endif // Bitrig || OpenBSD || minix || linux || CYGWIN || DragonFly || AIX

/// GetMainExecutable - Return the path to the main executable, given the
/// value of argv[0] from program startup.
Expand All @@ -180,9 +183,24 @@ std::string getMainExecutable(const char *argv0, void *MainAddr) {
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__) || 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)
char exe_path[PATH_MAX];

if (getprogpath(exe_path, argv0) != NULL)
Expand Down
4 changes: 3 additions & 1 deletion llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp
Expand Up @@ -23,8 +23,10 @@ using namespace llvm::sys;
extern "C" PIPSQUEAK_EXPORT const char *TestA() { return "ProcessCall"; }

std::string LibPath() {
const std::vector<testing::internal::string>& 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();
Expand Down

0 comments on commit 4043373

Please sign in to comment.