1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00

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
This commit is contained in:
Reid Spencer 2004-12-13 03:00:51 +00:00
parent 38992108f9
commit dac49a55a1

View File

@ -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<sys::Path>& 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<std::string>& LibPaths) {
Path result;
// Try the paths provided
for (std::vector<std::string>::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<sys::Path>& 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<sys::Path>& 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("!<arch>\012");
}
return false;
}
bool
Path::exists() const {
return 0 == access(path.c_str(), F_OK );