forked from OSchip/llvm-project
This version of Linker.cpp works a lot better, but it's a little messy. Sorry.
Use FileOpenable() instead of FileExists(). Create IsBytecode() predicate -- like IsArchive(), but for bytecode files. Use IsBytecode() before trying to load any file as a bytecode file. llvm-svn: 9893
This commit is contained in:
parent
ca35fbf33d
commit
ec21f8e9bf
|
@ -30,24 +30,32 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
/// FileExists - Returns true IFF a file named FN exists and is readable.
|
|
||||||
///
|
|
||||||
static inline bool FileExists(const std::string &FN) {
|
|
||||||
return access(FN.c_str(), R_OK | F_OK) != -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// IsArchive - Returns true IFF the file named FN appears to be a "ar" library
|
/// IsArchive - Returns true IFF the file named FN appears to be a "ar" library
|
||||||
/// archive. The file named FN must exist.
|
/// archive. The file named FN must exist.
|
||||||
///
|
///
|
||||||
static inline bool IsArchive(const std::string &FN) {
|
static inline bool IsArchive(const std::string &FN) {
|
||||||
// Inspect the beginning of the file to see if it contains the "ar" magic
|
// Inspect the beginning of the file to see if it contains the "ar" magic
|
||||||
// string.
|
// string.
|
||||||
std::string ArchiveMagic("!<arch>\012");
|
std::string Magic("!<arch>\012");
|
||||||
char buf[1 + ArchiveMagic.size()];
|
char buf[1 + Magic.size()];
|
||||||
std::ifstream f(FN.c_str());
|
std::ifstream f(FN.c_str());
|
||||||
f.read(buf, ArchiveMagic.size());
|
f.read(buf, Magic.size());
|
||||||
buf[ArchiveMagic.size()] = '\0';
|
buf[Magic.size()] = '\0';
|
||||||
return ArchiveMagic == buf;
|
return Magic == buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// IsBytecode - Returns true IFF the file named FN appears to be an
|
||||||
|
/// LLVM bytecode file. The file named FN must exist.
|
||||||
|
///
|
||||||
|
static inline bool IsBytecode(const std::string &FN) {
|
||||||
|
// Inspect the beginning of the file to see if it contains the LLVM
|
||||||
|
// bytecode format magic string.
|
||||||
|
std::string Magic("llvm");
|
||||||
|
char buf[1 + Magic.size()];
|
||||||
|
std::ifstream f(FN.c_str());
|
||||||
|
f.read(buf, Magic.size());
|
||||||
|
buf[Magic.size()] = '\0';
|
||||||
|
return Magic == buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// FindLib - locates a particular library. It will prepend and append
|
/// FindLib - locates a particular library. It will prepend and append
|
||||||
|
@ -67,7 +75,7 @@ static inline bool IsArchive(const std::string &FN) {
|
||||||
static std::string
|
static std::string
|
||||||
FindLib(const std::string &Filename, const std::vector<std::string> &Paths) {
|
FindLib(const std::string &Filename, const std::vector<std::string> &Paths) {
|
||||||
// Determine if the pathname can be found as it stands.
|
// Determine if the pathname can be found as it stands.
|
||||||
if (FileExists(Filename))
|
if (FileOpenable(Filename))
|
||||||
return Filename;
|
return Filename;
|
||||||
|
|
||||||
// If that doesn't work, convert the name into a library name.
|
// If that doesn't work, convert the name into a library name.
|
||||||
|
@ -78,13 +86,13 @@ FindLib(const std::string &Filename, const std::vector<std::string> &Paths) {
|
||||||
for (unsigned Index = 0; Index != Paths.size(); ++Index) {
|
for (unsigned Index = 0; Index != Paths.size(); ++Index) {
|
||||||
std::string Directory = Paths[Index] + "/";
|
std::string Directory = Paths[Index] + "/";
|
||||||
|
|
||||||
if (FileExists(Directory + LibName + ".bc"))
|
if (FileOpenable(Directory + LibName + ".bc"))
|
||||||
return Directory + LibName + ".bc";
|
return Directory + LibName + ".bc";
|
||||||
|
|
||||||
if (FileExists(Directory + LibName + ".so"))
|
if (FileOpenable(Directory + LibName + ".so"))
|
||||||
return Directory + LibName + ".so";
|
return Directory + LibName + ".so";
|
||||||
|
|
||||||
if (FileExists(Directory + LibName + ".a"))
|
if (FileOpenable(Directory + LibName + ".a"))
|
||||||
return Directory + LibName + ".a";
|
return Directory + LibName + ".a";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,7 +102,7 @@ FindLib(const std::string &Filename, const std::vector<std::string> &Paths) {
|
||||||
return std::string();
|
return std::string();
|
||||||
|
|
||||||
LibName = std::string(SearchPath) + "/" + LibName;
|
LibName = std::string(SearchPath) + "/" + LibName;
|
||||||
if (FileExists(LibName))
|
if (FileOpenable(LibName))
|
||||||
return LibName;
|
return LibName;
|
||||||
|
|
||||||
return std::string();
|
return std::string();
|
||||||
|
@ -329,7 +337,7 @@ bool LinkFiles(const char *progname,
|
||||||
|
|
||||||
for (unsigned i = 0; i < Files.size(); ++i) {
|
for (unsigned i = 0; i < Files.size(); ++i) {
|
||||||
// Determine where this file lives.
|
// Determine where this file lives.
|
||||||
if (FileExists(Files[i])) {
|
if (FileOpenable(Files[i])) {
|
||||||
Pathname = Files[i];
|
Pathname = Files[i];
|
||||||
} else {
|
} else {
|
||||||
if (SearchPath == NULL) {
|
if (SearchPath == NULL) {
|
||||||
|
@ -341,7 +349,7 @@ bool LinkFiles(const char *progname,
|
||||||
}
|
}
|
||||||
|
|
||||||
Pathname = std::string(SearchPath)+"/"+Files[i];
|
Pathname = std::string(SearchPath)+"/"+Files[i];
|
||||||
if (!FileExists(Pathname)) {
|
if (!FileOpenable(Pathname)) {
|
||||||
std::cerr << progname << ": Cannot find linker input file '"
|
std::cerr << progname << ": Cannot find linker input file '"
|
||||||
<< Files[i] << "'\n";
|
<< Files[i] << "'\n";
|
||||||
return true;
|
return true;
|
||||||
|
@ -359,7 +367,7 @@ bool LinkFiles(const char *progname,
|
||||||
": Error linking in archive '" + Pathname + "'");
|
": Error linking in archive '" + Pathname + "'");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else {
|
} else if (IsBytecode(Pathname)) {
|
||||||
if (Verbose)
|
if (Verbose)
|
||||||
std::cerr << "Trying to link bytecode file '" << Pathname << "'\n";
|
std::cerr << "Trying to link bytecode file '" << Pathname << "'\n";
|
||||||
|
|
||||||
|
@ -426,7 +434,7 @@ bool LinkLibraries(const char *progname,
|
||||||
": Error linking in archive '" + Pathname + "' (-l" + Libraries[i] + ")");
|
": Error linking in archive '" + Pathname + "' (-l" + Libraries[i] + ")");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else {
|
} else if (IsBytecode(Pathname)) {
|
||||||
if (Verbose)
|
if (Verbose)
|
||||||
std::cerr << "Trying to link bytecode file '" << Pathname << "' (-l" << Libraries[i] << ")\n";
|
std::cerr << "Trying to link bytecode file '" << Pathname << "' (-l" << Libraries[i] << ")\n";
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue