void CodeCoverageTool::createExpansionSubView( const CountedRegion &ExpandedRegion, const FunctionCoverageMapping &Function, SourceCoverageView &Parent) { auto ExpandedLines = findExpandedFileInterestingLineRange( ExpandedRegion.ExpandedFileID, Function); if (ViewOpts.Debug) llvm::errs() << "Expansion of " << ExpandedRegion.ExpandedFileID << ":" << ExpandedLines.first << " -> " << ExpandedLines.second << " @ " << ExpandedRegion.FileID << ", " << ExpandedRegion.LineStart << ":" << ExpandedRegion.ColumnStart << "\n"; auto SourceBuffer = getSourceFile(Function.Filenames[ExpandedRegion.ExpandedFileID]); if (!SourceBuffer) return; auto SubView = llvm::make_unique<SourceCoverageView>(SourceBuffer.get(), Parent.getOptions()); auto RegionManager = llvm::make_unique<SourceCoverageDataManager>(); for (const auto &CR : Function.CountedRegions) { if (CR.FileID == ExpandedRegion.ExpandedFileID) RegionManager->insert(CR); } SubView->load(std::move(RegionManager)); createExpansionSubViews(*SubView, ExpandedRegion.ExpandedFileID, Function); Parent.addExpansion(ExpandedRegion, std::move(SubView)); }
bool CodeCoverageTool::createSourceFileView( StringRef SourceFile, SourceCoverageView &View, ArrayRef<FunctionCoverageMapping> FunctionMappingRecords, bool UseOnlyRegionsInMainFile) { auto RegionManager = llvm::make_unique<SourceCoverageDataManager>(); FunctionInstantiationSetCollector InstantiationSetCollector; for (const auto &Function : FunctionMappingRecords) { unsigned MainFileID; if (findMainViewFileID(SourceFile, Function, MainFileID)) continue; SmallSet<unsigned, 8> InterestingFileIDs; if (UseOnlyRegionsInMainFile) { InterestingFileIDs.insert(MainFileID); } else if (!gatherInterestingFileIDs(SourceFile, Function, InterestingFileIDs)) continue; // Get the interesting regions for (const auto &CR : Function.CountedRegions) { if (InterestingFileIDs.count(CR.FileID)) RegionManager->insert(CR); } InstantiationSetCollector.insert(Function, MainFileID); createExpansionSubViews(View, MainFileID, Function); } if (RegionManager->getCoverageSegments().empty()) return true; View.load(std::move(RegionManager)); // Show instantiations if (!ViewOpts.ShowFunctionInstantiations) return false; for (const auto &InstantiationSet : InstantiationSetCollector) { if (InstantiationSet.second.size() < 2) continue; for (auto Function : InstantiationSet.second) { unsigned FileID = Function->CountedRegions.front().FileID; unsigned Line = 0; for (const auto &CR : Function->CountedRegions) if (CR.FileID == FileID) Line = std::max(CR.LineEnd, Line); auto SourceBuffer = getSourceFile(Function->Filenames[FileID]); if (!SourceBuffer) continue; auto SubView = llvm::make_unique<SourceCoverageView>(SourceBuffer.get(), View.getOptions()); createInstantiationSubView(SourceFile, *Function, *SubView); View.addInstantiation(Function->Name, Line, std::move(SubView)); } } return false; }