From: Chandler Carruth Date: Tue, 30 Jul 2013 17:57:09 +0000 (+0000) Subject: Start keeping track of what work was done to detect a GCC installation X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6365ab91a0cf2f20c73ea9c39b55c14ab438018e;p=clang Start keeping track of what work was done to detect a GCC installation on the system, and report it when running the driver in verbose mode. Without this it is essentially impossible to understand why a particular GCC toolchain is used by Clang for libstdc++, libgcc, etc. This also required threading a hook through the toolchain layers for a specific toolchain implementation to print custom information under 'clang -v'. The naming here isn't spectacular. Suggestions welcome. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187427 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h index c73575944e..1ba5cdeb99 100644 --- a/include/clang/Driver/ToolChain.h +++ b/include/clang/Driver/ToolChain.h @@ -145,6 +145,13 @@ public: std::string GetFilePath(const char *Name) const; std::string GetProgramPath(const char *Name) const; + /// \brief Dispatch to the specific toolchain for verbose printing. + /// + /// This is used when handling the verbose option to print detailed, + /// toolchain-specific information useful for understanding the behavior of + /// the driver on a specific platform. + virtual void printVerboseInfo(raw_ostream &OS) const {}; + // Platform defaults information /// HasNativeLTOLinker - Check whether the linker and related tools have diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index c105fa86f9..34594e643d 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -695,6 +695,10 @@ bool Driver::HandleImmediateArgs(const Compilation &C) { } const ToolChain &TC = C.getDefaultToolChain(); + + if (C.getArgs().hasArg(options::OPT_v)) + TC.printVerboseInfo(llvm::errs()); + if (C.getArgs().hasArg(options::OPT_print_search_dirs)) { llvm::outs() << "programs: ="; for (ToolChain::path_list::const_iterator it = TC.getProgramPaths().begin(), diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 090181b482..62f7834e56 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -1049,6 +1049,16 @@ Generic_GCC::GCCInstallationDetector::GCCInstallationDetector( } } +void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const { + for (SmallVectorImpl::const_iterator + I = CandidateGCCInstallPaths.begin(), + E = CandidateGCCInstallPaths.end(); + I != E; ++I) + OS << "Found candidate GCC installation: " << *I << "\n"; + + OS << "Selected GCC installation: " << GCCInstallPath << "\n"; +} + /*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples( const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple, SmallVectorImpl &LibDirs, @@ -1383,6 +1393,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( llvm::error_code EC; for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE; !EC && LI != LE; LI = LI.increment(EC)) { + CandidateGCCInstallPaths.push_back(LI->path()); StringRef VersionText = llvm::sys::path::filename(LI->path()); GCCVersion CandidateVersion = GCCVersion::Parse(VersionText); static const GCCVersion MinVersion = { "4.1.1", 4, 1, 1, "" }; @@ -1458,6 +1469,11 @@ Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Link(*this); } +void Generic_GCC::printVerboseInfo(raw_ostream &OS) const { + // Print the information about how we detected the GCC installation. + GCCInstallation.print(OS); +} + bool Generic_GCC::IsUnwindTablesDefault() const { return getArch() == llvm::Triple::x86_64; } diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index 0873ca1e3c..02ac4f513b 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -68,7 +68,6 @@ protected: /// information about it. It starts from the host information provided to the /// Driver, and has logic for fuzzing that where appropriate. class GCCInstallationDetector { - bool IsValid; llvm::Triple GCCTriple; @@ -79,6 +78,10 @@ protected: GCCVersion Version; + // We retain the list of install paths that were considered and rejected in + // order to print out detailed information in verbose mode. + SmallVector CandidateGCCInstallPaths; + public: GCCInstallationDetector(const Driver &D, const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args); @@ -102,6 +105,9 @@ protected: /// \brief Get the detected GCC version string. const GCCVersion &getVersion() const { return Version; } + /// \brief Print information about the detected GCC installation. + void print(raw_ostream &OS) const; + private: static void CollectLibDirsAndTriples(const llvm::Triple &TargetTriple, @@ -125,6 +131,8 @@ public: const llvm::opt::ArgList &Args); ~Generic_GCC(); + virtual void printVerboseInfo(raw_ostream &OS) const; + virtual bool IsUnwindTablesDefault() const; virtual bool isPICDefault() const; virtual bool isPIEDefault() const;