[Cmake-commits] [cmake-commits] king committed cmCTestCoverageHandler.cxx 1.68 1.69 cmCTestCoverageHandler.h 1.20 1.21

cmake-commits at cmake.org cmake-commits at cmake.org
Mon Mar 9 12:19:59 EDT 2009


Update of /cvsroot/CMake/CMake/Source/CTest
In directory public:/mounts/ram/cvs-serv16724/Source/CTest

Modified Files:
	cmCTestCoverageHandler.cxx cmCTestCoverageHandler.h 
Log Message:
ENH: Efficiently filter CTest coverage by label

This teaches CTest to process coverage information only for object files
in targets containing labels of interest.  This change also improves
loading of global coverage information by globbing only in each target
support directory instead of the entire build tree.


Index: cmCTestCoverageHandler.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/CTest/cmCTestCoverageHandler.cxx,v
retrieving revision 1.68
retrieving revision 1.69
diff -C 2 -d -r1.68 -r1.69
*** cmCTestCoverageHandler.cxx	9 Mar 2009 16:19:26 -0000	1.68
--- cmCTestCoverageHandler.cxx	9 Mar 2009 16:19:52 -0000	1.69
***************
*** 695,709 ****
    cmsys::RegularExpression st2re6(st2gcovOutputRex6.c_str());
  
! 
!   cmsys::Glob gl;
!   gl.RecurseOn();
!   gl.RecurseThroughSymlinksOff();
!   std::string daGlob = cont->BinaryDir + "/*.da";
!   gl.FindFiles(daGlob);
!   std::vector<std::string> files = gl.GetFiles();
!   daGlob = cont->BinaryDir + "/*.gcda";
!   gl.FindFiles(daGlob);
!   std::vector<std::string>& moreFiles = gl.GetFiles();
!   files.insert(files.end(), moreFiles.begin(), moreFiles.end());
    std::vector<std::string>::iterator it;
  
--- 695,700 ----
    cmsys::RegularExpression st2re6(st2gcovOutputRex6.c_str());
  
!   std::vector<std::string> files;
!   this->FindGCovFiles(files);
    std::vector<std::string>::iterator it;
  
***************
*** 1062,1065 ****
--- 1053,1087 ----
  }
  
+ //----------------------------------------------------------------------------
+ void cmCTestCoverageHandler::FindGCovFiles(std::vector<std::string>& files)
+ {
+   cmsys::Glob gl;
+   gl.RecurseOn();
+   gl.RecurseThroughSymlinksOff();
+ 
+   for(LabelMapType::const_iterator lmi = this->TargetDirs.begin();
+       lmi != this->TargetDirs.end(); ++lmi)
+     {
+     // Skip targets containing no interesting labels.
+     if(!this->IntersectsFilter(lmi->second))
+       {
+       continue;
+       }
+ 
+     // Coverage files appear next to their object files in the target
+     // support directory.
+     cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
+                "   globbing for coverage in: " << lmi->first << std::endl);
+     std::string daGlob = lmi->first;
+     daGlob += "/*.da";
+     gl.FindFiles(daGlob);
+     files.insert(files.end(), gl.GetFiles().begin(), gl.GetFiles().end());
+     daGlob = lmi->first;
+     daGlob += "/*.gcda";
+     gl.FindFiles(daGlob);
+     files.insert(files.end(), gl.GetFiles().begin(), gl.GetFiles().end());
+     }
+ }
+ 
  //----------------------------------------------------------------------
  int cmCTestCoverageHandler::HandleTracePyCoverage(
***************
*** 1764,1767 ****
--- 1786,1790 ----
  void cmCTestCoverageHandler::LoadLabels(const char* dir)
  {
+   LabelSet& dirLabels = this->TargetDirs[dir];
    std::string fname = dir;
    fname += "/Labels.txt";
***************
*** 1790,1793 ****
--- 1813,1817 ----
        std::string label = line.substr(1);
        int id = this->GetLabelId(label);
+       dirLabels.insert(id);
        if(inTarget)
          {
***************
*** 1848,1851 ****
--- 1872,1892 ----
  
  //----------------------------------------------------------------------
+ bool cmCTestCoverageHandler::IntersectsFilter(LabelSet const& labels)
+ {
+   // If there is no label filter then nothing is filtered out.
+   if(this->LabelFilter.empty())
+     {
+     return true;
+     }
+ 
+   std::vector<int> ids;
+   cmsys_stl::set_intersection
+     (labels.begin(), labels.end(),
+      this->LabelFilter.begin(), this->LabelFilter.end(),
+      cmsys_stl::back_inserter(ids));
+   return !ids.empty();
+ }
+ 
+ //----------------------------------------------------------------------
  bool cmCTestCoverageHandler::IsFilteredOut(std::string const& source)
  {
***************
*** 1858,1871 ****
    // The source is filtered out if it does not have any labels in
    // common with the filter set.
-   std::vector<int> ids;
    std::string shortSrc = this->CTest->GetShortPathToFile(source.c_str());
    LabelMapType::const_iterator li = this->SourceLabels.find(shortSrc);
!   if(li != this->SourceLabels.end() && !li->second.empty())
      {
!     cmsys_stl::set_intersection
!       (li->second.begin(), li->second.end(),
!        this->LabelFilter.begin(), this->LabelFilter.end(),
!        cmsys_stl::back_inserter(ids));
      }
!   return ids.empty();
  }
--- 1899,1908 ----
    // The source is filtered out if it does not have any labels in
    // common with the filter set.
    std::string shortSrc = this->CTest->GetShortPathToFile(source.c_str());
    LabelMapType::const_iterator li = this->SourceLabels.find(shortSrc);
!   if(li != this->SourceLabels.end())
      {
!     return !this->IntersectsFilter(li->second);
      }
!   return true;
  }

Index: cmCTestCoverageHandler.h
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/CTest/cmCTestCoverageHandler.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -C 2 -d -r1.20 -r1.21
*** cmCTestCoverageHandler.h	9 Mar 2009 16:19:27 -0000	1.20
--- cmCTestCoverageHandler.h	9 Mar 2009 16:19:56 -0000	1.21
***************
*** 62,65 ****
--- 62,66 ----
    //! Handle coverage using GCC's GCov
    int HandleGCovCoverage(cmCTestCoverageHandlerContainer* cont);
+   void FindGCovFiles(std::vector<std::string>& files);
  
    //! Handle coverage using Bullseye
***************
*** 146,149 ****
--- 147,151 ----
    typedef std::map<cmStdString, LabelSet> LabelMapType;
    LabelMapType SourceLabels;
+   LabelMapType TargetDirs;
  
    // Map from label name to label id.
***************
*** 160,163 ****
--- 162,166 ----
    // Label-based filtering.
    std::set<int> LabelFilter;
+   bool IntersectsFilter(LabelSet const& labels);
    bool IsFilteredOut(std::string const& source);
  };



More information about the Cmake-commits mailing list