r239803 - InstrProf: Fix coverage mapping when "if" is a macro

Justin Bogner mail at justinbogner.com
Mon Jun 15 23:24:18 PDT 2015


Author: bogner
Date: Tue Jun 16 01:24:15 2015
New Revision: 239803

URL: http://llvm.org/viewvc/llvm-project?rev=239803&view=rev
Log:
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.

Added:
    cfe/trunk/test/CoverageMapping/control-flow-macro.c
Modified:
    cfe/trunk/lib/CodeGen/CoverageMappingGen.cpp

Modified: cfe/trunk/lib/CodeGen/CoverageMappingGen.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CoverageMappingGen.cpp?rev=239803&r1=239802&r2=239803&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CoverageMappingGen.cpp (original)
+++ cfe/trunk/lib/CodeGen/CoverageMappingGen.cpp Tue Jun 16 01:24:15 2015
@@ -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);

Added: cfe/trunk/test/CoverageMapping/control-flow-macro.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CoverageMapping/control-flow-macro.c?rev=239803&view=auto
==============================================================================
--- cfe/trunk/test/CoverageMapping/control-flow-macro.c (added)
+++ cfe/trunk/test/CoverageMapping/control-flow-macro.c Tue Jun 16 01:24:15 2015
@@ -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;
+}





More information about the cfe-commits mailing list