]> granicus.if.org Git - clang/commitdiff
[Coverage] Emit deferred regions in headers
authorVedant Kumar <vsk@apple.com>
Thu, 9 Nov 2017 02:33:40 +0000 (02:33 +0000)
committerVedant Kumar <vsk@apple.com>
Thu, 9 Nov 2017 02:33:40 +0000 (02:33 +0000)
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

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

lib/CodeGen/CoverageMappingGen.cpp
test/CoverageMapping/Inputs/deferred-region-helper.h [new file with mode: 0644]
test/CoverageMapping/deferred-region.cpp

index 26236b72ff713488cf837ce2692c14a831f1763f..6e0099bc201bd5cfa1e7658856ed483e4006c285 100644 (file)
@@ -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/test/CoverageMapping/Inputs/deferred-region-helper.h b/test/CoverageMapping/Inputs/deferred-region-helper.h
new file mode 100644 (file)
index 0000000..c3e5c16
--- /dev/null
@@ -0,0 +1,5 @@
+void included_func() {
+  if (false)
+    return;
+  return;
+}
index 3504588a6c34078c79991d8ba056f34b2a53a95d..5a104f7789790dc788a546b27026cfbe6f526fc8 100644 (file)
@@ -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;
 }