Author: rsmith Date: Tue Feb 14 19:13:54 2017 New Revision: 295139 URL: http://llvm.org/viewvc/llvm-project?rev=295139&view=rev Log: Refactor GCC lib directory detection to make it easier to add lib directories that are only checked for some targets.
Modified: cfe/trunk/lib/Driver/ToolChains.cpp Modified: cfe/trunk/lib/Driver/ToolChains.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=295139&r1=295138&r2=295139&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChains.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains.cpp Tue Feb 14 19:13:54 2017 @@ -2732,45 +2732,57 @@ void Generic_GCC::GCCInstallationDetecto const llvm::Triple &TargetTriple, const ArgList &Args, const std::string &LibDir, StringRef CandidateTriple, bool NeedsBiarchSuffix) { - llvm::Triple::ArchType TargetArch = TargetTriple.getArch(); - // There are various different suffixes involving the triple we - // check for. We also record what is necessary to walk from each back - // up to the lib directory. Specifically, the number of "up" steps - // in the second half of each row is 1 + the number of path separators - // in the first half. - const std::string LibAndInstallSuffixes[][2] = { - {"/gcc/" + CandidateTriple.str(), "/../../.."}, - - // Debian puts cross-compilers in gcc-cross - {"/gcc-cross/" + CandidateTriple.str(), "/../../.."}, - - {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(), - "/../../../.."}, - - // The Freescale PPC SDK has the gcc libraries in - // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well. - {"/" + CandidateTriple.str(), "/../.."}, - - // Ubuntu has a strange mis-matched pair of triples that this happens to - // match. - // FIXME: It may be worthwhile to generalize this and look for a second - // triple. - {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}}; - if (TargetTriple.getOS() == llvm::Triple::Solaris) { scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple, NeedsBiarchSuffix); return; } - // Only look at the final, weird Ubuntu suffix for i386-linux-gnu. - const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) - - (TargetArch != llvm::Triple::x86)); - for (unsigned i = 0; i < NumLibSuffixes; ++i) { - StringRef LibSuffix = LibAndInstallSuffixes[i][0]; + llvm::Triple::ArchType TargetArch = TargetTriple.getArch(); + // Locations relative to the system lib directory where GCC's triple-specific + // directories might reside. + struct GCCLibSuffix { + // Path from system lib directory to GCC triple-specific directory. + std::string LibSuffix; + // Path from GCC triple-specific directory back to system lib directory. + // This is one '..' component per component in LibSuffix. + StringRef ReversePath; + // Whether this library suffix is relevant for the triple. + bool Active; + } Suffixes[] = { + // This is the normal place. + {"gcc/" + CandidateTriple.str(), "../..", true}, + + // Debian puts cross-compilers in gcc-cross. + {"gcc-cross/" + CandidateTriple.str(), "../..", true}, + + // The Freescale PPC SDK has the gcc libraries in + // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well. + // FIXME: Only do this on Freescale triples, since some systems put a *lot* + // of files in that location, not just GCC installation data. + {CandidateTriple.str(), "..", true}, + + // Natively multiarch systems sometimes put the GCC triple-specific + // directory within their multiarch lib directory, resulting in the + // triple appearing twice. + {CandidateTriple.str() + "/gcc/" + CandidateTriple.str(), "../../..", true}, + + // Deal with cases (on Ubuntu) where the system architecture could be i386 + // but the GCC target architecture could be (say) i686. + // FIXME: It may be worthwhile to generalize this and look for a second + // triple. + {"i386-linux-gnu/gcc/" + CandidateTriple.str(), "../../..", + TargetArch == llvm::Triple::x86} + }; + + for (auto &Suffix : Suffixes) { + if (!Suffix.Active) + continue; + + StringRef LibSuffix = Suffix.LibSuffix; std::error_code EC; for (vfs::directory_iterator - LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC), + LI = D.getVFS().dir_begin(LibDir + "/" + LibSuffix, EC), LE; !EC && LI != LE; LI = LI.increment(EC)) { StringRef VersionText = llvm::sys::path::filename(LI->getName()); @@ -2792,9 +2804,8 @@ void Generic_GCC::GCCInstallationDetecto // FIXME: We hack together the directory name here instead of // using LI to ensure stable path separators across Windows and // Linux. - GCCInstallPath = - LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str(); - GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1]; + GCCInstallPath = (LibDir + "/" + LibSuffix + "/" + VersionText).str(); + GCCParentLibPath = (GCCInstallPath + "/../" + Suffix.ReversePath).str(); IsValid = true; } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits