]> granicus.if.org Git - clang/commitdiff
InstrProf: Fix coverage mapping when "if" is a macro
authorJustin Bogner <mail@justinbogner.com>
Tue, 16 Jun 2015 06:24:15 +0000 (06:24 +0000)
committerJustin Bogner <mail@justinbogner.com>
Tue, 16 Jun 2015 06:24:15 +0000 (06:24 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239803 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CoverageMappingGen.cpp
test/CoverageMapping/control-flow-macro.c [new file with mode: 0644]

index 024a45dba2b73c14d765c47224804338c61d75f2..9ad5d14edfdcc607a7af10a33f894ff7602e6c55 100644 (file)
@@ -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/test/CoverageMapping/control-flow-macro.c b/test/CoverageMapping/control-flow-macro.c
new file mode 100644 (file)
index 0000000..149cb55
--- /dev/null
@@ -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;
+}