From: Justin Bogner Date: Fri, 19 Sep 2014 19:07:17 +0000 (+0000) Subject: llvm-cov: Return unique_ptrs instead of filling objects (NFC) X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=297149bafc50ba63347d4e96b616af9fc170cf04;p=oota-llvm.git llvm-cov: Return unique_ptrs instead of filling objects (NFC) Having create* functions return the object they create is more readable than using an in-out parameter. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218139 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/llvm-cov/CodeCoverage.cpp b/tools/llvm-cov/CodeCoverage.cpp index de03fc29a9f..ba19e0bc9a9 100644 --- a/tools/llvm-cov/CodeCoverage.cpp +++ b/tools/llvm-cov/CodeCoverage.cpp @@ -103,23 +103,22 @@ public: /// \brief Create a source view which shows coverage for an expansion /// of a file. - void createExpansionSubView(const CountedRegion &ExpandedRegion, - const FunctionCoverageMapping &Function, - SourceCoverageView &Parent); + std::unique_ptr + createExpansionSubView(const CountedRegion &ExpandedRegion, + const FunctionCoverageMapping &Function); - void createExpansionSubViews(SourceCoverageView &View, unsigned ViewFileID, + void attachExpansionSubViews(SourceCoverageView &View, unsigned ViewFileID, const FunctionCoverageMapping &Function); /// \brief Create a source view which shows coverage for an instantiation /// of a funciton. - void createInstantiationSubView(StringRef SourceFile, - const FunctionCoverageMapping &Function, - SourceCoverageView &View); + std::unique_ptr + createInstantiationSubView(StringRef SourceFile, + const FunctionCoverageMapping &Function); /// \brief Create the main source view of a particular source file. - /// Return true if this particular source file is not covered. - bool - createSourceFileView(StringRef SourceFile, SourceCoverageView &View, + std::unique_ptr + createSourceFileView(StringRef SourceFile, ArrayRef FunctionMappingRecords, bool UseOnlyRegionsInMainFile = false); @@ -244,26 +243,26 @@ CodeCoverageTool::findMainViewFileID(const FunctionCoverageMapping &Function, return true; } -void CodeCoverageTool::createExpansionSubView( +std::unique_ptr CodeCoverageTool::createExpansionSubView( const CountedRegion &ExpandedRegion, - const FunctionCoverageMapping &Function, SourceCoverageView &Parent) { + const FunctionCoverageMapping &Function) { auto SourceBuffer = getSourceFile(Function.Filenames[ExpandedRegion.ExpandedFileID]); if (!SourceBuffer) - return; - auto SubView = llvm::make_unique(SourceBuffer.get(), - Parent.getOptions()); + return nullptr; auto RegionManager = llvm::make_unique(); for (const auto &CR : Function.CountedRegions) { if (CR.FileID == ExpandedRegion.ExpandedFileID) RegionManager->insert(CR); } + auto SubView = llvm::make_unique(SourceBuffer.get(), + ViewOpts); SubView->load(std::move(RegionManager)); - createExpansionSubViews(*SubView, ExpandedRegion.ExpandedFileID, Function); - Parent.addExpansion(ExpandedRegion, std::move(SubView)); + attachExpansionSubViews(*SubView, ExpandedRegion.ExpandedFileID, Function); + return SubView; } -void CodeCoverageTool::createExpansionSubViews( +void CodeCoverageTool::attachExpansionSubViews( SourceCoverageView &View, unsigned ViewFileID, const FunctionCoverageMapping &Function) { if (!ViewOpts.ShowExpandedRegions) @@ -273,36 +272,50 @@ void CodeCoverageTool::createExpansionSubViews( continue; if (CR.FileID != ViewFileID) continue; - createExpansionSubView(CR, Function, View); + auto SubView = createExpansionSubView(CR, Function); + if (SubView) + View.addExpansion(CR, std::move(SubView)); } } -void CodeCoverageTool::createInstantiationSubView( - StringRef SourceFile, const FunctionCoverageMapping &Function, - SourceCoverageView &View) { +std::unique_ptr +CodeCoverageTool::createInstantiationSubView( + StringRef SourceFile, const FunctionCoverageMapping &Function) { auto RegionManager = llvm::make_unique(); SmallSet InterestingFileIDs; if (!gatherInterestingFileIDs(SourceFile, Function, InterestingFileIDs)) - return; + return nullptr; // Get the interesting regions for (const auto &CR : Function.CountedRegions) { if (InterestingFileIDs.count(CR.FileID)) RegionManager->insert(CR); } - View.load(std::move(RegionManager)); + + auto SourceBuffer = getSourceFile(SourceFile); + if (!SourceBuffer) + return nullptr; + auto SubView = llvm::make_unique(SourceBuffer.get(), + ViewOpts); + SubView->load(std::move(RegionManager)); unsigned MainFileID; - if (findMainViewFileID(SourceFile, Function, MainFileID)) - return; - createExpansionSubViews(View, MainFileID, Function); + if (!findMainViewFileID(SourceFile, Function, MainFileID)) + attachExpansionSubViews(*SubView, MainFileID, Function); + return SubView; } -bool CodeCoverageTool::createSourceFileView( - StringRef SourceFile, SourceCoverageView &View, +std::unique_ptr CodeCoverageTool::createSourceFileView( + StringRef SourceFile, ArrayRef FunctionMappingRecords, bool UseOnlyRegionsInMainFile) { auto RegionManager = llvm::make_unique(); FunctionInstantiationSetCollector InstantiationSetCollector; + auto SourceBuffer = getSourceFile(SourceFile); + if (!SourceBuffer) + return nullptr; + auto View = + llvm::make_unique(SourceBuffer.get(), ViewOpts); + for (const auto &Function : FunctionMappingRecords) { unsigned MainFileID; if (findMainViewFileID(SourceFile, Function, MainFileID)) @@ -319,14 +332,14 @@ bool CodeCoverageTool::createSourceFileView( RegionManager->insert(CR); } InstantiationSetCollector.insert(Function, MainFileID); - createExpansionSubViews(View, MainFileID, Function); + attachExpansionSubViews(*View, MainFileID, Function); } if (RegionManager->getCoverageSegments().empty()) - return true; - View.load(std::move(RegionManager)); + return nullptr; + View->load(std::move(RegionManager)); // Show instantiations if (!ViewOpts.ShowFunctionInstantiations) - return false; + return View; for (const auto &InstantiationSet : InstantiationSetCollector) { if (InstantiationSet.second.size() < 2) continue; @@ -336,16 +349,12 @@ bool CodeCoverageTool::createSourceFileView( 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(SourceBuffer.get(), - View.getOptions()); - createInstantiationSubView(SourceFile, *Function, *SubView); - View.addInstantiation(Function->Name, Line, std::move(SubView)); + auto SubView = createInstantiationSubView(SourceFile, *Function); + if (SubView) + View->addInstantiation(Function->Name, Line, std::move(SubView)); } } - return false; + return View; } bool CodeCoverageTool::load() { @@ -609,15 +618,18 @@ int CodeCoverageTool::show(int argc, const char **argv, if (findMainViewFileID(Function, MainFileID)) continue; StringRef SourceFile = Function.Filenames[MainFileID]; - auto SourceBuffer = getSourceFile(SourceFile); - if (!SourceBuffer) - return 1; - SourceCoverageView mainView(SourceBuffer.get(), ViewOpts); - createSourceFileView(SourceFile, mainView, Function, true); + auto mainView = createSourceFileView(SourceFile, Function, true); + if (!mainView) { + ViewOpts.colored_ostream(outs(), raw_ostream::RED) + << "warning: Could not read coverage for '" << Function.Name + << " from " << SourceFile; + outs() << "\n"; + continue; + } ViewOpts.colored_ostream(outs(), raw_ostream::CYAN) << Function.Name << " from " << SourceFile << ":"; outs() << "\n"; - mainView.render(outs(), /*WholeFile=*/false); + mainView->render(outs(), /*WholeFile=*/false); if (FunctionMappingRecords.size() > 1) outs() << "\n"; } @@ -633,11 +645,8 @@ int CodeCoverageTool::show(int argc, const char **argv, SourceFiles.push_back(Filename); for (const auto &SourceFile : SourceFiles) { - auto SourceBuffer = getSourceFile(SourceFile); - if (!SourceBuffer) - return 1; - SourceCoverageView mainView(SourceBuffer.get(), ViewOpts); - if (createSourceFileView(SourceFile, mainView, FunctionMappingRecords)) { + auto mainView = createSourceFileView(SourceFile, FunctionMappingRecords); + if (!mainView) { ViewOpts.colored_ostream(outs(), raw_ostream::RED) << "warning: The file '" << SourceFile << "' isn't covered."; outs() << "\n"; @@ -648,7 +657,7 @@ int CodeCoverageTool::show(int argc, const char **argv, ViewOpts.colored_ostream(outs(), raw_ostream::CYAN) << SourceFile << ":"; outs() << "\n"; } - mainView.render(outs(), /*Wholefile=*/true); + mainView->render(outs(), /*Wholefile=*/true); if (SourceFiles.size() > 1) outs() << "\n"; }