aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CoverageMappingGen.cpp
diff options
context:
space:
mode:
authorZequan Wu <zequanwu@google.com>2020-09-02 14:50:32 -0700
committerZequan Wu <zequanwu@google.com>2020-09-21 12:42:53 -0700
commit9caa3fbe03f43e3eec30262fbba87c1ee15c05a3 (patch)
treee49540c6b7eb9cfc0566cab2b5b84b03195c735e /clang/lib/CodeGen/CoverageMappingGen.cpp
parent6bad3caeb079748a25fd34bd21255824c8dcb8f1 (diff)
downloadllvm-9caa3fbe03f43e3eec30262fbba87c1ee15c05a3.zip
llvm-9caa3fbe03f43e3eec30262fbba87c1ee15c05a3.tar.gz
llvm-9caa3fbe03f43e3eec30262fbba87c1ee15c05a3.tar.bz2
[Coverage] Add empty line regions to SkippedRegions
Differential Revision: https://reviews.llvm.org/D84988
Diffstat (limited to 'clang/lib/CodeGen/CoverageMappingGen.cpp')
-rw-r--r--clang/lib/CodeGen/CoverageMappingGen.cpp78
1 files changed, 46 insertions, 32 deletions
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 0227137..8d9c1979 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -31,40 +31,61 @@
// is textually included.
#define COVMAP_V3
+static llvm::cl::opt<bool> EmptyLineCommentCoverage(
+ "emptyline-comment-coverage",
+ llvm::cl::desc("Emit emptylines and comment lines as skipped regions (only "
+ "disable it on test)"),
+ llvm::cl::init(true), llvm::cl::Hidden);
+
using namespace clang;
using namespace CodeGen;
using namespace llvm::coverage;
CoverageSourceInfo *
CoverageMappingModuleGen::setUpCoverageCallbacks(Preprocessor &PP) {
- CoverageSourceInfo *CoverageInfo = new CoverageSourceInfo();
+ CoverageSourceInfo *CoverageInfo =
+ new CoverageSourceInfo(PP.getSourceManager());
PP.addPPCallbacks(std::unique_ptr<PPCallbacks>(CoverageInfo));
- PP.addCommentHandler(CoverageInfo);
- PP.setPreprocessToken(true);
- PP.setTokenWatcher([CoverageInfo](clang::Token Tok) {
- // Update previous token location.
- CoverageInfo->PrevTokLoc = Tok.getLocation();
- if (Tok.getKind() != clang::tok::eod)
- CoverageInfo->updateNextTokLoc(Tok.getLocation());
- });
+ if (EmptyLineCommentCoverage) {
+ PP.addCommentHandler(CoverageInfo);
+ PP.setEmptylineHandler(CoverageInfo);
+ PP.setPreprocessToken(true);
+ PP.setTokenWatcher([CoverageInfo](clang::Token Tok) {
+ // Update previous token location.
+ CoverageInfo->PrevTokLoc = Tok.getLocation();
+ if (Tok.getKind() != clang::tok::eod)
+ CoverageInfo->updateNextTokLoc(Tok.getLocation());
+ });
+ }
return CoverageInfo;
}
+void CoverageSourceInfo::AddSkippedRange(SourceRange Range) {
+ if (EmptyLineCommentCoverage && !SkippedRanges.empty() &&
+ PrevTokLoc == SkippedRanges.back().PrevTokLoc &&
+ SourceMgr.isWrittenInSameFile(SkippedRanges.back().Range.getEnd(),
+ Range.getBegin()))
+ SkippedRanges.back().Range.setEnd(Range.getEnd());
+ else
+ SkippedRanges.push_back({Range, PrevTokLoc});
+}
+
void CoverageSourceInfo::SourceRangeSkipped(SourceRange Range, SourceLocation) {
- SkippedRanges.push_back({Range});
+ AddSkippedRange(Range);
+}
+
+void CoverageSourceInfo::HandleEmptyline(SourceRange Range) {
+ AddSkippedRange(Range);
}
bool CoverageSourceInfo::HandleComment(Preprocessor &PP, SourceRange Range) {
- SkippedRanges.push_back({Range, PrevTokLoc});
- AfterComment = true;
+ AddSkippedRange(Range);
return false;
}
void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) {
- if (AfterComment) {
+ if (!SkippedRanges.empty() && SkippedRanges.back().NextTokLoc.isInvalid())
SkippedRanges.back().NextTokLoc = Loc;
- AfterComment = false;
- }
}
namespace {
@@ -311,24 +332,17 @@ public:
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 (SM.isWrittenInSameFile(LocStart, PrevTokLoc) &&
- SR.LineStart == PrevTokLine) {
- newSR.LineStart = SR.LineStart + 1;
- newSR.ColumnStart = 1;
+ SR.ColumnStart = 1;
+ if (PrevTokLoc.isValid() && SM.isWrittenInSameFile(LocStart, PrevTokLoc) &&
+ SR.LineStart == SM.getSpellingLineNumber(PrevTokLoc))
+ SR.LineStart++;
+ if (NextTokLoc.isValid() && SM.isWrittenInSameFile(LocEnd, NextTokLoc) &&
+ SR.LineEnd == SM.getSpellingLineNumber(NextTokLoc)) {
+ SR.LineEnd--;
+ SR.ColumnEnd++;
}
- if (SM.isWrittenInSameFile(LocEnd, NextTokLoc) &&
- SR.LineEnd == NextTokLine) {
- newSR.LineEnd = SR.LineEnd - 1;
- newSR.ColumnEnd = SR.ColumnStart + 1;
- }
- if (newSR.isInSourceOrder())
- return newSR;
+ if (SR.isInSourceOrder())
+ return SR;
return None;
}