1263320SdimThis patch eliminates the unnecessary search for various gcc installation
2263320Sdimdirectories during each startup of clang.
3263320Sdim
4263320SdimIntroduced here: http://svn.freebsd.org/changeset/base/259053
5263320Sdim
6263320SdimIndex: tools/clang/lib/Driver/ToolChains.cpp
7263320Sdim===================================================================
8263320Sdim--- tools/clang/lib/Driver/ToolChains.cpp
9263320Sdim+++ tools/clang/lib/Driver/ToolChains.cpp
10263320Sdim@@ -1014,7 +1014,7 @@ static StringRef getGCCToolchainDir(const ArgList
11263320Sdim   return GCC_INSTALL_PREFIX;
12263320Sdim }
13263320Sdim 
14263320Sdim-/// \brief Construct a GCCInstallationDetector from the driver.
15263320Sdim+/// \brief Initialize a GCCInstallationDetector from the driver.
16263320Sdim ///
17263320Sdim /// This performs all of the autodetection and sets up the various paths.
18263320Sdim /// Once constructed, a GCCInstallationDetector is essentially immutable.
19263320Sdim@@ -1023,9 +1023,9 @@ static StringRef getGCCToolchainDir(const ArgList
20263320Sdim /// should instead pull the target out of the driver. This is currently
21263320Sdim /// necessary because the driver doesn't store the final version of the target
22263320Sdim /// triple.
23263320Sdim-Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(
24263320Sdim-    const Driver &D, const llvm::Triple &TargetTriple, const ArgList &Args)
25263320Sdim-    : IsValid(false), D(D) {
26263320Sdim+void
27263320Sdim+Generic_GCC::GCCInstallationDetector::init(
28263320Sdim+    const llvm::Triple &TargetTriple, const ArgList &Args) {
29263320Sdim   llvm::Triple BiarchVariantTriple =
30263320Sdim       TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
31263320Sdim                                  : TargetTriple.get32BitArchVariant();
32263320Sdim@@ -1565,7 +1565,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLib
33263320Sdim 
34263320Sdim Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
35263320Sdim                          const ArgList &Args)
36263320Sdim-  : ToolChain(D, Triple, Args), GCCInstallation(getDriver(), Triple, Args) {
37263320Sdim+  : ToolChain(D, Triple, Args), GCCInstallation(getDriver()) {
38263320Sdim   getProgramPaths().push_back(getDriver().getInstalledDir());
39263320Sdim   if (getDriver().getInstalledDir() != getDriver().Dir)
40263320Sdim     getProgramPaths().push_back(getDriver().Dir);
41263320Sdim@@ -2361,6 +2361,7 @@ static StringRef getMultilibDir(const llvm::Triple
42263320Sdim 
43263320Sdim Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
44263320Sdim   : Generic_ELF(D, Triple, Args) {
45263320Sdim+  GCCInstallation.init(Triple, Args);
46263320Sdim   llvm::Triple::ArchType Arch = Triple.getArch();
47263320Sdim   std::string SysRoot = computeSysRoot();
48263320Sdim 
49263320SdimIndex: tools/clang/lib/Driver/ToolChains.h
50263320Sdim===================================================================
51263320Sdim--- tools/clang/lib/Driver/ToolChains.h
52263320Sdim+++ tools/clang/lib/Driver/ToolChains.h
53263320Sdim@@ -92,8 +92,8 @@ class LLVM_LIBRARY_VISIBILITY Generic_GCC : public
54263320Sdim     std::set<std::string> CandidateGCCInstallPaths;
55263320Sdim 
56263320Sdim   public:
57263320Sdim-    GCCInstallationDetector(const Driver &D, const llvm::Triple &TargetTriple,
58263320Sdim-                            const llvm::opt::ArgList &Args);
59263320Sdim+    GCCInstallationDetector(const Driver &D) : IsValid(false), D(D) {}
60263320Sdim+    void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args);
61263320Sdim 
62263320Sdim     /// \brief Check whether we detected a valid GCC install.
63263320Sdim     bool isValid() const { return IsValid; }
64