diff options
Diffstat (limited to 'clang/lib/CodeGen/CoverageMappingGen.cpp')
-rw-r--r-- | clang/lib/CodeGen/CoverageMappingGen.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 5eb48c2b579..d4ff7dac6c0 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -982,20 +982,28 @@ struct CounterCoverageMappingBuilder Counter ParentCount = getRegion().getCounter(); Counter BodyCount = getRegionCounter(S); + // The loop increment may contain a break or continue. + if (S->getInc()) + BreakContinueStack.emplace_back(); + // Handle the body first so that we can get the backedge count. - BreakContinueStack.push_back(BreakContinue()); + BreakContinueStack.emplace_back(); extendRegion(S->getBody()); Counter BackedgeCount = propagateCounts(BodyCount, S->getBody()); - BreakContinue BC = BreakContinueStack.pop_back_val(); + BreakContinue BodyBC = BreakContinueStack.pop_back_val(); // The increment is essentially part of the body but it needs to include // the count for all the continue statements. - if (const Stmt *Inc = S->getInc()) - propagateCounts(addCounters(BackedgeCount, BC.ContinueCount), Inc); + BreakContinue IncrementBC; + if (const Stmt *Inc = S->getInc()) { + propagateCounts(addCounters(BackedgeCount, BodyBC.ContinueCount), Inc); + IncrementBC = BreakContinueStack.pop_back_val(); + } // Go back to handle the condition. - Counter CondCount = - addCounters(ParentCount, BackedgeCount, BC.ContinueCount); + Counter CondCount = addCounters( + addCounters(ParentCount, BackedgeCount, BodyBC.ContinueCount), + IncrementBC.ContinueCount); if (const Expr *Cond = S->getCond()) { propagateCounts(CondCount, Cond); adjustForOutOfOrderTraversal(getEnd(S)); @@ -1007,8 +1015,8 @@ struct CounterCoverageMappingBuilder if (Gap) fillGapAreaWithCount(Gap->getBegin(), Gap->getEnd(), BodyCount); - Counter OutCount = - addCounters(BC.BreakCount, subtractCounters(CondCount, BodyCount)); + Counter OutCount = addCounters(BodyBC.BreakCount, IncrementBC.BreakCount, + subtractCounters(CondCount, BodyCount)); if (OutCount != ParentCount) pushRegion(OutCount); } |