[PATCH] D19725: [Coverage] Fix an issue where a coverage region might not be created for a macro containing for or while statements.
Justin Bogner via cfe-commits
cfe-commits at lists.llvm.org
Sun May 1 17:40:04 PDT 2016
Igor Kudrin <ikudrin.dev at gmail.com> writes:
> ikudrin created this revision.
> ikudrin added reviewers: bogner, davidxl, vsk.
> ikudrin added a subscriber: cfe-commits.
>
> The situation happened when a macro contained a full loop statement,
> which body ended at the end of the macro.
A comment and a nitpick, then LGTM.
> http://reviews.llvm.org/D19725
>
> Files:
> lib/CodeGen/CoverageMappingGen.cpp
> test/CoverageMapping/macroscopes.cpp
>
> Index: test/CoverageMapping/macroscopes.cpp
> ===================================================================
> --- test/CoverageMapping/macroscopes.cpp
> +++ test/CoverageMapping/macroscopes.cpp
> @@ -22,6 +22,17 @@
> #define starts_a_while while (x < 5)
> #define simple_stmt ++x
>
> +#define macro_with_for \
> + x = 3; \
> + for (int i = 0; i < x; ++i) { \
> + }
> +
> +#define macro_with_while \
> + x = 4; \
> + while (x < 5) { \
> + ++x; \
> + }
> +
> // CHECK: main
> // CHECK-NEXT: File 0, [[@LINE+1]]:12 -> {{[0-9]+}}:2 = #0
> int main() {
> @@ -64,6 +75,11 @@
> simple_stmt;
> ends_a_scope
>
> + // CHECK-NEXT: Expansion,File 0, [[@LINE+1]]:3 -> [[@LINE+1]]:17 = #0
> + macro_with_for
> + // CHECK-NEXT: Expansion,File 0, [[@LINE+1]]:3 -> [[@LINE+1]]:19 = #0
> + macro_with_while
> +
> return 0;
> }
>
> @@ -103,3 +119,10 @@
> // CHECK-NEXT: File 11, 22:31 -> 22:36 = (#0 + #9)
> // CHECK-NEXT: File 12, 23:21 -> 23:24 = #9
> // CHECK-NEXT: File 13, 6:3 -> 7:4 = #9
> +// CHECK-NEXT: File 14, 26:3 -> 28:4 = #0
> +// CHECK-NEXT: File 14, 27:19 -> 27:24 = (#0 + #10)
> +// CHECK-NEXT: File 14, 27:26 -> 27:29 = #10
> +// CHECK-NEXT: File 14, 27:31 -> 28:4 = #10
> +// CHECK-NEXT: File 15, 31:3 -> 34:4 = #0
> +// CHECK-NEXT: File 15, 32:10 -> 32:15 = (#0 + #11)
> +// CHECK-NEXT: File 15, 32:17 -> 34:4 = #11
> Index: lib/CodeGen/CoverageMappingGen.cpp
> ===================================================================
> --- lib/CodeGen/CoverageMappingGen.cpp
> +++ lib/CodeGen/CoverageMappingGen.cpp
> @@ -443,15 +443,30 @@
> return ExitCount;
> }
>
> + /// \brief Check whether a region with bounds \c StartLoc and \c EndLoc
> + /// is already added to \c SourceRegions.
> + bool isRegionAlreadyAdded(SourceLocation StartLoc, SourceLocation EndLoc) {
> + return SourceRegions.rend() !=
> + std::find_if(SourceRegions.rbegin(), SourceRegions.rend(),
Any particular reason for rbegin/rend? I guess you expect the match to
be near the end of the list when it exists?
> + [=](const SourceMappingRegion &Region) {
There's no good reason to capture by value here. Best to use [&] for
efficiency.
> + assert(Region.hasStartLoc() && "incomplete region");
> + assert(Region.hasEndLoc() && "incomplete region");
> + return Region.getStartLoc() == StartLoc &&
> + Region.getEndLoc() == EndLoc;
> + });
> + }
> +
> /// \brief Adjust the most recently visited location to \c EndLoc.
> ///
> /// This should be used after visiting any statements in non-source order.
> void adjustForOutOfOrderTraversal(SourceLocation EndLoc) {
> MostRecentLocation = EndLoc;
> // Avoid adding duplicate regions if we have a completed region on the top
> - // of the stack and are adjusting to the end of a virtual file.
> + // of the stack.
> if (getRegion().hasEndLoc() &&
> - MostRecentLocation == getEndOfFileOrMacro(MostRecentLocation))
> + MostRecentLocation == getEndOfFileOrMacro(MostRecentLocation) &&
> + isRegionAlreadyAdded(getStartOfFileOrMacro(MostRecentLocation),
> + MostRecentLocation))
> MostRecentLocation = getIncludeOrExpansionLoc(MostRecentLocation);
> }
>
More information about the cfe-commits
mailing list