patch-r259053-gcc-installation-detector.diff revision 269012
1This patch eliminates the unnecessary search for various gcc installation
2directories during each startup of clang.
3
4Introduced here: http://svnweb.freebsd.org/changeset/base/259053
5
6Index: tools/clang/lib/Driver/ToolChains.cpp
7===================================================================
8--- tools/clang/lib/Driver/ToolChains.cpp
9+++ tools/clang/lib/Driver/ToolChains.cpp
10@@ -1014,7 +1014,7 @@ static StringRef getGCCToolchainDir(const ArgList
11   return GCC_INSTALL_PREFIX;
12 }
13 
14-/// \brief Construct a GCCInstallationDetector from the driver.
15+/// \brief Initialize a GCCInstallationDetector from the driver.
16 ///
17 /// This performs all of the autodetection and sets up the various paths.
18 /// Once constructed, a GCCInstallationDetector is essentially immutable.
19@@ -1023,9 +1023,9 @@ static StringRef getGCCToolchainDir(const ArgList
20 /// should instead pull the target out of the driver. This is currently
21 /// necessary because the driver doesn't store the final version of the target
22 /// triple.
23-Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(
24-    const Driver &D, const llvm::Triple &TargetTriple, const ArgList &Args)
25-    : IsValid(false), D(D) {
26+void
27+Generic_GCC::GCCInstallationDetector::init(
28+    const llvm::Triple &TargetTriple, const ArgList &Args) {
29   llvm::Triple BiarchVariantTriple =
30       TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
31                                  : TargetTriple.get32BitArchVariant();
32@@ -1565,7 +1565,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLib
33 
34 Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
35                          const ArgList &Args)
36-  : ToolChain(D, Triple, Args), GCCInstallation(getDriver(), Triple, Args) {
37+  : ToolChain(D, Triple, Args), GCCInstallation(getDriver()) {
38   getProgramPaths().push_back(getDriver().getInstalledDir());
39   if (getDriver().getInstalledDir() != getDriver().Dir)
40     getProgramPaths().push_back(getDriver().Dir);
41@@ -2361,6 +2361,7 @@ static StringRef getMultilibDir(const llvm::Triple
42 
43 Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
44   : Generic_ELF(D, Triple, Args) {
45+  GCCInstallation.init(Triple, Args);
46   llvm::Triple::ArchType Arch = Triple.getArch();
47   std::string SysRoot = computeSysRoot();
48 
49Index: tools/clang/lib/Driver/ToolChains.h
50===================================================================
51--- tools/clang/lib/Driver/ToolChains.h
52+++ tools/clang/lib/Driver/ToolChains.h
53@@ -92,8 +92,8 @@ class LLVM_LIBRARY_VISIBILITY Generic_GCC : public
54     std::set<std::string> CandidateGCCInstallPaths;
55 
56   public:
57-    GCCInstallationDetector(const Driver &D, const llvm::Triple &TargetTriple,
58-                            const llvm::opt::ArgList &Args);
59+    GCCInstallationDetector(const Driver &D) : IsValid(false), D(D) {}
60+    void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args);
61 
62     /// \brief Check whether we detected a valid GCC install.
63     bool isValid() const { return IsValid; }
64