Esempio n. 1
0
void CodeCoverageTool::createExpansionSubView(
    const MappingRegion &ExpandedRegion,
    const FunctionCoverageMapping &Function, SourceCoverageView &Parent) {
  auto ExpandedLines = findExpandedFileInterestingLineRange(
      ExpandedRegion.ExpandedFileID, Function);
  if (ViewOpts.Debug)
    llvm::outs() << "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(), ExpandedLines.first,
      ExpandedLines.second, ExpandedRegion);
  SourceCoverageDataManager RegionManager;
  for (const auto &Region : Function.MappingRegions) {
    if (Region.FileID == ExpandedRegion.ExpandedFileID)
      RegionManager.insert(Region);
  }
  SubView->load(RegionManager);
  createExpansionSubViews(*SubView, ExpandedRegion.ExpandedFileID, Function);
  Parent.addChild(std::move(SubView));
}
Esempio n. 2
0
bool CodeCoverageTool::createSourceFileView(
    StringRef SourceFile, SourceCoverageView &View,
    ArrayRef<FunctionCoverageMapping> FunctionMappingRecords,
    bool UseOnlyRegionsInMainFile) {
  SourceCoverageDataManager RegionManager;
  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 &Region : Function.MappingRegions) {
      if (InterestingFileIDs.count(Region.FileID))
        RegionManager.insert(Region);
    }
    InstantiationSetCollector.insert(Function, MainFileID);
    createExpansionSubViews(View, MainFileID, Function);
  }
  if (RegionManager.getSourceRegions().empty())
    return true;
  View.load(RegionManager);
  // Show instantiations
  if (!ViewOpts.ShowFunctionInstantiations)
    return false;
  for (const auto &InstantiationSet : InstantiationSetCollector) {
    if (InstantiationSet.second.size() < 2)
      continue;
    auto InterestingRange = findExpandedFileInterestingLineRange(
        InstantiationSet.second.front()->MappingRegions.front().FileID,
        *InstantiationSet.second.front());
    for (auto Function : InstantiationSet.second) {
      auto SubView = llvm::make_unique<SourceCoverageView>(
          View, InterestingRange.first, InterestingRange.second,
          Function->PrettyName);
      createInstantiationSubView(SourceFile, *Function, *SubView);
      View.addChild(std::move(SubView));
    }
  }
  return false;
}