Search LLVM_LIB_SEARCH_PATH for objects to allow it to find crtend.o

Implement minor library linking optimization.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6181 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2003-05-13 22:14:13 +00:00
parent 0ec3590664
commit 7cb77e188f

View File

@ -79,12 +79,20 @@ static inline bool FileExists(const std::string &FN) {
// LoadObject - Read the specified "object file", which should not search the // LoadObject - Read the specified "object file", which should not search the
// library path to find it. // library path to find it.
static inline std::auto_ptr<Module> LoadObject(const std::string &FN, static inline std::auto_ptr<Module> LoadObject(std::string FN,
std::string &OutErrorMessage) { std::string &OutErrorMessage) {
if (Verbose) std::cerr << "Loading '" << FN << "'\n"; if (Verbose) std::cerr << "Loading '" << FN << "'\n";
if (!FileExists(FN)) { if (!FileExists(FN)) {
OutErrorMessage = "could not find input file '" + FN + "'!"; // Attempt to load from the LLVM_LIB_SEARCH_PATH directory... if we would
return std::auto_ptr<Module>(); // otherwise fail. This is used to locate objects like crtend.o.
//
char *SearchPath = getenv("LLVM_LIB_SEARCH_PATH");
if (SearchPath && FileExists(std::string(SearchPath)+"/"+FN))
FN = std::string(SearchPath)+"/"+FN;
else {
OutErrorMessage = "could not find input file '" + FN + "'!";
return std::auto_ptr<Module>();
}
} }
std::string ErrorMessage; std::string ErrorMessage;
@ -224,6 +232,13 @@ static void GetAllUndefinedSymbols(Module *M,
static bool LinkLibrary(Module *M, const std::string &LibName, static bool LinkLibrary(Module *M, const std::string &LibName,
std::string &ErrorMessage) { std::string &ErrorMessage) {
std::set<std::string> UndefinedSymbols;
GetAllUndefinedSymbols(M, UndefinedSymbols);
if (UndefinedSymbols.empty()) {
if (Verbose) std::cerr << " No symbols undefined, don't link library!\n";
return false; // No need to link anything in!
}
std::vector<Module*> Objects; std::vector<Module*> Objects;
bool isArchive; bool isArchive;
if (LoadLibrary(LibName, Objects, isArchive, ErrorMessage)) return true; if (LoadLibrary(LibName, Objects, isArchive, ErrorMessage)) return true;
@ -234,9 +249,6 @@ static bool LinkLibrary(Module *M, const std::string &LibName,
for (unsigned i = 0; i != Objects.size(); ++i) for (unsigned i = 0; i != Objects.size(); ++i)
GetAllDefinedSymbols(Objects[i], DefinedSymbols[i]); GetAllDefinedSymbols(Objects[i], DefinedSymbols[i]);
std::set<std::string> UndefinedSymbols;
GetAllUndefinedSymbols(M, UndefinedSymbols);
bool Linked = true; bool Linked = true;
while (Linked) { // While we are linking in object files, loop. while (Linked) { // While we are linking in object files, loop.
Linked = false; Linked = false;