From efd319a2ad262e1ad3b4aa9c2f19ad36246ac0d5 Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Tue, 26 Jul 2016 00:24:59 +0000 Subject: [PATCH] [Coverage] Do not write out coverage mappings with zero entries After r275121, we stopped mapping regions from system headers. Lambdas declared in regions belonging to system headers started producing empty coverage mappings, since the files corresponding to their spelling locs were being ignored. The coverage reader doesn't know what to do with these empty mappings. This commit makes sure that we don't produce them and adds a test. I'll make the reader stricter in a follow-up commit. llvm-svn: 276716 --- clang/lib/CodeGen/CoverageMappingGen.cpp | 11 +++++++++++ .../{system_macro.c => system_macro.cpp} | 9 ++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) rename clang/test/CoverageMapping/{system_macro.c => system_macro.cpp} (50%) diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 4debc7e95065..da6fa2a37a3a 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -352,6 +352,9 @@ struct EmptyCoverageMappingBuilder : public CoverageMappingBuilder { gatherFileIDs(FileIDMapping); emitSourceRegions(); + if (MappingRegions.empty()) + return; + CoverageMappingWriter Writer(FileIDMapping, None, MappingRegions); Writer.write(OS); } @@ -605,6 +608,9 @@ struct CounterCoverageMappingBuilder emitExpansionRegions(); gatherSkippedRegions(); + if (MappingRegions.empty()) + return; + CoverageMappingWriter Writer(VirtualFileMapping, Builder.getExpressions(), MappingRegions); Writer.write(OS); @@ -621,6 +627,11 @@ struct CounterCoverageMappingBuilder void VisitDecl(const Decl *D) { Stmt *Body = D->getBody(); + + // Do not propagate region counts into system headers. + if (Body && SM.isInSystemHeader(SM.getSpellingLoc(getStart(Body)))) + return; + propagateCounts(getRegionCounter(Body), Body); } diff --git a/clang/test/CoverageMapping/system_macro.c b/clang/test/CoverageMapping/system_macro.cpp similarity index 50% rename from clang/test/CoverageMapping/system_macro.c rename to clang/test/CoverageMapping/system_macro.cpp index bddc822b0d90..ce0da17ce06c 100644 --- a/clang/test/CoverageMapping/system_macro.c +++ b/clang/test/CoverageMapping/system_macro.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name system_macro.c -o - %s | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name system_macro.cpp -o - %s | FileCheck %s #ifdef IS_SYSHEADER @@ -11,13 +11,16 @@ #define IS_SYSHEADER #include __FILE__ -// CHECK-LABEL: doSomething: +// CHECK-LABEL: doSomething void doSomething(int x) { // CHECK: File 0, [[@LINE]]:25 -> {{[0-9:]+}} = #0 Func(x); return; SomeType *f; // CHECK: File 0, [[@LINE]]:11 -> {{[0-9:]+}} = 0 } -int main() {} +// CHECK-LABEL: main +int main() { // CHECK: File 0, [[@LINE]]:12 -> [[@LINE+2]]:2 = #0 + Func([] { return true; }()); +} #endif