mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	This commit fixes llvm-cov's function coverage metric by using the number of executed functions instead of the number of fully covered functions. Differential Revision: http://reviews.llvm.org/D5196 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218672 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.3 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));
 | 
						|
}
 | 
						|
 | 
						|
FileCoverageSummary
 | 
						|
FileCoverageSummary::get(StringRef Name,
 | 
						|
                         ArrayRef<FunctionCoverageSummary> FunctionSummaries) {
 | 
						|
  size_t NumRegions = 0, CoveredRegions = 0;
 | 
						|
  size_t NumLines = 0, NonCodeLines = 0, CoveredLines = 0;
 | 
						|
  size_t NumFunctionsExecuted = 0;
 | 
						|
  for (const auto &Func : FunctionSummaries) {
 | 
						|
    CoveredRegions += Func.RegionCoverage.Covered;
 | 
						|
    NumRegions += Func.RegionCoverage.NumRegions;
 | 
						|
 | 
						|
    CoveredLines += Func.LineCoverage.Covered;
 | 
						|
    NonCodeLines += Func.LineCoverage.NonCodeLines;
 | 
						|
    NumLines += Func.LineCoverage.NumLines;
 | 
						|
 | 
						|
    if (Func.ExecutionCount != 0)
 | 
						|
      ++NumFunctionsExecuted;
 | 
						|
  }
 | 
						|
 | 
						|
  return FileCoverageSummary(
 | 
						|
      Name, RegionCoverageInfo(CoveredRegions, NumRegions),
 | 
						|
      LineCoverageInfo(CoveredLines, NonCodeLines, NumLines),
 | 
						|
      FunctionCoverageInfo(NumFunctionsExecuted, FunctionSummaries.size()),
 | 
						|
      FunctionSummaries);
 | 
						|
}
 |