]> granicus.if.org Git - clang/commitdiff
Start keeping track of what work was done to detect a GCC installation
authorChandler Carruth <chandlerc@gmail.com>
Tue, 30 Jul 2013 17:57:09 +0000 (17:57 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Tue, 30 Jul 2013 17:57:09 +0000 (17:57 +0000)
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

include/clang/Driver/ToolChain.h
lib/Driver/Driver.cpp
lib/Driver/ToolChains.cpp
lib/Driver/ToolChains.h

index c73575944e970df9666d0193ca10b4054dbd921a..1ba5cdeb992823bd5f9b0a14a3139a3395378ba7 100644 (file)
@@ -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
index c105fa86f9f7bcbf85d69289a07d50c8f69647ad..34594e643d63354a643e394c17d6962972a01c7f 100644 (file)
@@ -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(),
index 090181b4826e4a539d53c729b6b04dd507ee987f..62f7834e56fd88fd9ccee4575cba5c2a1747f100 100644 (file)
@@ -1049,6 +1049,16 @@ Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(
   }
 }
 
+void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
+  for (SmallVectorImpl<std::string>::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<StringRef> &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;
 }
index 0873ca1e3cca04ad90df552f746ca2ec35531ea3..02ac4f513b9fa13b063377dbaed459bdfdc6cbb7 100644 (file)
@@ -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<std::string, 4> 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;