[PATCH] D53244: [Coverage] Fix PR39258: support coverage regions that start deeper than they end
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
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
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
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
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
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
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
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
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
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,