summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Bogner <mail@justinbogner.com>2015-06-16 06:24:15 +0000
committerJustin Bogner <mail@justinbogner.com>2015-06-16 06:24:15 +0000
commit055ebc348d81bb52d4eb549927457b6a16838a0d (patch)
treee2943886cee6513cc9cfd5da072681879d60d658
parent77f0e9f662c3eef7d742ad9c7f60b31aa9037c96 (diff)
downloadbcm5719-llvm-055ebc348d81bb52d4eb549927457b6a16838a0d.tar.gz
bcm5719-llvm-055ebc348d81bb52d4eb549927457b6a16838a0d.zip
InstrProf: Fix coverage mapping when "if" is a macro
We were propagating the coverage map into the body of an if statement, but not into the condition thereafter. This is fine as long as the two locations are in the same virtual file, but they won't be when the "if" part of the statement is from a macro and the condition is not. llvm-svn: 239803
-rw-r--r--clang/lib/CodeGen/CoverageMappingGen.cpp3
-rw-r--r--clang/test/CoverageMapping/control-flow-macro.c14
2 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 024a45dba2b..9ad5d14edfd 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -806,6 +806,9 @@ struct CounterCoverageMappingBuilder
void VisitIfStmt(const IfStmt *S) {
extendRegion(S);
+ // Extend into the condition before we propagate through it below - this is
+ // needed to handle macros that generate the "if" but not the condition.
+ extendRegion(S->getCond());
Counter ParentCount = getRegion().getCounter();
Counter ThenCount = getRegionCounter(S);
diff --git a/clang/test/CoverageMapping/control-flow-macro.c b/clang/test/CoverageMapping/control-flow-macro.c
new file mode 100644
index 00000000000..149cb5572cb
--- /dev/null
+++ b/clang/test/CoverageMapping/control-flow-macro.c
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -fprofile-instr-generate -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only %s | FileCheck %s
+
+#define ifc if
+
+// CHECK: main
+// CHECK-NEXT: File 0, {{[0-9]+}}:40 -> [[END:[0-9]+]]:2 = #0
+int main(int argc, const char *argv[]) {
+ // CHECK: Expansion,File 0, [[@LINE+1]]:3 -> [[@LINE+1]]:6 = #0
+ ifc(1) return 0;
+ // Expansion,File 0, [[@LINE+2]]:3 -> [[@LINE+2]]:6 = (#0 - #1)
+ // File 0, [[@LINE+1]]:6 -> [[END]]:2 = (#0 - #1)
+ ifc(1) return 0;
+ return 0;
+}
OpenPOWER on IntegriCloud