[llvm] [Coverage] Rework Decision/Expansion/Branch (PR #78969)
Jessica Paquette via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 22 06:36:41 PST 2024
================
@@ -580,6 +583,72 @@ static unsigned getMaxBitmapSize(const CounterMappingContext &Ctx,
return MaxBitmapID + (SizeInBits / CHAR_BIT);
}
+struct DecisionRow {
+ const CounterMappingRegion *DecisionRegion;
+ LineColPair DecisionStartLoc;
+ LineColPair DecisionEndLoc;
+
+ SmallVector<const CounterMappingRegion *, 6> Branches;
+ DenseSet<CounterMappingRegion::MCDCConditionID> IDs;
+ SmallVector<const CounterMappingRegion *> Expansions;
+
+ DecisionRow(const CounterMappingRegion &Decision)
+ : DecisionRegion(&Decision), DecisionStartLoc(Decision.startLoc()),
+ DecisionEndLoc(Decision.endLoc()) {}
+
+ bool insert(const CounterMappingRegion &Branch) {
+ auto ID = Branch.MCDCParams.ID;
+ if (ID == 1)
+ Branches.insert(Branches.begin(), &Branch);
+ else
+ Branches.push_back(&Branch);
+ IDs.insert(ID);
+ return (Branches.size() == DecisionRegion->MCDCParams.NumConditions);
+ }
+
+ enum class UpdateResult {
+ NotFound = 0,
+ Updated,
+ Committed,
+ };
+
+ UpdateResult updateBranch(const CounterMappingRegion &Branch) {
+ if (IDs.contains(Branch.MCDCParams.ID))
+ return UpdateResult::NotFound;
+
+ if (Branch.FileID == DecisionRegion->FileID &&
+ Branch.startLoc() >= DecisionStartLoc &&
+ Branch.endLoc() <= DecisionEndLoc)
+ return (insert(Branch) ? UpdateResult::Committed : UpdateResult::Updated);
+
+ for (const auto *R : Expansions) {
+ if (Branch.FileID == R->ExpandedFileID)
+ return (insert(Branch) ? UpdateResult::Committed
+ : UpdateResult::Updated);
+ }
+
+ return UpdateResult::NotFound;
+ }
+
+ bool updateExpansion(const CounterMappingRegion &Expansion) {
+ if (Expansion.FileID == DecisionRegion->FileID &&
+ Expansion.startLoc() >= DecisionStartLoc &&
+ Expansion.endLoc() <= DecisionEndLoc) {
+ Expansions.push_back(&Expansion);
+ return true;
+ }
+
+ for (const auto *R : Expansions) {
----------------
ornata wrote:
Looks like this could be written as `any_of` or `none_of`.
https://github.com/llvm/llvm-project/blob/3c246efd04210af56ab6ce960b98283ec5bc7c30/llvm/include/llvm/ADT/STLExtras.h#L1745
```
const auto FileID = Expansion.FileID;
if (none_of(Expansions, [&FileID](const CounterMappingRegion *R) {
return R->ExpandedFileID == FileID;
}))
return false;
Expansions.push_back(*E);
return true;
```
https://github.com/llvm/llvm-project/pull/78969
More information about the llvm-commits
mailing list