72 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
//===- CoverageSummaryInfo.cpp - Coverage summary for function/file -------===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// These structures are used to represent code coverage metrics
 | 
						|
// for functions/files.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "CoverageSummaryInfo.h"
 | 
						|
 | 
						|
using namespace llvm;
 | 
						|
using namespace coverage;
 | 
						|
 | 
						|
FunctionCoverageSummary
 | 
						|
FunctionCoverageSummary::get(const coverage::FunctionRecord &Function) {
 | 
						|
  // Compute the region coverage
 | 
						|
  size_t NumCodeRegions = 0, CoveredRegions = 0;
 | 
						|
  for (auto &CR : Function.CountedRegions) {
 | 
						|
    if (CR.Kind != CounterMappingRegion::CodeRegion)
 | 
						|
      continue;
 | 
						|
    ++NumCodeRegions;
 | 
						|
    if (CR.ExecutionCount != 0)
 | 
						|
      ++CoveredRegions;
 | 
						|
  }
 | 
						|
 | 
						|
  // Compute the line coverage
 | 
						|
  size_t NumLines = 0, CoveredLines = 0;
 | 
						|
  for (unsigned FileID = 0, E = Function.Filenames.size(); FileID < E;
 | 
						|
       ++FileID) {
 | 
						|
    // Find the line start and end of the function's source code
 | 
						|
    // in that particular file
 | 
						|
    unsigned LineStart = std::numeric_limits<unsigned>::max();
 | 
						|
    unsigned LineEnd = 0;
 | 
						|
    for (auto &CR : Function.CountedRegions) {
 | 
						|
      if (CR.FileID != FileID)
 | 
						|
        continue;
 | 
						|
      LineStart = std::min(LineStart, CR.LineStart);
 | 
						|
      LineEnd = std::max(LineEnd, CR.LineEnd);
 | 
						|
    }
 | 
						|
    unsigned LineCount = LineEnd - LineStart + 1;
 | 
						|
 | 
						|
    // Get counters
 | 
						|
    llvm::SmallVector<uint64_t, 16> ExecutionCounts;
 | 
						|
    ExecutionCounts.resize(LineCount, 0);
 | 
						|
    for (auto &CR : Function.CountedRegions) {
 | 
						|
      if (CR.FileID != FileID)
 | 
						|
        continue;
 | 
						|
      // Ignore the lines that were skipped by the preprocessor.
 | 
						|
      auto ExecutionCount = CR.ExecutionCount;
 | 
						|
      if (CR.Kind == CounterMappingRegion::SkippedRegion) {
 | 
						|
        LineCount -= CR.LineEnd - CR.LineStart + 1;
 | 
						|
        ExecutionCount = 1;
 | 
						|
      }
 | 
						|
      for (unsigned I = CR.LineStart; I <= CR.LineEnd; ++I)
 | 
						|
        ExecutionCounts[I - LineStart] = ExecutionCount;
 | 
						|
    }
 | 
						|
    CoveredLines += LineCount - std::count(ExecutionCounts.begin(),
 | 
						|
                                           ExecutionCounts.end(), 0);
 | 
						|
    NumLines += LineCount;
 | 
						|
  }
 | 
						|
  return FunctionCoverageSummary(
 | 
						|
      Function.Name, Function.ExecutionCount,
 | 
						|
      RegionCoverageInfo(CoveredRegions, NumCodeRegions),
 | 
						|
      LineCoverageInfo(CoveredLines, 0, NumLines));
 | 
						|
}
 |