From 02507c435ca6957468cbaac76e8135494a0266c0 Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Tue, 28 Jun 2016 00:18:57 +0000 Subject: [llvm-cov] Add an -output-dir option for the show sub-command Passing -output-dir path/to/dir to llvm-cov show creates path/to/dir if it doesn't already exist, and prints reports into that directory. In function view mode, all views are written into path/to/dir/functions.$EXTENSION. In file view mode, all views are written into path/to/dir/coverage/$PATH.$EXTENSION. llvm-svn: 273971 --- llvm/tools/llvm-cov/CodeCoverage.cpp | 39 +++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) (limited to 'llvm/tools/llvm-cov/CodeCoverage.cpp') diff --git a/llvm/tools/llvm-cov/CodeCoverage.cpp b/llvm/tools/llvm-cov/CodeCoverage.cpp index 04901a27179..e7a4f676bcd 100644 --- a/llvm/tools/llvm-cov/CodeCoverage.cpp +++ b/llvm/tools/llvm-cov/CodeCoverage.cpp @@ -406,6 +406,12 @@ int CodeCoverageTool::show(int argc, const char **argv, clEnumValEnd), cl::init(CoverageViewOptions::OutputFormat::Text)); + cl::opt ShowOutputDirectory( + "output-dir", cl::init(""), + cl::desc("Directory in which coverage information is written out")); + cl::alias ShowOutputDirectoryA("o", cl::desc("Alias for --output-dir"), + cl::aliasopt(ShowOutputDirectory)); + auto Err = commandLineParser(argc, argv); if (Err) return Err; @@ -418,6 +424,14 @@ int CodeCoverageTool::show(int argc, const char **argv, ViewOpts.ShowExpandedRegions = ShowExpansions; ViewOpts.ShowFunctionInstantiations = ShowInstantiations; ViewOpts.ShowFormat = ShowFormat; + ViewOpts.ShowOutputDirectory = ShowOutputDirectory; + + if (ViewOpts.ShowOutputDirectory != "") { + if (auto E = sys::fs::create_directories(ViewOpts.ShowOutputDirectory)) { + error("Could not create output directory!", E.message()); + return 1; + } + } auto Coverage = load(); if (!Coverage) @@ -436,8 +450,17 @@ int CodeCoverageTool::show(int argc, const char **argv, << "\n"; continue; } - mainView->print(outs(), /*WholeFile=*/false, /*ShowSourceName=*/true); - outs() << "\n"; + + auto OSOrErr = + mainView->createOutputFile("functions", /*InToplevel=*/true); + if (Error E = OSOrErr.takeError()) { + handleAllErrors(OSOrErr.takeError(), + [&](const ErrorInfoBase &EI) { error(EI.message()); }); + return 1; + } + std::unique_ptr OS = std::move(OSOrErr.get()); + mainView->print(*OS.get(), /*WholeFile=*/false, /*ShowSourceName=*/true); + mainView->closeOutputFile(std::move(OS)); } return 0; } @@ -459,10 +482,16 @@ int CodeCoverageTool::show(int argc, const char **argv, continue; } - mainView->print(outs(), /*Wholefile=*/true, + auto OSOrErr = mainView->createOutputFile(SourceFile, /*InToplevel=*/false); + if (Error E = OSOrErr.takeError()) { + handleAllErrors(OSOrErr.takeError(), + [&](const ErrorInfoBase &EI) { error(EI.message()); }); + return 1; + } + std::unique_ptr OS = std::move(OSOrErr.get()); + mainView->print(*OS.get(), /*Wholefile=*/true, /*ShowSourceName=*/ShowFilenames); - if (SourceFiles.size() > 1) - outs() << "\n"; + mainView->closeOutputFile(std::move(OS)); } return 0; -- cgit v1.2.3