mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-25 10:27:04 +00:00
Remove sys::GetMainExecutable.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184916 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -104,11 +104,6 @@ namespace sys {
|
|||||||
/// @brief Returns the current working directory.
|
/// @brief Returns the current working directory.
|
||||||
static Path GetCurrentDirectory();
|
static Path GetCurrentDirectory();
|
||||||
|
|
||||||
/// GetMainExecutable - Return the path to the main executable, given the
|
|
||||||
/// value of argv[0] from program startup and the address of main itself.
|
|
||||||
/// In extremis, this function may fail and return an empty path.
|
|
||||||
static Path GetMainExecutable(const char *argv0, void *MainAddr);
|
|
||||||
|
|
||||||
/// This is one of the very few ways in which a path can be constructed
|
/// This is one of the very few ways in which a path can be constructed
|
||||||
/// with a syntactically invalid name. The only *legal* invalid name is an
|
/// with a syntactically invalid name. The only *legal* invalid name is an
|
||||||
/// empty one. Other invalid names are not permitted. Empty paths are
|
/// empty one. Other invalid names are not permitted. Empty paths are
|
||||||
|
|||||||
@@ -190,113 +190,6 @@ Path::GetCurrentDirectory() {
|
|||||||
return Path(pathname);
|
return Path(pathname);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__FreeBSD__) || defined (__NetBSD__) || defined(__Bitrig__) || \
|
|
||||||
defined(__OpenBSD__) || defined(__minix) || defined(__FreeBSD_kernel__) || \
|
|
||||||
defined(__linux__) || defined(__CYGWIN__)
|
|
||||||
static int
|
|
||||||
test_dir(char buf[PATH_MAX], char ret[PATH_MAX],
|
|
||||||
const char *dir, const char *bin)
|
|
||||||
{
|
|
||||||
struct stat sb;
|
|
||||||
|
|
||||||
snprintf(buf, PATH_MAX, "%s/%s", dir, bin);
|
|
||||||
if (realpath(buf, ret) == NULL)
|
|
||||||
return (1);
|
|
||||||
if (stat(buf, &sb) != 0)
|
|
||||||
return (1);
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *
|
|
||||||
getprogpath(char ret[PATH_MAX], const char *bin)
|
|
||||||
{
|
|
||||||
char *pv, *s, *t, buf[PATH_MAX];
|
|
||||||
|
|
||||||
/* First approach: absolute path. */
|
|
||||||
if (bin[0] == '/') {
|
|
||||||
if (test_dir(buf, ret, "/", bin) == 0)
|
|
||||||
return (ret);
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Second approach: relative path. */
|
|
||||||
if (strchr(bin, '/') != NULL) {
|
|
||||||
if (getcwd(buf, PATH_MAX) == NULL)
|
|
||||||
return (NULL);
|
|
||||||
if (test_dir(buf, ret, buf, bin) == 0)
|
|
||||||
return (ret);
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Third approach: $PATH */
|
|
||||||
if ((pv = getenv("PATH")) == NULL)
|
|
||||||
return (NULL);
|
|
||||||
s = pv = strdup(pv);
|
|
||||||
if (pv == NULL)
|
|
||||||
return (NULL);
|
|
||||||
while ((t = strsep(&s, ":")) != NULL) {
|
|
||||||
if (test_dir(buf, ret, t, bin) == 0) {
|
|
||||||
free(pv);
|
|
||||||
return (ret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(pv);
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
#endif // __FreeBSD__ || __NetBSD__ || __FreeBSD_kernel__
|
|
||||||
|
|
||||||
/// GetMainExecutable - Return the path to the main executable, given the
|
|
||||||
/// value of argv[0] from program startup.
|
|
||||||
Path Path::GetMainExecutable(const char *argv0, void *MainAddr) {
|
|
||||||
#if defined(__APPLE__)
|
|
||||||
// On OS X the executable path is saved to the stack by dyld. Reading it
|
|
||||||
// from there is much faster than calling dladdr, especially for large
|
|
||||||
// binaries with symbols.
|
|
||||||
char exe_path[MAXPATHLEN];
|
|
||||||
uint32_t size = sizeof(exe_path);
|
|
||||||
if (_NSGetExecutablePath(exe_path, &size) == 0) {
|
|
||||||
char link_path[MAXPATHLEN];
|
|
||||||
if (realpath(exe_path, link_path))
|
|
||||||
return Path(link_path);
|
|
||||||
}
|
|
||||||
#elif defined(__FreeBSD__) || defined (__NetBSD__) || defined(__Bitrig__) || \
|
|
||||||
defined(__OpenBSD__) || defined(__minix) || defined(__FreeBSD_kernel__)
|
|
||||||
char exe_path[PATH_MAX];
|
|
||||||
|
|
||||||
if (getprogpath(exe_path, argv0) != NULL)
|
|
||||||
return Path(exe_path);
|
|
||||||
#elif defined(__linux__) || defined(__CYGWIN__)
|
|
||||||
char exe_path[MAXPATHLEN];
|
|
||||||
StringRef aPath("/proc/self/exe");
|
|
||||||
if (sys::fs::exists(aPath)) {
|
|
||||||
// /proc is not always mounted under Linux (chroot for example).
|
|
||||||
ssize_t len = readlink(aPath.str().c_str(), exe_path, sizeof(exe_path));
|
|
||||||
if (len >= 0)
|
|
||||||
return Path(StringRef(exe_path, len));
|
|
||||||
} else {
|
|
||||||
// Fall back to the classical detection.
|
|
||||||
if (getprogpath(exe_path, argv0) != NULL)
|
|
||||||
return Path(exe_path);
|
|
||||||
}
|
|
||||||
#elif defined(HAVE_DLFCN_H)
|
|
||||||
// Use dladdr to get executable path if available.
|
|
||||||
Dl_info DLInfo;
|
|
||||||
int err = dladdr(MainAddr, &DLInfo);
|
|
||||||
if (err == 0)
|
|
||||||
return Path();
|
|
||||||
|
|
||||||
// If the filename is a symlink, we need to resolve and return the location of
|
|
||||||
// the actual executable.
|
|
||||||
char link_path[MAXPATHLEN];
|
|
||||||
if (realpath(DLInfo.dli_fname, link_path))
|
|
||||||
return Path(link_path);
|
|
||||||
#else
|
|
||||||
#error GetMainExecutable is not implemented on this host yet.
|
|
||||||
#endif
|
|
||||||
return Path();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Path::exists() const {
|
Path::exists() const {
|
||||||
return 0 == access(path.c_str(), F_OK );
|
return 0 == access(path.c_str(), F_OK );
|
||||||
|
|||||||
@@ -200,15 +200,6 @@ Path::GetCurrentDirectory() {
|
|||||||
return Path(pathname);
|
return Path(pathname);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// GetMainExecutable - Return the path to the main executable, given the
|
|
||||||
/// value of argv[0] from program startup.
|
|
||||||
Path Path::GetMainExecutable(const char *argv0, void *MainAddr) {
|
|
||||||
char pathname[MAX_PATH];
|
|
||||||
DWORD ret = ::GetModuleFileNameA(NULL, pathname, MAX_PATH);
|
|
||||||
return ret != MAX_PATH ? Path(pathname) : Path();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// FIXME: the above set of functions don't map to Windows very well.
|
// FIXME: the above set of functions don't map to Windows very well.
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|||||||
Reference in New Issue
Block a user