aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CoverageMappingGen.cpp
diff options
context:
space:
mode:
authorNAKAMURA Takumi <geek4civic@gmail.com>2024-02-26 15:47:03 +0900
committerNAKAMURA Takumi <geek4civic@gmail.com>2024-02-26 16:44:19 +0900
commit0c7a605ada6cb392e6e8c16dbccf2b7e59017399 (patch)
tree1d7d90c509fe59c0dabf84db999e585b63a6a74d /clang/lib/CodeGen/CoverageMappingGen.cpp
parentcace477c0b6c3d9494ead66eb725c6e72f27b767 (diff)
downloadllvm-0c7a605ada6cb392e6e8c16dbccf2b7e59017399.zip
llvm-0c7a605ada6cb392e6e8c16dbccf2b7e59017399.tar.gz
llvm-0c7a605ada6cb392e6e8c16dbccf2b7e59017399.tar.bz2
clangCodeGen: [MC/DC] Refactor CoverageGen.
- Introduce `createDecision(E)` for the root node of `VisitBin`. - Handle `mcdc::DecisionParameters` for each Decision method.
Diffstat (limited to 'clang/lib/CodeGen/CoverageMappingGen.cpp')
-rw-r--r--clang/lib/CodeGen/CoverageMappingGen.cpp48
1 files changed, 28 insertions, 20 deletions
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp
index d98ab79..e25a927 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -852,10 +852,6 @@ struct CounterCoverageMappingBuilder
return Counter::getCounter(CounterMap[S]);
}
- auto getBitmapIdx(const Stmt *S) {
- return MCDCState.DecisionByStmt[S].BitmapIdx;
- }
-
/// Push a region onto the stack.
///
/// Returns the index on the stack where the region was pushed. This can be
@@ -888,12 +884,11 @@ struct CounterCoverageMappingBuilder
return RegionStack.size() - 1;
}
- size_t pushRegion(unsigned BitmapIdx, uint16_t Conditions,
+ size_t pushRegion(const mcdc::DecisionParameters &DecisionParams,
std::optional<SourceLocation> StartLoc = std::nullopt,
std::optional<SourceLocation> EndLoc = std::nullopt) {
- RegionStack.emplace_back(mcdc::DecisionParameters{BitmapIdx, Conditions},
- StartLoc, EndLoc);
+ RegionStack.emplace_back(DecisionParams, StartLoc, EndLoc);
return RegionStack.size() - 1;
}
@@ -1059,8 +1054,9 @@ struct CounterCoverageMappingBuilder
/// Create a Decision Region with a BitmapIdx and number of Conditions. This
/// type of region "contains" branch regions, one for each of the conditions.
/// The visualization tool will group everything together.
- void createDecisionRegion(const Expr *C, unsigned BitmapIdx, unsigned Conds) {
- popRegions(pushRegion(BitmapIdx, Conds, getStart(C), getEnd(C)));
+ void createDecisionRegion(const Expr *C,
+ const mcdc::DecisionParameters &DecisionParams) {
+ popRegions(pushRegion(DecisionParams, getStart(C), getEnd(C)));
}
/// Create a Branch Region around a SwitchCase for code coverage
@@ -1312,7 +1308,7 @@ struct CounterCoverageMappingBuilder
return;
assert(SpellingRegion(SM, NewStartLoc, EndLoc).isInSourceOrder());
handleFileExit(NewStartLoc);
- size_t Index = pushRegion({}, NewStartLoc, EndLoc);
+ size_t Index = pushRegion(Counter{}, NewStartLoc, EndLoc);
getRegion().setSkipped(true);
handleFileExit(EndLoc);
popRegions(Index);
@@ -1962,6 +1958,20 @@ struct CounterCoverageMappingBuilder
subtractCounters(ParentCount, TrueCount));
}
+ void createDecision(const BinaryOperator *E) {
+ unsigned NumConds = MCDCBuilder.getTotalConditionsAndReset(E);
+ if (NumConds == 0)
+ return;
+
+ auto DecisionParams = mcdc::DecisionParameters{
+ MCDCState.DecisionByStmt[E].BitmapIdx,
+ NumConds,
+ };
+
+ // Create MCDC Decision Region.
+ createDecisionRegion(E, DecisionParams);
+ }
+
void VisitBinLAnd(const BinaryOperator *E) {
bool IsRootNode = MCDCBuilder.isIdle();
@@ -1982,11 +1992,6 @@ struct CounterCoverageMappingBuilder
// Track RHS True/False Decision.
const auto DecisionRHS = MCDCBuilder.back();
- // Create MCDC Decision Region if at top-level (root).
- unsigned NumConds = 0;
- if (IsRootNode && (NumConds = MCDCBuilder.getTotalConditionsAndReset(E)))
- createDecisionRegion(E, getBitmapIdx(E), NumConds);
-
// Extract the RHS's Execution Counter.
Counter RHSExecCnt = getRegionCounter(E);
@@ -2003,6 +2008,10 @@ struct CounterCoverageMappingBuilder
// Create Branch Region around RHS condition.
createBranchRegion(E->getRHS(), RHSTrueCnt,
subtractCounters(RHSExecCnt, RHSTrueCnt), DecisionRHS);
+
+ // Create MCDC Decision Region if at top-level (root).
+ if (IsRootNode)
+ createDecision(E);
}
// Determine whether the right side of OR operation need to be visited.
@@ -2035,11 +2044,6 @@ struct CounterCoverageMappingBuilder
// Track RHS True/False Decision.
const auto DecisionRHS = MCDCBuilder.back();
- // Create MCDC Decision Region if at top-level (root).
- unsigned NumConds = 0;
- if (IsRootNode && (NumConds = MCDCBuilder.getTotalConditionsAndReset(E)))
- createDecisionRegion(E, getBitmapIdx(E), NumConds);
-
// Extract the RHS's Execution Counter.
Counter RHSExecCnt = getRegionCounter(E);
@@ -2060,6 +2064,10 @@ struct CounterCoverageMappingBuilder
// Create Branch Region around RHS condition.
createBranchRegion(E->getRHS(), subtractCounters(RHSExecCnt, RHSFalseCnt),
RHSFalseCnt, DecisionRHS);
+
+ // Create MCDC Decision Region if at top-level (root).
+ if (IsRootNode)
+ createDecision(E);
}
void VisitLambdaExpr(const LambdaExpr *LE) {