From 0acf3434e7e9f1b1ab828ad8e2d1fcf3c537e6b1 Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Fri, 22 Sep 2017 18:23:04 +0000 Subject: [PATCH] [Coverage] Add an option to emit limited coverage info Add an option to emit limited coverage info for unused decls. It's just a cl::opt for now to allow us to experiment quickly. When building llc, this results in an 84% size reduction in the llvm_covmap section, and a similar size reduction in the llvm_prf_names section. In practice I expect the size reduction to be roughly quadratic with the size of the program. The downside is that coverage for headers will no longer be complete. This will make the line/function/region coverage metrics incorrect, since they will be artificially high. One mitigation would be to somehow disable those metrics when using limited-coverage=true. This is related to: llvm.org/PR34533 (make SourceBasedCodeCoverage scale) Differential Revision: https://reviews.llvm.org/D38107 llvm-svn: 314002 --- clang/lib/CodeGen/CodeGenModule.cpp | 8 ++++++++ clang/test/CoverageMapping/header.cpp | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 4360700..4903d40 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -61,6 +61,11 @@ using namespace clang; using namespace CodeGen; +static llvm::cl::opt LimitedCoverage( + "limited-coverage-experimental", llvm::cl::ZeroOrMore, + llvm::cl::desc("Emit limited coverage mapping information (experimental)"), + llvm::cl::init(false)); + static const char AnnotationSection[] = "llvm.metadata"; static CGCXXABI *createCXXABI(CodeGenModule &CGM) { @@ -4231,6 +4236,9 @@ void CodeGenModule::AddDeferredUnusedCoverageMapping(Decl *D) { case Decl::CXXDestructor: { if (!cast(D)->doesThisDeclarationHaveABody()) return; + SourceManager &SM = getContext().getSourceManager(); + if (LimitedCoverage && SM.getMainFileID() != SM.getFileID(D->getLocStart())) + return; auto I = DeferredEmptyCoverageMappingDecls.find(D); if (I == DeferredEmptyCoverageMappingDecls.end()) DeferredEmptyCoverageMappingDecls[D] = true; diff --git a/clang/test/CoverageMapping/header.cpp b/clang/test/CoverageMapping/header.cpp index 5e0b311..d42c154 100644 --- a/clang/test/CoverageMapping/header.cpp +++ b/clang/test/CoverageMapping/header.cpp @@ -2,6 +2,9 @@ // RUN: FileCheck -input-file %tmapping %s --check-prefix=CHECK-FUNC // RUN: FileCheck -input-file %tmapping %s --check-prefix=CHECK-STATIC-FUNC // RUN: FileCheck -input-file %tmapping %s --check-prefix=CHECK-STATIC-FUNC2 +// +// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -mllvm -limited-coverage-experimental=true -dump-coverage-mapping -emit-llvm-only -main-file-name header.cpp %s > %tmapping.limited +// RUN: FileCheck -input-file %tmapping.limited %s --check-prefix=CHECK-LIMITED #include "Inputs/header1.h" @@ -22,3 +25,5 @@ int main() { // CHECK-STATIC-FUNC2: static_func2 // CHECK-STATIC-FUNC2: File 0, 21:33 -> 29:2 = 0 + +// CHECK-LIMITED-NOT: static_func2 -- 2.7.4