diff options
author | NAKAMURA Takumi <geek4civic@gmail.com> | 2024-05-23 13:57:12 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-23 13:57:12 +0900 |
commit | 896bceb9537ecd906668fdd2bcb0310b32174917 (patch) | |
tree | 003c38c4e1fc144d9a063069c557218b43195265 /clang/lib/CodeGen/CoverageMappingGen.cpp | |
parent | beac910c3bfcbf1395f2617874350ee59bc61289 (diff) | |
download | llvm-896bceb9537ecd906668fdd2bcb0310b32174917.zip llvm-896bceb9537ecd906668fdd2bcb0310b32174917.tar.gz llvm-896bceb9537ecd906668fdd2bcb0310b32174917.tar.bz2 |
[MC/DC][Coverage] Add assertions into emitSourceRegions() (#89572)
`emitSourceRegions()` has bugs to emit malformed MC/DC coverage
mappings. They were detected in `llvm-cov` as the crash.
Detect inconsistencies earlier in `clang` with assertions.
* mcdc-scratch-space.c covers #87000.
Diffstat (limited to 'clang/lib/CodeGen/CoverageMappingGen.cpp')
-rw-r--r-- | clang/lib/CodeGen/CoverageMappingGen.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index f4de21b..993d7cc 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -191,6 +191,10 @@ public: bool isBranch() const { return FalseCount.has_value(); } + bool isMCDCBranch() const { + return std::holds_alternative<mcdc::BranchParameters>(MCDCParams); + } + bool isMCDCDecision() const { return std::holds_alternative<mcdc::DecisionParameters>(MCDCParams); } @@ -472,13 +476,19 @@ public: // Ignore regions from system headers unless collecting coverage from // system headers is explicitly enabled. if (!SystemHeadersCoverage && - SM.isInSystemHeader(SM.getSpellingLoc(LocStart))) + SM.isInSystemHeader(SM.getSpellingLoc(LocStart))) { + assert(!Region.isMCDCBranch() && !Region.isMCDCDecision() && + "Don't suppress the condition in system headers"); continue; + } auto CovFileID = getCoverageFileID(LocStart); // Ignore regions that don't have a file, such as builtin macros. - if (!CovFileID) + if (!CovFileID) { + assert(!Region.isMCDCBranch() && !Region.isMCDCDecision() && + "Don't suppress the condition in non-file regions"); continue; + } SourceLocation LocEnd = Region.getEndLoc(); assert(SM.isWrittenInSameFile(LocStart, LocEnd) && @@ -488,8 +498,11 @@ public: // This not only suppresses redundant regions, but sometimes prevents // creating regions with wrong counters if, for example, a statement's // body ends at the end of a nested macro. - if (Filter.count(std::make_pair(LocStart, LocEnd))) + if (Filter.count(std::make_pair(LocStart, LocEnd))) { + assert(!Region.isMCDCBranch() && !Region.isMCDCDecision() && + "Don't suppress the condition"); continue; + } // Find the spelling locations for the mapping region. SpellingRegion SR{SM, LocStart, LocEnd}; |