summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVedant Kumar <vsk@apple.com>2017-11-09 02:33:40 +0000
committerVedant Kumar <vsk@apple.com>2017-11-09 02:33:40 +0000
commitf9a0d44eea28ada1adf75e5e63274055fccd65ab (patch)
treec6b6444c5496a74345c70f3f8e373b493540687d
parent8046d22a36eeed2bf38d17006daf486acf520f7e (diff)
downloadbcm5719-llvm-f9a0d44eea28ada1adf75e5e63274055fccd65ab.tar.gz
bcm5719-llvm-f9a0d44eea28ada1adf75e5e63274055fccd65ab.zip
[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
-rw-r--r--clang/lib/CodeGen/CoverageMappingGen.cpp8
-rw-r--r--clang/test/CoverageMapping/Inputs/deferred-region-helper.h5
-rw-r--r--clang/test/CoverageMapping/deferred-region.cpp13
3 files changed, 22 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 26236b72ff7..6e0099bc201 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 00000000000..c3e5c16e32a
--- /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 3504588a6c3..5a104f77897 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;
}
OpenPOWER on IntegriCloud