diff options
Diffstat (limited to 'clang/lib/CodeGen/CoverageMappingGen.cpp')
-rw-r--r-- | clang/lib/CodeGen/CoverageMappingGen.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 7248abe..cda218e 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -1146,12 +1146,15 @@ struct CounterCoverageMappingBuilder /// Create a Branch Region around a SwitchCase for code coverage /// and add it to the function's SourceRegions. - void createSwitchCaseRegion(const SwitchCase *SC, Counter TrueCnt) { + /// Returns Counter that corresponds to SC. + Counter createSwitchCaseRegion(const SwitchCase *SC, Counter ParentCount) { // Push region onto RegionStack but immediately pop it (which adds it to // the function's SourceRegions) because it doesn't apply to any other // source other than the SwitchCase. + Counter TrueCnt = getRegionCounter(SC); popRegions(pushRegion(TrueCnt, getStart(SC), SC->getColonLoc(), - Counter::getZero())); + subtractCounters(ParentCount, TrueCnt))); + return TrueCnt; } /// Check whether a region with bounds \c StartLoc and \c EndLoc @@ -1863,16 +1866,22 @@ struct CounterCoverageMappingBuilder const SwitchCase *Case = S->getSwitchCaseList(); for (; Case; Case = Case->getNextSwitchCase()) { HasDefaultCase = HasDefaultCase || isa<DefaultStmt>(Case); - auto CaseCount = getRegionCounter(Case); + auto CaseCount = createSwitchCaseRegion(Case, ParentCount); CaseCountSum = addCounters(CaseCountSum, CaseCount, /*Simplify=*/false); - createSwitchCaseRegion(Case, CaseCount); } // If no explicit default case exists, create a branch region to represent // the hidden branch, which will be added later by the CodeGen. This region // will be associated with the switch statement's condition. if (!HasDefaultCase) { - Counter DefaultCount = subtractCounters(ParentCount, CaseCountSum); - createBranchRegion(S->getCond(), Counter::getZero(), DefaultCount); + // Simplify is skipped while building the counters above: it can get + // really slow on top of switches with thousands of cases. Instead, + // trigger simplification by adding zero to the last counter. + CaseCountSum = + addCounters(CaseCountSum, Counter::getZero(), /*Simplify=*/true); + + // This is considered as the False count on SwitchStmt. + Counter SwitchFalse = subtractCounters(ParentCount, CaseCountSum); + createBranchRegion(S->getCond(), CaseCountSum, SwitchFalse); } } |