[PATCH] D53244: [Coverage] Fix PR39258: support coverage regions that start deeper than they end

2018-11-19 Thread Phabricator via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rC347262: [Coverage] Fix PR39258: support coverage regions 
that start deeper than they end (authored by vedantk, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D53244?vs=172042=174668#toc

Repository:
  rC Clang

https://reviews.llvm.org/D53244

Files:
  lib/CodeGen/CoverageMappingGen.cpp
  test/CoverageMapping/macros.c

Index: lib/CodeGen/CoverageMappingGen.cpp
===
--- lib/CodeGen/CoverageMappingGen.cpp
+++ lib/CodeGen/CoverageMappingGen.cpp
@@ -552,6 +552,15 @@
 completeDeferred(Count, DeferredEndLoc);
   }
 
+  size_t locationDepth(SourceLocation Loc) {
+size_t Depth = 0;
+while (Loc.isValid()) {
+  Loc = getIncludeOrExpansionLoc(Loc);
+  Depth++;
+}
+return Depth;
+  }
+
   /// Pop regions from the stack into the function's list of regions.
   ///
   /// Adds all regions from \c ParentIndex to the top of the stack to the
@@ -566,19 +575,41 @@
 SourceLocation EndLoc = Region.hasEndLoc()
 ? Region.getEndLoc()
 : RegionStack[ParentIndex].getEndLoc();
+size_t StartDepth = locationDepth(StartLoc);
+size_t EndDepth = locationDepth(EndLoc);
 while (!SM.isWrittenInSameFile(StartLoc, EndLoc)) {
-  // The region ends in a nested file or macro expansion. Create a
-  // separate region for each expansion.
-  SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
-  assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
-
-  if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
-SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
-
-  EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
-  if (EndLoc.isInvalid())
-llvm::report_fatal_error("File exit not handled before popRegions");
+  bool UnnestStart = StartDepth >= EndDepth;
+  bool UnnestEnd = EndDepth >= StartDepth;
+  if (UnnestEnd) {
+// The region ends in a nested file or macro expansion. Create a
+// separate region for each expansion.
+SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
+assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
+
+if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
+  SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
+
+EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
+if (EndLoc.isInvalid())
+  llvm::report_fatal_error("File exit not handled before popRegions");
+EndDepth--;
+  }
+  if (UnnestStart) {
+// The region begins in a nested file or macro expansion. Create a
+// separate region for each expansion.
+SourceLocation NestedLoc = getEndOfFileOrMacro(StartLoc);
+assert(SM.isWrittenInSameFile(StartLoc, NestedLoc));
+
+if (!isRegionAlreadyAdded(StartLoc, NestedLoc))
+  SourceRegions.emplace_back(Region.getCounter(), StartLoc, NestedLoc);
+
+StartLoc = getIncludeOrExpansionLoc(StartLoc);
+if (StartLoc.isInvalid())
+  llvm::report_fatal_error("File exit not handled before popRegions");
+StartDepth--;
+  }
 }
+Region.setStartLoc(StartLoc);
 Region.setEndLoc(EndLoc);
 
 MostRecentLocation = EndLoc;
Index: test/CoverageMapping/macros.c
===
--- test/CoverageMapping/macros.c
+++ test/CoverageMapping/macros.c
@@ -4,6 +4,7 @@
 #define MACRO_2 bar()
 #define MACRO_1 return; MACRO_2
 #define MACRO_3 MACRO_2
+#define GOTO goto
 
 void bar() {}
 
@@ -56,6 +57,15 @@
 // CHECK-NEXT: Expansion,File 1, 6:17 -> 6:24 = #1
 // CHECK-NEXT: File 2, 4:17 -> 4:22 = #1
 
+// CHECK-NEXT: func6
+void func6(unsigned count) { // CHECK-NEXT: File 0, [[@LINE]]:28 -> [[@LINE+4]]:2 = #0
+begin:   // CHECK-NEXT: File 0, [[@LINE]]:1 -> [[@LINE+3]]:2 = #1
+if (count--) // CHECK-NEXT: File 0, [[@LINE]]:9 -> [[@LINE]]:16 = #1
+GOTO begin;  // CHECK-NEXT: File 0, [[@LINE]]:9 -> [[@LINE]]:19 = #2
+}
+// CHECK-NEXT: Expansion,File 0, [[@LINE-2]]:9 -> [[@LINE-2]]:13 = #2
+// CHECK-NEXT: File 1, 7:14 -> 7:18 = #2
+
 int main(int argc, const char *argv[]) {
   func();
   func2();
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D53244: [Coverage] Fix PR39258: support coverage regions that start deeper than they end

2018-11-19 Thread Orivej Desh via Phabricator via cfe-commits
orivej added a comment.

@vsk, I think this is ready, but I don't have the merge rights. Could you 
commit it and https://reviews.llvm.org/D53231 for me?


Repository:
  rC Clang

https://reviews.llvm.org/D53244



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D53244: [Coverage] Fix PR39258: support coverage regions that start deeper than they end

2018-11-18 Thread Vedant Kumar via Phabricator via cfe-commits
vsk added a comment.

Friendly ping -- @orivej were you still looking for more feedback? If not, do 
you still need someone to land this patch on your behalf?


Repository:
  rC Clang

https://reviews.llvm.org/D53244



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D53244: [Coverage] Fix PR39258: support coverage regions that start deeper than they end

2018-10-31 Thread Orivej Desh via Phabricator via cfe-commits
orivej updated this revision to Diff 172042.
orivej added a comment.

Remove unrelated change.


Repository:
  rC Clang

https://reviews.llvm.org/D53244

Files:
  lib/CodeGen/CoverageMappingGen.cpp
  test/CoverageMapping/macros.c

Index: test/CoverageMapping/macros.c
===
--- test/CoverageMapping/macros.c
+++ test/CoverageMapping/macros.c
@@ -4,6 +4,7 @@
 #define MACRO_2 bar()
 #define MACRO_1 return; MACRO_2
 #define MACRO_3 MACRO_2
+#define GOTO goto
 
 void bar() {}
 
@@ -56,6 +57,15 @@
 // CHECK-NEXT: Expansion,File 1, 6:17 -> 6:24 = #1
 // CHECK-NEXT: File 2, 4:17 -> 4:22 = #1
 
+// CHECK-NEXT: func6
+void func6(unsigned count) { // CHECK-NEXT: File 0, [[@LINE]]:28 -> [[@LINE+4]]:2 = #0
+begin:   // CHECK-NEXT: File 0, [[@LINE]]:1 -> [[@LINE+3]]:2 = #1
+if (count--) // CHECK-NEXT: File 0, [[@LINE]]:9 -> [[@LINE]]:16 = #1
+GOTO begin;  // CHECK-NEXT: File 0, [[@LINE]]:9 -> [[@LINE]]:19 = #2
+}
+// CHECK-NEXT: Expansion,File 0, [[@LINE-2]]:9 -> [[@LINE-2]]:13 = #2
+// CHECK-NEXT: File 1, 7:14 -> 7:18 = #2
+
 int main(int argc, const char *argv[]) {
   func();
   func2();
Index: lib/CodeGen/CoverageMappingGen.cpp
===
--- lib/CodeGen/CoverageMappingGen.cpp
+++ lib/CodeGen/CoverageMappingGen.cpp
@@ -552,6 +552,15 @@
 completeDeferred(Count, DeferredEndLoc);
   }
 
+  size_t locationDepth(SourceLocation Loc) {
+size_t Depth = 0;
+while (Loc.isValid()) {
+  Loc = getIncludeOrExpansionLoc(Loc);
+  Depth++;
+}
+return Depth;
+  }
+
   /// Pop regions from the stack into the function's list of regions.
   ///
   /// Adds all regions from \c ParentIndex to the top of the stack to the
@@ -566,19 +575,41 @@
 SourceLocation EndLoc = Region.hasEndLoc()
 ? Region.getEndLoc()
 : RegionStack[ParentIndex].getEndLoc();
+size_t StartDepth = locationDepth(StartLoc);
+size_t EndDepth = locationDepth(EndLoc);
 while (!SM.isWrittenInSameFile(StartLoc, EndLoc)) {
-  // The region ends in a nested file or macro expansion. Create a
-  // separate region for each expansion.
-  SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
-  assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
-
-  if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
-SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
-
-  EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
-  if (EndLoc.isInvalid())
-llvm::report_fatal_error("File exit not handled before popRegions");
+  bool UnnestStart = StartDepth >= EndDepth;
+  bool UnnestEnd = EndDepth >= StartDepth;
+  if (UnnestEnd) {
+// The region ends in a nested file or macro expansion. Create a
+// separate region for each expansion.
+SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
+assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
+
+if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
+  SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
+
+EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
+if (EndLoc.isInvalid())
+  llvm::report_fatal_error("File exit not handled before popRegions");
+EndDepth--;
+  }
+  if (UnnestStart) {
+// The region begins in a nested file or macro expansion. Create a
+// separate region for each expansion.
+SourceLocation NestedLoc = getEndOfFileOrMacro(StartLoc);
+assert(SM.isWrittenInSameFile(StartLoc, NestedLoc));
+
+if (!isRegionAlreadyAdded(StartLoc, NestedLoc))
+  SourceRegions.emplace_back(Region.getCounter(), StartLoc, NestedLoc);
+
+StartLoc = getIncludeOrExpansionLoc(StartLoc);
+if (StartLoc.isInvalid())
+  llvm::report_fatal_error("File exit not handled before popRegions");
+StartDepth--;
+  }
 }
+Region.setStartLoc(StartLoc);
 Region.setEndLoc(EndLoc);
 
 MostRecentLocation = EndLoc;
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D53244: [Coverage] Fix PR39258: support coverage regions that start deeper than they end

2018-10-31 Thread Orivej Desh via Phabricator via cfe-commits
orivej updated this revision to Diff 172041.
orivej added a comment.
Herald added a subscriber: mgorny.

Use relative line offset.


Repository:
  rC Clang

https://reviews.llvm.org/D53244

Files:
  lib/CodeGen/CoverageMappingGen.cpp
  test/CoverageMapping/macros.c
  tools/CMakeLists.txt

Index: tools/CMakeLists.txt
===
--- tools/CMakeLists.txt
+++ tools/CMakeLists.txt
@@ -35,3 +35,4 @@
 
 # libclang may require clang-tidy in clang-tools-extra.
 add_clang_subdirectory(libclang)
+add_clang_subdirectory(templight)
Index: test/CoverageMapping/macros.c
===
--- test/CoverageMapping/macros.c
+++ test/CoverageMapping/macros.c
@@ -4,6 +4,7 @@
 #define MACRO_2 bar()
 #define MACRO_1 return; MACRO_2
 #define MACRO_3 MACRO_2
+#define GOTO goto
 
 void bar() {}
 
@@ -56,6 +57,15 @@
 // CHECK-NEXT: Expansion,File 1, 6:17 -> 6:24 = #1
 // CHECK-NEXT: File 2, 4:17 -> 4:22 = #1
 
+// CHECK-NEXT: func6
+void func6(unsigned count) { // CHECK-NEXT: File 0, [[@LINE]]:28 -> [[@LINE+4]]:2 = #0
+begin:   // CHECK-NEXT: File 0, [[@LINE]]:1 -> [[@LINE+3]]:2 = #1
+if (count--) // CHECK-NEXT: File 0, [[@LINE]]:9 -> [[@LINE]]:16 = #1
+GOTO begin;  // CHECK-NEXT: File 0, [[@LINE]]:9 -> [[@LINE]]:19 = #2
+}
+// CHECK-NEXT: Expansion,File 0, [[@LINE-2]]:9 -> [[@LINE-2]]:13 = #2
+// CHECK-NEXT: File 1, 7:14 -> 7:18 = #2
+
 int main(int argc, const char *argv[]) {
   func();
   func2();
Index: lib/CodeGen/CoverageMappingGen.cpp
===
--- lib/CodeGen/CoverageMappingGen.cpp
+++ lib/CodeGen/CoverageMappingGen.cpp
@@ -552,6 +552,15 @@
 completeDeferred(Count, DeferredEndLoc);
   }
 
+  size_t locationDepth(SourceLocation Loc) {
+size_t Depth = 0;
+while (Loc.isValid()) {
+  Loc = getIncludeOrExpansionLoc(Loc);
+  Depth++;
+}
+return Depth;
+  }
+
   /// Pop regions from the stack into the function's list of regions.
   ///
   /// Adds all regions from \c ParentIndex to the top of the stack to the
@@ -566,19 +575,41 @@
 SourceLocation EndLoc = Region.hasEndLoc()
 ? Region.getEndLoc()
 : RegionStack[ParentIndex].getEndLoc();
+size_t StartDepth = locationDepth(StartLoc);
+size_t EndDepth = locationDepth(EndLoc);
 while (!SM.isWrittenInSameFile(StartLoc, EndLoc)) {
-  // The region ends in a nested file or macro expansion. Create a
-  // separate region for each expansion.
-  SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
-  assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
-
-  if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
-SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
-
-  EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
-  if (EndLoc.isInvalid())
-llvm::report_fatal_error("File exit not handled before popRegions");
+  bool UnnestStart = StartDepth >= EndDepth;
+  bool UnnestEnd = EndDepth >= StartDepth;
+  if (UnnestEnd) {
+// The region ends in a nested file or macro expansion. Create a
+// separate region for each expansion.
+SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
+assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
+
+if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
+  SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
+
+EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
+if (EndLoc.isInvalid())
+  llvm::report_fatal_error("File exit not handled before popRegions");
+EndDepth--;
+  }
+  if (UnnestStart) {
+// The region begins in a nested file or macro expansion. Create a
+// separate region for each expansion.
+SourceLocation NestedLoc = getEndOfFileOrMacro(StartLoc);
+assert(SM.isWrittenInSameFile(StartLoc, NestedLoc));
+
+if (!isRegionAlreadyAdded(StartLoc, NestedLoc))
+  SourceRegions.emplace_back(Region.getCounter(), StartLoc, NestedLoc);
+
+StartLoc = getIncludeOrExpansionLoc(StartLoc);
+if (StartLoc.isInvalid())
+  llvm::report_fatal_error("File exit not handled before popRegions");
+StartDepth--;
+  }
 }
+Region.setStartLoc(StartLoc);
 Region.setEndLoc(EndLoc);
 
 MostRecentLocation = EndLoc;
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D53244: [Coverage] Fix PR39258: support coverage regions that start deeper than they end

2018-10-15 Thread Orivej Desh via Phabricator via cfe-commits
orivej added a comment.

Thanks! Could you merge this (after a while to let others review)?




Comment at: test/CoverageMapping/macros.c:60
 
+// CHECK-NEXT: func6
+void func6(unsigned count) { // CHECK-NEXT: File 0, [[@LINE]]:28 -> 
[[@LINE+4]]:2 = #0

vsk wrote:
> Please use CHECK-LABEL here.
`CHECK-LABEL` would accept unchecked output between the previous `CHECK-NEXT` 
and `func6`. It seems that the intention of this test is to check all lines of 
output, so I used `CHECK-NEXT` as in other tests in this file.


Repository:
  rC Clang

https://reviews.llvm.org/D53244



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D53244: [Coverage] Fix PR39258: support coverage regions that start deeper than they end

2018-10-14 Thread Vedant Kumar via Phabricator via cfe-commits
vsk accepted this revision.
vsk added a comment.
This revision is now accepted and ready to land.

Thanks, LGTM.




Comment at: test/CoverageMapping/macros.c:60
 
+// CHECK-NEXT: func6
+void func6(unsigned count) { // CHECK-NEXT: File 0, [[@LINE]]:28 -> 
[[@LINE+4]]:2 = #0

Please use CHECK-LABEL here.


Repository:
  rC Clang

https://reviews.llvm.org/D53244



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D53244: [Coverage] Fix PR39258: support coverage regions that start deeper than they end

2018-10-13 Thread Orivej Desh via Phabricator via cfe-commits
orivej updated this revision to Diff 169568.
orivej added a comment.

Fix typo


Repository:
  rC Clang

https://reviews.llvm.org/D53244

Files:
  lib/CodeGen/CoverageMappingGen.cpp
  test/CoverageMapping/macros.c

Index: test/CoverageMapping/macros.c
===
--- test/CoverageMapping/macros.c
+++ test/CoverageMapping/macros.c
@@ -4,6 +4,7 @@
 #define MACRO_2 bar()
 #define MACRO_1 return; MACRO_2
 #define MACRO_3 MACRO_2
+#define GOTO goto
 
 void bar() {}
 
@@ -56,6 +57,15 @@
 // CHECK-NEXT: Expansion,File 1, 6:17 -> 6:24 = #1
 // CHECK-NEXT: File 2, 4:17 -> 4:22 = #1
 
+// CHECK-NEXT: func6
+void func6(unsigned count) { // CHECK-NEXT: File 0, [[@LINE]]:28 -> [[@LINE+4]]:2 = #0
+begin:   // CHECK-NEXT: File 0, [[@LINE]]:1 -> [[@LINE+3]]:2 = #1
+if (count--) // CHECK-NEXT: File 0, [[@LINE]]:9 -> [[@LINE]]:16 = #1
+GOTO begin;  // CHECK-NEXT: File 0, [[@LINE]]:9 -> [[@LINE]]:19 = #2
+}
+// CHECK-NEXT: Expansion,File 0, 64:9 -> 64:13 = #2
+// CHECK-NEXT: File 1, 7:14 -> 7:18 = #2
+
 int main(int argc, const char *argv[]) {
   func();
   func2();
Index: lib/CodeGen/CoverageMappingGen.cpp
===
--- lib/CodeGen/CoverageMappingGen.cpp
+++ lib/CodeGen/CoverageMappingGen.cpp
@@ -552,6 +552,15 @@
 completeDeferred(Count, DeferredEndLoc);
   }
 
+  size_t locationDepth(SourceLocation Loc) {
+size_t Depth = 0;
+while (Loc.isValid()) {
+  Loc = getIncludeOrExpansionLoc(Loc);
+  Depth++;
+}
+return Depth;
+  }
+
   /// Pop regions from the stack into the function's list of regions.
   ///
   /// Adds all regions from \c ParentIndex to the top of the stack to the
@@ -566,19 +575,41 @@
 SourceLocation EndLoc = Region.hasEndLoc()
 ? Region.getEndLoc()
 : RegionStack[ParentIndex].getEndLoc();
+size_t StartDepth = locationDepth(StartLoc);
+size_t EndDepth = locationDepth(EndLoc);
 while (!SM.isWrittenInSameFile(StartLoc, EndLoc)) {
-  // The region ends in a nested file or macro expansion. Create a
-  // separate region for each expansion.
-  SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
-  assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
-
-  if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
-SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
-
-  EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
-  if (EndLoc.isInvalid())
-llvm::report_fatal_error("File exit not handled before popRegions");
+  bool UnnestStart = StartDepth >= EndDepth;
+  bool UnnestEnd = EndDepth >= StartDepth;
+  if (UnnestEnd) {
+// The region ends in a nested file or macro expansion. Create a
+// separate region for each expansion.
+SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
+assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
+
+if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
+  SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
+
+EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
+if (EndLoc.isInvalid())
+  llvm::report_fatal_error("File exit not handled before popRegions");
+EndDepth--;
+  }
+  if (UnnestStart) {
+// The region begins in a nested file or macro expansion. Create a
+// separate region for each expansion.
+SourceLocation NestedLoc = getEndOfFileOrMacro(StartLoc);
+assert(SM.isWrittenInSameFile(StartLoc, NestedLoc));
+
+if (!isRegionAlreadyAdded(StartLoc, NestedLoc))
+  SourceRegions.emplace_back(Region.getCounter(), StartLoc, NestedLoc);
+
+StartLoc = getIncludeOrExpansionLoc(StartLoc);
+if (StartLoc.isInvalid())
+  llvm::report_fatal_error("File exit not handled before popRegions");
+StartDepth--;
+  }
 }
+Region.setStartLoc(StartLoc);
 Region.setEndLoc(EndLoc);
 
 MostRecentLocation = EndLoc;
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D53244: [Coverage] Fix PR39258: support coverage regions that start deeper than they end

2018-10-13 Thread Orivej Desh via Phabricator via cfe-commits
orivej updated this revision to Diff 169562.
orivej added a comment.

This looks better to me. (There is no difference in check-clang test results.)


Repository:
  rC Clang

https://reviews.llvm.org/D53244

Files:
  lib/CodeGen/CoverageMappingGen.cpp
  test/CoverageMapping/macros.c

Index: test/CoverageMapping/macros.c
===
--- test/CoverageMapping/macros.c
+++ test/CoverageMapping/macros.c
@@ -4,6 +4,7 @@
 #define MACRO_2 bar()
 #define MACRO_1 return; MACRO_2
 #define MACRO_3 MACRO_2
+#define GOTO goto
 
 void bar() {}
 
@@ -56,6 +57,15 @@
 // CHECK-NEXT: Expansion,File 1, 6:17 -> 6:24 = #1
 // CHECK-NEXT: File 2, 4:17 -> 4:22 = #1
 
+// CHECK-NEXT: func6
+void func6(unsigned count) { // CHECK-NEXT: File 0, [[@LINE]]:28 -> [[@LINE+4]]:2 = #0
+begin:   // CHECK-NEXT: File 0, [[@LINE]]:1 -> [[@LINE+3]]:2 = #1
+if (count--) // CHECK-NEXT: File 0, [[@LINE]]:9 -> [[@LINE]]:16 = #1
+GOTO begin;  // CHECK-NEXT: File 0, [[@LINE]]:9 -> [[@LINE]]:19 = #2
+}
+// CHECK-NEXT: Expansion,File 0, 64:9 -> 64:13 = #2
+// CHECK-NEXT: File 1, 7:14 -> 7:18 = #2
+
 int main(int argc, const char *argv[]) {
   func();
   func2();
Index: lib/CodeGen/CoverageMappingGen.cpp
===
--- lib/CodeGen/CoverageMappingGen.cpp
+++ lib/CodeGen/CoverageMappingGen.cpp
@@ -552,6 +552,15 @@
 completeDeferred(Count, DeferredEndLoc);
   }
 
+  size_t locactionDepth(SourceLocation Loc) {
+size_t Depth = 0;
+while (Loc.isValid()) {
+  Loc = getIncludeOrExpansionLoc(Loc);
+  Depth++;
+}
+return Depth;
+  }
+
   /// Pop regions from the stack into the function's list of regions.
   ///
   /// Adds all regions from \c ParentIndex to the top of the stack to the
@@ -566,19 +575,41 @@
 SourceLocation EndLoc = Region.hasEndLoc()
 ? Region.getEndLoc()
 : RegionStack[ParentIndex].getEndLoc();
+size_t StartDepth = locactionDepth(StartLoc);
+size_t EndDepth = locactionDepth(EndLoc);
 while (!SM.isWrittenInSameFile(StartLoc, EndLoc)) {
-  // The region ends in a nested file or macro expansion. Create a
-  // separate region for each expansion.
-  SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
-  assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
-
-  if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
-SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
-
-  EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
-  if (EndLoc.isInvalid())
-llvm::report_fatal_error("File exit not handled before popRegions");
+  bool UnnestStart = StartDepth >= EndDepth;
+  bool UnnestEnd = EndDepth >= StartDepth;
+  if (UnnestEnd) {
+// The region ends in a nested file or macro expansion. Create a
+// separate region for each expansion.
+SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
+assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
+
+if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
+  SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
+
+EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
+if (EndLoc.isInvalid())
+  llvm::report_fatal_error("File exit not handled before popRegions");
+EndDepth--;
+  }
+  if (UnnestStart) {
+// The region begins in a nested file or macro expansion. Create a
+// separate region for each expansion.
+SourceLocation NestedLoc = getEndOfFileOrMacro(StartLoc);
+assert(SM.isWrittenInSameFile(StartLoc, NestedLoc));
+
+if (!isRegionAlreadyAdded(StartLoc, NestedLoc))
+  SourceRegions.emplace_back(Region.getCounter(), StartLoc, NestedLoc);
+
+StartLoc = getIncludeOrExpansionLoc(StartLoc);
+if (StartLoc.isInvalid())
+  llvm::report_fatal_error("File exit not handled before popRegions");
+StartDepth--;
+  }
 }
+Region.setStartLoc(StartLoc);
 Region.setEndLoc(EndLoc);
 
 MostRecentLocation = EndLoc;
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D53244: [Coverage] Fix PR39258: support coverage regions that start deeper than they end

2018-10-13 Thread Orivej Desh via Phabricator via cfe-commits
orivej created this revision.
orivej added reviewers: bogner, rsmith, vsk, aaron.ballman.
Herald added a subscriber: cfe-commits.

popRegions used to assume that the start location of a region can't be nested 
deeper than the end location, which is not always true.


Repository:
  rC Clang

https://reviews.llvm.org/D53244

Files:
  lib/CodeGen/CoverageMappingGen.cpp
  test/CoverageMapping/macros.c


Index: test/CoverageMapping/macros.c
===
--- test/CoverageMapping/macros.c
+++ test/CoverageMapping/macros.c
@@ -4,6 +4,7 @@
 #define MACRO_2 bar()
 #define MACRO_1 return; MACRO_2
 #define MACRO_3 MACRO_2
+#define GOTO goto
 
 void bar() {}
 
@@ -56,6 +57,15 @@
 // CHECK-NEXT: Expansion,File 1, 6:17 -> 6:24 = #1
 // CHECK-NEXT: File 2, 4:17 -> 4:22 = #1
 
+// CHECK-NEXT: func6
+void func6(unsigned count) { // CHECK-NEXT: File 0, [[@LINE]]:28 -> 
[[@LINE+4]]:2 = #0
+begin:   // CHECK-NEXT: File 0, [[@LINE]]:1 -> 
[[@LINE+3]]:2 = #1
+if (count--) // CHECK-NEXT: File 0, [[@LINE]]:9 -> 
[[@LINE]]:16 = #1
+GOTO begin;  // CHECK-NEXT: File 0, [[@LINE]]:9 -> 
[[@LINE]]:19 = #2
+}
+// CHECK-NEXT: Expansion,File 0, 64:9 -> 64:13 = #2
+// CHECK-NEXT: File 1, 7:14 -> 7:18 = #2
+
 int main(int argc, const char *argv[]) {
   func();
   func2();
Index: lib/CodeGen/CoverageMappingGen.cpp
===
--- lib/CodeGen/CoverageMappingGen.cpp
+++ lib/CodeGen/CoverageMappingGen.cpp
@@ -552,6 +552,15 @@
 completeDeferred(Count, DeferredEndLoc);
   }
 
+  size_t locactionDepth(SourceLocation Loc) {
+size_t Depth = 0;
+while (Loc.isValid()) {
+  Loc = getIncludeOrExpansionLoc(Loc);
+  Depth++;
+}
+return Depth;
+  }
+
   /// Pop regions from the stack into the function's list of regions.
   ///
   /// Adds all regions from \c ParentIndex to the top of the stack to the
@@ -566,19 +575,35 @@
 SourceLocation EndLoc = Region.hasEndLoc()
 ? Region.getEndLoc()
 : RegionStack[ParentIndex].getEndLoc();
+bool UnnestEnd = locactionDepth(EndLoc) > locactionDepth(StartLoc);
 while (!SM.isWrittenInSameFile(StartLoc, EndLoc)) {
-  // The region ends in a nested file or macro expansion. Create a
-  // separate region for each expansion.
-  SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
-  assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
-
-  if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
-SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc);
-
-  EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
-  if (EndLoc.isInvalid())
-llvm::report_fatal_error("File exit not handled before 
popRegions");
+  if (UnnestEnd) {
+// The region ends in a nested file or macro expansion. Create a
+// separate region for each expansion.
+SourceLocation NestedLoc = getStartOfFileOrMacro(EndLoc);
+assert(SM.isWrittenInSameFile(NestedLoc, EndLoc));
+
+if (!isRegionAlreadyAdded(NestedLoc, EndLoc))
+  SourceRegions.emplace_back(Region.getCounter(), NestedLoc, 
EndLoc);
+
+EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc));
+if (EndLoc.isInvalid())
+  llvm::report_fatal_error("File exit not handled before 
popRegions");
+  } else {
+// The region begins in a nested file or macro expansion. Create a
+// separate region for each expansion.
+SourceLocation NestedLoc = getEndOfFileOrMacro(StartLoc);
+assert(SM.isWrittenInSameFile(StartLoc, NestedLoc));
+
+if (!isRegionAlreadyAdded(StartLoc, NestedLoc))
+  SourceRegions.emplace_back(Region.getCounter(), StartLoc, 
NestedLoc);
+
+StartLoc = getIncludeOrExpansionLoc(StartLoc);
+if (StartLoc.isInvalid())
+  llvm::report_fatal_error("File exit not handled before 
popRegions");
+  }
 }
+Region.setStartLoc(StartLoc);
 Region.setEndLoc(EndLoc);
 
 MostRecentLocation = EndLoc;


Index: test/CoverageMapping/macros.c
===
--- test/CoverageMapping/macros.c
+++ test/CoverageMapping/macros.c
@@ -4,6 +4,7 @@
 #define MACRO_2 bar()
 #define MACRO_1 return; MACRO_2
 #define MACRO_3 MACRO_2
+#define GOTO goto
 
 void bar() {}
 
@@ -56,6 +57,15 @@
 // CHECK-NEXT: Expansion,File 1, 6:17 -> 6:24 = #1
 // CHECK-NEXT: File 2, 4:17 -> 4:22 = #1
 
+// CHECK-NEXT: func6
+void func6(unsigned count) { // CHECK-NEXT: File 0, [[@LINE]]:28 -> [[@LINE+4]]:2 = #0
+begin:   // CHECK-NEXT: File 0, [[@LINE]]:1 -> [[@LINE+3]]:2 = #1
+if (count--) // CHECK-NEXT: File 0,