From f9a0d44eea28ada1adf75e5e63274055fccd65ab Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Thu, 9 Nov 2017 02:33:40 +0000 Subject: [PATCH] [Coverage] Emit deferred regions in headers There are some limitations with emitting regions in macro expansions because we don't gather file IDs within the expansions. Fix the check that prevents us from emitting deferred regions in expansions to make an exception for headers, which is something we can handle. rdar://35373009 llvm-svn: 317760 --- clang/lib/CodeGen/CoverageMappingGen.cpp | 8 +++++--- clang/test/CoverageMapping/Inputs/deferred-region-helper.h | 5 +++++ clang/test/CoverageMapping/deferred-region.cpp | 13 ++++++++++++- 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 clang/test/CoverageMapping/Inputs/deferred-region-helper.h diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 26236b7..6e0099b 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -496,12 +496,14 @@ struct CounterCoverageMappingBuilder DeferredRegion = None; // If the region ends in an expansion, find the expansion site. - if (SM.getFileID(DeferredEndLoc) != SM.getMainFileID()) { - FileID StartFile = SM.getFileID(DR.getStartLoc()); + FileID StartFile = SM.getFileID(DR.getStartLoc()); + if (SM.getFileID(DeferredEndLoc) != StartFile) { if (isNestedIn(DeferredEndLoc, StartFile)) { do { DeferredEndLoc = getIncludeOrExpansionLoc(DeferredEndLoc); } while (StartFile != SM.getFileID(DeferredEndLoc)); + } else { + return Index; } } @@ -591,7 +593,7 @@ struct CounterCoverageMappingBuilder if (!DeferredRegion.hasValue() && // File IDs aren't gathered within macro expansions, so it isn't // useful to try and create a deferred region inside of one. - (SM.getFileID(EndLoc) == SM.getMainFileID())) + !EndLoc.isMacroID()) DeferredRegion = SourceMappingRegion(Counter::getZero(), EndLoc, None); } diff --git a/clang/test/CoverageMapping/Inputs/deferred-region-helper.h b/clang/test/CoverageMapping/Inputs/deferred-region-helper.h new file mode 100644 index 0000000..c3e5c16 --- /dev/null +++ b/clang/test/CoverageMapping/Inputs/deferred-region-helper.h @@ -0,0 +1,5 @@ +void included_func() { + if (false) + return; + return; +} diff --git a/clang/test/CoverageMapping/deferred-region.cpp b/clang/test/CoverageMapping/deferred-region.cpp index 3504588..5a104f7 100644 --- a/clang/test/CoverageMapping/deferred-region.cpp +++ b/clang/test/CoverageMapping/deferred-region.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++11 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -fexceptions -fcxx-exceptions -emit-llvm-only -triple %itanium_abi_triple -main-file-name deferred-region.cpp %s | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -fexceptions -fcxx-exceptions -emit-llvm-only -triple %itanium_abi_triple -main-file-name deferred-region.cpp -I %S/Inputs %s | FileCheck %s #define IF if #define STMT(S) S @@ -170,6 +170,16 @@ out: return; // CHECK: Gap,File 0, [[@LINE]]:8 -> [[@LINE+1]]:2 = 0 } +#include "deferred-region-helper.h" +// CHECK-LABEL: _Z13included_funcv: +// CHECK: Gap,File 0, 2:13 -> 3:5 = #1 +// CHECK: Gap,File 0, 3:11 -> 4:3 = (#0 - #1) + +// CHECK-LABEL: _Z7includev: +void include() { + included_func(); +} + int main() { foo(0); foo(1); @@ -189,5 +199,6 @@ int main() { for_loop(); while_loop(); gotos(); + include(); return 0; } -- 2.7.4