[clang] 84fffa6 - [Coverage] Adjust skipped regions only if {Prev,Next}TokLoc is in the same file as regions' {start, end}Loc
Zequan Wu via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 18 13:26:30 PDT 2020
Author: Zequan Wu
Date: 2020-08-18T13:26:19-07:00
New Revision: 84fffa67283139954b7764328966b5f766db1003
URL: https://github.com/llvm/llvm-project/commit/84fffa67283139954b7764328966b5f766db1003
DIFF: https://github.com/llvm/llvm-project/commit/84fffa67283139954b7764328966b5f766db1003.diff
LOG: [Coverage] Adjust skipped regions only if {Prev,Next}TokLoc is in the same file as regions' {start, end}Loc
Fix a bug if {Prev, Next}TokLoc is in different file from skipped regions' {start, end}Loc
Differential Revision: https://reviews.llvm.org/D86116
Added:
clang/test/CoverageMapping/Inputs/comment.h
clang/test/CoverageMapping/comment.cpp
Modified:
clang/lib/CodeGen/CoverageMappingGen.cpp
Removed:
################################################################################
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp
index e6e1b2111935..8277804d27c0 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -44,7 +44,8 @@ CoverageMappingModuleGen::setUpCoverageCallbacks(Preprocessor &PP) {
PP.setTokenWatcher([CoverageInfo](clang::Token Tok) {
// Update previous token location.
CoverageInfo->PrevTokLoc = Tok.getLocation();
- CoverageInfo->updateNextTokLoc(Tok.getLocation());
+ if (Tok.getKind() != clang::tok::eod)
+ CoverageInfo->updateNextTokLoc(Tok.getLocation());
});
return CoverageInfo;
}
@@ -305,20 +306,24 @@ class CoverageMappingBuilder {
/// non-comment token. If shrinking the skipped range would make it empty,
/// this returns None.
Optional<SpellingRegion> adjustSkippedRange(SourceManager &SM,
- SpellingRegion SR,
+ SourceLocation LocStart,
+ SourceLocation LocEnd,
SourceLocation PrevTokLoc,
SourceLocation NextTokLoc) {
+ SpellingRegion SR{SM, LocStart, LocEnd};
// If Range begin location is invalid, it's not a comment region.
if (PrevTokLoc.isInvalid())
return SR;
unsigned PrevTokLine = SM.getSpellingLineNumber(PrevTokLoc);
unsigned NextTokLine = SM.getSpellingLineNumber(NextTokLoc);
SpellingRegion newSR(SR);
- if (SR.LineStart == PrevTokLine) {
+ if (SM.isWrittenInSameFile(LocStart, PrevTokLoc) &&
+ SR.LineStart == PrevTokLine) {
newSR.LineStart = SR.LineStart + 1;
newSR.ColumnStart = 1;
}
- if (SR.LineEnd == NextTokLine) {
+ if (SM.isWrittenInSameFile(LocEnd, NextTokLoc) &&
+ SR.LineEnd == NextTokLine) {
newSR.LineEnd = SR.LineEnd - 1;
newSR.ColumnEnd = SR.ColumnStart + 1;
}
@@ -354,14 +359,13 @@ class CoverageMappingBuilder {
auto CovFileID = getCoverageFileID(LocStart);
if (!CovFileID)
continue;
- SpellingRegion SR{SM, LocStart, LocEnd};
- if (Optional<SpellingRegion> res =
- adjustSkippedRange(SM, SR, I.PrevTokLoc, I.NextTokLoc))
- SR = res.getValue();
- else
+ Optional<SpellingRegion> SR =
+ adjustSkippedRange(SM, LocStart, LocEnd, I.PrevTokLoc, I.NextTokLoc);
+ if (!SR.hasValue())
continue;
auto Region = CounterMappingRegion::makeSkipped(
- *CovFileID, SR.LineStart, SR.ColumnStart, SR.LineEnd, SR.ColumnEnd);
+ *CovFileID, SR->LineStart, SR->ColumnStart, SR->LineEnd,
+ SR->ColumnEnd);
// Make sure that we only collect the regions that are inside
// the source code of this function.
if (Region.LineStart >= FileLineRanges[*CovFileID].first &&
diff --git a/clang/test/CoverageMapping/Inputs/comment.h b/clang/test/CoverageMapping/Inputs/comment.h
new file mode 100644
index 000000000000..eec5833c2bd0
--- /dev/null
+++ b/clang/test/CoverageMapping/Inputs/comment.h
@@ -0,0 +1,6 @@
+
+
+
+
+
+x = 0;
diff --git a/clang/test/CoverageMapping/comment.cpp b/clang/test/CoverageMapping/comment.cpp
new file mode 100644
index 000000000000..f8e4b4912e18
--- /dev/null
+++ b/clang/test/CoverageMapping/comment.cpp
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only %s | FileCheck %s
+
+int f() {
+ int x = 0;
+#include "Inputs/comment.h" /*
+ */
+ return x;
+}
+
+// CHECK: File 0, 3:9 -> 8:2 = #0
+// CHECK-NEXT: Expansion,File 0, 5:10 -> 5:28 = #0
+// CHECK-NEXT: Skipped,File 0, 6:1 -> 6:7 = 0
+// CHECK-NEXT: File 1, 1:1 -> 7:1 = #0
More information about the cfe-commits
mailing list