From: Chris Lattner Date: Tue, 13 May 2003 22:14:13 +0000 (+0000) Subject: Search LLVM_LIB_SEARCH_PATH for objects to allow it to find crtend.o X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7cb77e188f52b61f3a71ca361704d88e6d146d03;p=llvm 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 --- diff --git a/tools/gccld/gccld.cpp b/tools/gccld/gccld.cpp index 24c624ece2c..6be78c29e31 100644 --- a/tools/gccld/gccld.cpp +++ b/tools/gccld/gccld.cpp @@ -79,12 +79,20 @@ static inline bool FileExists(const std::string &FN) { // LoadObject - Read the specified "object file", which should not search the // library path to find it. -static inline std::auto_ptr LoadObject(const std::string &FN, +static inline std::auto_ptr LoadObject(std::string FN, std::string &OutErrorMessage) { if (Verbose) std::cerr << "Loading '" << FN << "'\n"; if (!FileExists(FN)) { - OutErrorMessage = "could not find input file '" + FN + "'!"; - return std::auto_ptr(); + // Attempt to load from the LLVM_LIB_SEARCH_PATH directory... if we would + // 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(); + } } std::string ErrorMessage; @@ -224,6 +232,13 @@ static void GetAllUndefinedSymbols(Module *M, static bool LinkLibrary(Module *M, const std::string &LibName, std::string &ErrorMessage) { + std::set 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 Objects; bool isArchive; 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) GetAllDefinedSymbols(Objects[i], DefinedSymbols[i]); - std::set UndefinedSymbols; - GetAllUndefinedSymbols(M, UndefinedSymbols); - bool Linked = true; while (Linked) { // While we are linking in object files, loop. Linked = false;