[llvm-cov] Add the project summary to the text coverage report for each source file.

This patch is a spin-off from https://reviews.llvm.org/D23922. It extends the text view to preserve the same feature as the html view.

Differential Revision: https://reviews.llvm.org/D24241

llvm-svn: 280756
diff --git a/llvm/tools/llvm-cov/CodeCoverage.cpp b/llvm/tools/llvm-cov/CodeCoverage.cpp
index 00c5470..02309c9 100644
--- a/llvm/tools/llvm-cov/CodeCoverage.cpp
+++ b/llvm/tools/llvm-cov/CodeCoverage.cpp
@@ -669,7 +669,7 @@
 
   // Show files
   bool ShowFilenames =
-      (SourceFiles.size() != 1) ||
+      (SourceFiles.size() != 1) || ViewOpts.hasOutputDirectory() ||
       (ViewOpts.Format == CoverageViewOptions::OutputFormat::HTML);
 
   if (SourceFiles.empty())
diff --git a/llvm/tools/llvm-cov/SourceCoverageView.cpp b/llvm/tools/llvm-cov/SourceCoverageView.cpp
index 323352a..47980ab 100644
--- a/llvm/tools/llvm-cov/SourceCoverageView.cpp
+++ b/llvm/tools/llvm-cov/SourceCoverageView.cpp
@@ -142,6 +142,15 @@
   llvm_unreachable("Unknown coverage output format!");
 }
 
+std::string SourceCoverageView::getNativeSourceName() const {
+  std::string SourceFile = isFunctionView() ? "Function: " : "Source: ";
+  SourceFile += getSourceName().str();
+  SmallString<128> SourceText(SourceFile);
+  sys::path::remove_dots(SourceText, /*remove_dot_dots=*/true);
+  sys::path::native(SourceText);
+  return SourceText.c_str();
+}
+
 void SourceCoverageView::addExpansion(
     const coverage::CounterMappingRegion &Region,
     std::unique_ptr<SourceCoverageView> View) {
diff --git a/llvm/tools/llvm-cov/SourceCoverageView.h b/llvm/tools/llvm-cov/SourceCoverageView.h
index 410c8fd..63c5b65 100644
--- a/llvm/tools/llvm-cov/SourceCoverageView.h
+++ b/llvm/tools/llvm-cov/SourceCoverageView.h
@@ -278,6 +278,9 @@
 
   StringRef getSourceName() const { return SourceName; }
 
+  /// \brief Return the source name formatted for the host OS.
+  std::string getNativeSourceName() const;
+
   bool isFunctionView() const { return FunctionView; }
 
   const CoverageViewOptions &getOptions() const { return Options; }
diff --git a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
index 7e069de..52e594f 100644
--- a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
+++ b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp
@@ -342,12 +342,7 @@
                                               unsigned FirstUncoveredLineNo) {
   OS << BeginSourceNameDiv;
   // Render the source name for the view.
-  std::string SourceFile = isFunctionView() ? "Function: " : "Source: ";
-  SourceFile += getSourceName().str();
-  SmallString<128> SourceText(SourceFile);
-  sys::path::remove_dots(SourceText, /*remove_dot_dots=*/true);
-  sys::path::native(SourceText);
-  OS << tag("pre", escape(SourceText, getOptions()));
+  OS << tag("pre", escape(getNativeSourceName(), getOptions()));
   if (WholeFile) {
     // Render the object file name for the view.
     OS << tag("pre",
diff --git a/llvm/tools/llvm-cov/SourceCoverageViewText.cpp b/llvm/tools/llvm-cov/SourceCoverageViewText.cpp
index 52e405e..6dec4c7 100644
--- a/llvm/tools/llvm-cov/SourceCoverageViewText.cpp
+++ b/llvm/tools/llvm-cov/SourceCoverageViewText.cpp
@@ -65,11 +65,11 @@
 
 void SourceCoverageViewText::renderSourceName(raw_ostream &OS, bool WholeFile,
                                               unsigned FirstUncoveredLineNo) {
-  getOptions().colored_ostream(OS, raw_ostream::CYAN) << getSourceName()
+  getOptions().colored_ostream(OS, raw_ostream::CYAN) << getNativeSourceName()
                                                       << ":\n";
   if (WholeFile) {
     getOptions().colored_ostream(OS, raw_ostream::CYAN)
-        << getOptions().ObjectFilename << ":\n";
+        << "Binary: " << getOptions().ObjectFilename << ":\n";
   }
 }