From dac49a55a11a5d5f97a43fcc32c8778fefe48226 Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Mon, 13 Dec 2004 03:00:51 +0000 Subject: [PATCH] For PR351: \ * Remove IsLibrary and GetLibraryPath, replaced by FindLibrary in ../Path.cpp \ * Implement GetSystemLibraryPaths and GetBytecodeLibraryPaths, instead of the \ GetSystemLibraryPath1 and GetSystemLibraryPath2 methods llvm-svn: 18862 --- lib/System/Unix/Path.cpp | 119 +++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 66 deletions(-) diff --git a/lib/System/Unix/Path.cpp b/lib/System/Unix/Path.cpp index d3e4d96a83e..63184f6c1c5 100644 --- a/lib/System/Unix/Path.cpp +++ b/lib/System/Unix/Path.cpp @@ -46,67 +46,61 @@ Path::GetRootDirectory() { return result; } -static inline bool IsLibrary(Path& path, const std::string& basename) { - if (path.appendFile(std::string("lib") + basename)) { - if (path.appendSuffix(Path::GetDLLSuffix()) && path.readable()) - return true; - else if (path.elideSuffix() && path.appendSuffix("a") && path.readable()) - return true; - else if (path.elideSuffix() && path.appendSuffix("o") && path.readable()) - return true; - else if (path.elideSuffix() && path.appendSuffix("bc") && path.readable()) - return true; - } else if (path.elideFile() && path.appendFile(basename)) { - if (path.appendSuffix(Path::GetDLLSuffix()) && path.readable()) - return true; - else if (path.elideSuffix() && path.appendSuffix("a") && path.readable()) - return true; - else if (path.elideSuffix() && path.appendSuffix("o") && path.readable()) - return true; - else if (path.elideSuffix() && path.appendSuffix("bc") && path.readable()) - return true; +static void getPathList(const char*path, std::vector& Paths) { + const char* at = path; + const char* delim = strchr(at, ':'); + Path tmpPath; + while( delim != 0 ) { + std::string tmp(at, size_t(delim-at)); + if (tmpPath.setDirectory(tmp)) + if (tmpPath.readable()) + Paths.push_back(tmpPath); + at = delim + 1; + delim = strchr(at, ':'); } - path.clear(); - return false; + if (*at != 0) + if (tmpPath.setDirectory(std::string(at))) + if (tmpPath.readable()) + Paths.push_back(tmpPath); + } - -Path -Path::GetLibraryPath(const std::string& basename, - const std::vector& LibPaths) { - Path result; - - // Try the paths provided - for (std::vector::const_iterator I = LibPaths.begin(), - E = LibPaths.end(); I != E; ++I ) { - if (result.setDirectory(*I) && IsLibrary(result,basename)) - return result; +void +Path::GetSystemLibraryPaths(std::vector& Paths) { +#ifdef LTDL_SHLIBPATH_VAR + char* env_var = getenv(LTDL_SHLIBPATH_VAR); + if (env_var != 0) { + getPathList(env_var,Paths); } - - // Try the LLVM lib directory in the LLVM install area - if (result.setDirectory(LLVM_LIBDIR) && IsLibrary(result,basename)) - return result; - - // Try /usr/lib - if (result.setDirectory("/usr/lib/") && IsLibrary(result,basename)) - return result; - - // Try /lib - if (result.setDirectory("/lib/") && IsLibrary(result,basename)) - return result; - - // Can't find it, give up and return invalid path. - result.clear(); - return result; +#endif + // FIXME: Should this look at LD_LIBRARY_PATH too? + Paths.push_back(sys::Path("/usr/local/lib/")); + Paths.push_back(sys::Path("/usr/X11R6/lib/")); + Paths.push_back(sys::Path("/usr/lib/")); + Paths.push_back(sys::Path("/lib/")); } -Path -Path::GetSystemLibraryPath1() { - return Path("/lib/"); -} - -Path -Path::GetSystemLibraryPath2() { - return Path("/usr/lib/"); +void +Path::GetBytecodeLibraryPaths(std::vector& Paths) { + char * env_var = getenv("LLVM_LIB_SEARCH_PATH"); + if (env_var != 0) { + getPathList(env_var,Paths); + } +#ifdef LLVMGCCDIR + { + Path tmpPath(std::string(LLVMGCCDIR) + "bytecode-libs/"); + if (tmpPath.readable()) + Paths.push_back(tmpPath); + } +#endif +#ifdef LLVM_LIBDIR + { + Path tmpPath; + if (tmpPath.setDirectory(LLVM_LIBDIR)) + if (tmpPath.readable()) + Paths.push_back(tmpPath); + } +#endif + GetSystemLibraryPaths(Paths); } Path @@ -162,9 +156,10 @@ bool Path::hasMagicNumber(const std::string &Magic) const { int fd = ::open(path.c_str(),O_RDONLY); if (fd < 0) return false; - if (0 != ::read(fd, buf, len)) - return false; + size_t read_len = ::read(fd, buf, len); close(fd); + if (len != read_len) + return false; buf[len] = '\0'; return Magic == buf; } @@ -203,14 +198,6 @@ Path::isBytecodeFile() const { (buffer[3] == 'c' || buffer[3] == 'm')); } -bool -Path::isArchive() const { - if (readable()) { - return hasMagicNumber("!\012"); - } - return false; -} - bool Path::exists() const { return 0 == access(path.c_str(), F_OK );