[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
LW-archlinux wrote: Commit 75f0d40507ea3f7c99dd3250ff0fbe6dab341910 breaks build for a multilib 32-bit clang build. See https://github.com/llvm/llvm-project/issues/81880 https://github.com/llvm/llvm-project/pull/81227 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
https://github.com/chapuni closed https://github.com/llvm/llvm-project/pull/81227 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
https://github.com/chapuni edited https://github.com/llvm/llvm-project/pull/81227 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
https://github.com/chapuni updated https://github.com/llvm/llvm-project/pull/81227 >From c2b49a5317bf5b8af419cba814f95cc9305bec21 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Thu, 8 Feb 2024 23:12:54 +0900 Subject: [PATCH 1/3] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` Introduce `MCDCDecisionParameters` and `MCDCBranchParameters` and make sure them not initialized as zero. FIXME: Could we make `CoverageMappingRegion` as a smart tagged union? --- clang/lib/CodeGen/CoverageMappingGen.cpp | 69 + .../ProfileData/Coverage/CoverageMapping.h| 77 --- .../ProfileData/Coverage/CoverageMapping.cpp | 53 +++-- .../Coverage/CoverageMappingReader.cpp| 17 ++-- .../Coverage/CoverageMappingWriter.cpp| 23 -- .../ProfileData/CoverageMappingTest.cpp | 8 +- 6 files changed, 149 insertions(+), 98 deletions(-) diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 0c43317642bca4..da5d43cda91209 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -97,6 +97,8 @@ void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) { namespace { using MCDCConditionID = CounterMappingRegion::MCDCConditionID; using MCDCParameters = CounterMappingRegion::MCDCParameters; +using MCDCBranchParameters = CounterMappingRegion::MCDCBranchParameters; +using MCDCDecisionParameters = CounterMappingRegion::MCDCDecisionParameters; /// A region of source code that can be mapped to a counter. class SourceMappingRegion { @@ -185,7 +187,17 @@ class SourceMappingRegion { bool isBranch() const { return FalseCount.has_value(); } - bool isMCDCDecision() const { return MCDCParams.NumConditions != 0; } + bool isMCDCDecision() const { +const auto *DecisionParams = +std::get_if(&MCDCParams); +assert(!DecisionParams || DecisionParams->NumConditions > 0); +return DecisionParams; + } + + const auto &getMCDCDecisionParams() const { +return CounterMappingRegion::getParams( +MCDCParams); + } const MCDCParameters &getMCDCParams() const { return MCDCParams; } }; @@ -483,13 +495,13 @@ class CoverageMappingBuilder { SR.ColumnEnd)); } else if (Region.isBranch()) { MappingRegions.push_back(CounterMappingRegion::makeBranchRegion( -Region.getCounter(), Region.getFalseCounter(), -Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart, -SR.LineEnd, SR.ColumnEnd)); +Region.getCounter(), Region.getFalseCounter(), *CovFileID, +SR.LineStart, SR.ColumnStart, SR.LineEnd, SR.ColumnEnd, +Region.getMCDCParams())); } else if (Region.isMCDCDecision()) { MappingRegions.push_back(CounterMappingRegion::makeDecisionRegion( -Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart, -SR.LineEnd, SR.ColumnEnd)); +Region.getMCDCDecisionParams(), *CovFileID, SR.LineStart, +SR.ColumnStart, SR.LineEnd, SR.ColumnEnd)); } else { MappingRegions.push_back(CounterMappingRegion::makeRegion( Region.getCounter(), *CovFileID, SR.LineStart, SR.ColumnStart, @@ -865,8 +877,7 @@ struct CounterCoverageMappingBuilder std::optional StartLoc = std::nullopt, std::optional EndLoc = std::nullopt, std::optional FalseCount = std::nullopt, -MCDCConditionID ID = 0, MCDCConditionID TrueID = 0, -MCDCConditionID FalseID = 0) { +const MCDCParameters &BranchParams = std::monostate()) { if (StartLoc && !FalseCount) { MostRecentLocation = *StartLoc; @@ -885,9 +896,7 @@ struct CounterCoverageMappingBuilder StartLoc = std::nullopt; if (EndLoc && EndLoc->isInvalid()) EndLoc = std::nullopt; -RegionStack.emplace_back(Count, FalseCount, - MCDCParameters{0, 0, ID, TrueID, FalseID}, - StartLoc, EndLoc); +RegionStack.emplace_back(Count, FalseCount, BranchParams, StartLoc, EndLoc); return RegionStack.size() - 1; } @@ -896,8 +905,8 @@ struct CounterCoverageMappingBuilder std::optional StartLoc = std::nullopt, std::optional EndLoc = std::nullopt) { -RegionStack.emplace_back(MCDCParameters{BitmapIdx, Conditions}, StartLoc, - EndLoc); +RegionStack.emplace_back(MCDCDecisionParameters{BitmapIdx, Conditions}, + StartLoc, EndLoc); return RegionStack.size() - 1; } @@ -1042,9 +1051,10 @@ struct CounterCoverageMappingBuilder // function's SourceRegions) because it doesn't apply to any other source // code other than the Condition. if (CodeGenFunction::isInstrumentedCondition(C)) { + MCDCParameters BranchParams; MCD
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
https://github.com/ornata approved this pull request. LGTM https://github.com/llvm/llvm-project/pull/81227 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
https://github.com/chapuni updated https://github.com/llvm/llvm-project/pull/81227 >From c2b49a5317bf5b8af419cba814f95cc9305bec21 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Thu, 8 Feb 2024 23:12:54 +0900 Subject: [PATCH 1/3] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` Introduce `MCDCDecisionParameters` and `MCDCBranchParameters` and make sure them not initialized as zero. FIXME: Could we make `CoverageMappingRegion` as a smart tagged union? --- clang/lib/CodeGen/CoverageMappingGen.cpp | 69 + .../ProfileData/Coverage/CoverageMapping.h| 77 --- .../ProfileData/Coverage/CoverageMapping.cpp | 53 +++-- .../Coverage/CoverageMappingReader.cpp| 17 ++-- .../Coverage/CoverageMappingWriter.cpp| 23 -- .../ProfileData/CoverageMappingTest.cpp | 8 +- 6 files changed, 149 insertions(+), 98 deletions(-) diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 0c43317642bca4..da5d43cda91209 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -97,6 +97,8 @@ void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) { namespace { using MCDCConditionID = CounterMappingRegion::MCDCConditionID; using MCDCParameters = CounterMappingRegion::MCDCParameters; +using MCDCBranchParameters = CounterMappingRegion::MCDCBranchParameters; +using MCDCDecisionParameters = CounterMappingRegion::MCDCDecisionParameters; /// A region of source code that can be mapped to a counter. class SourceMappingRegion { @@ -185,7 +187,17 @@ class SourceMappingRegion { bool isBranch() const { return FalseCount.has_value(); } - bool isMCDCDecision() const { return MCDCParams.NumConditions != 0; } + bool isMCDCDecision() const { +const auto *DecisionParams = +std::get_if(&MCDCParams); +assert(!DecisionParams || DecisionParams->NumConditions > 0); +return DecisionParams; + } + + const auto &getMCDCDecisionParams() const { +return CounterMappingRegion::getParams( +MCDCParams); + } const MCDCParameters &getMCDCParams() const { return MCDCParams; } }; @@ -483,13 +495,13 @@ class CoverageMappingBuilder { SR.ColumnEnd)); } else if (Region.isBranch()) { MappingRegions.push_back(CounterMappingRegion::makeBranchRegion( -Region.getCounter(), Region.getFalseCounter(), -Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart, -SR.LineEnd, SR.ColumnEnd)); +Region.getCounter(), Region.getFalseCounter(), *CovFileID, +SR.LineStart, SR.ColumnStart, SR.LineEnd, SR.ColumnEnd, +Region.getMCDCParams())); } else if (Region.isMCDCDecision()) { MappingRegions.push_back(CounterMappingRegion::makeDecisionRegion( -Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart, -SR.LineEnd, SR.ColumnEnd)); +Region.getMCDCDecisionParams(), *CovFileID, SR.LineStart, +SR.ColumnStart, SR.LineEnd, SR.ColumnEnd)); } else { MappingRegions.push_back(CounterMappingRegion::makeRegion( Region.getCounter(), *CovFileID, SR.LineStart, SR.ColumnStart, @@ -865,8 +877,7 @@ struct CounterCoverageMappingBuilder std::optional StartLoc = std::nullopt, std::optional EndLoc = std::nullopt, std::optional FalseCount = std::nullopt, -MCDCConditionID ID = 0, MCDCConditionID TrueID = 0, -MCDCConditionID FalseID = 0) { +const MCDCParameters &BranchParams = std::monostate()) { if (StartLoc && !FalseCount) { MostRecentLocation = *StartLoc; @@ -885,9 +896,7 @@ struct CounterCoverageMappingBuilder StartLoc = std::nullopt; if (EndLoc && EndLoc->isInvalid()) EndLoc = std::nullopt; -RegionStack.emplace_back(Count, FalseCount, - MCDCParameters{0, 0, ID, TrueID, FalseID}, - StartLoc, EndLoc); +RegionStack.emplace_back(Count, FalseCount, BranchParams, StartLoc, EndLoc); return RegionStack.size() - 1; } @@ -896,8 +905,8 @@ struct CounterCoverageMappingBuilder std::optional StartLoc = std::nullopt, std::optional EndLoc = std::nullopt) { -RegionStack.emplace_back(MCDCParameters{BitmapIdx, Conditions}, StartLoc, - EndLoc); +RegionStack.emplace_back(MCDCDecisionParameters{BitmapIdx, Conditions}, + StartLoc, EndLoc); return RegionStack.size() - 1; } @@ -1042,9 +1051,10 @@ struct CounterCoverageMappingBuilder // function's SourceRegions) because it doesn't apply to any other source // code other than the Condition. if (CodeGenFunction::isInstrumentedCondition(C)) { + MCDCParameters BranchParams; MCD
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
@@ -308,13 +309,21 @@ Error RawCoverageMappingReader::readMappingRegionsSubArray( return Err; if (auto Err = readIntMax(FID, std::numeric_limits::max())) return Err; + if (ID == 0) +return make_error( +coveragemap_error::malformed, +"MCDCConditionID shouldn't be zero"); + Params = CounterMappingRegion::MCDCBranchParameters{ + (unsigned)ID, (unsigned)TID, (unsigned)FID}; chapuni wrote: I was so lazy since their casts would be removed by other PRs. I'll do shortly. https://github.com/llvm/llvm-project/pull/81227 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
https://github.com/chapuni commented: @ornata I want to isolate Decision stuff and Branch stuff in `MCDCParams`. Also I'd like to encapsulate params into each record. Once parameters are set, they are expected to hold "valid" values. Zeroing really confused me, (possibly us). I've found `std::variant` works good for this area. I expect it will mitigate confusions little a bit. https://github.com/llvm/llvm-project/pull/81227 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
https://github.com/chapuni edited https://github.com/llvm/llvm-project/pull/81227 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
ornata wrote: Is the main benefit of this avoiding zero initialization? https://github.com/llvm/llvm-project/pull/81227 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
@@ -308,13 +309,21 @@ Error RawCoverageMappingReader::readMappingRegionsSubArray( return Err; if (auto Err = readIntMax(FID, std::numeric_limits::max())) return Err; + if (ID == 0) +return make_error( +coveragemap_error::malformed, +"MCDCConditionID shouldn't be zero"); + Params = CounterMappingRegion::MCDCBranchParameters{ + (unsigned)ID, (unsigned)TID, (unsigned)FID}; ornata wrote: `static_cast`? https://github.com/llvm/llvm-project/pull/81227 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
https://github.com/chapuni updated https://github.com/llvm/llvm-project/pull/81227 >From c2b49a5317bf5b8af419cba814f95cc9305bec21 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Thu, 8 Feb 2024 23:12:54 +0900 Subject: [PATCH 1/2] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` Introduce `MCDCDecisionParameters` and `MCDCBranchParameters` and make sure them not initialized as zero. FIXME: Could we make `CoverageMappingRegion` as a smart tagged union? --- clang/lib/CodeGen/CoverageMappingGen.cpp | 69 + .../ProfileData/Coverage/CoverageMapping.h| 77 --- .../ProfileData/Coverage/CoverageMapping.cpp | 53 +++-- .../Coverage/CoverageMappingReader.cpp| 17 ++-- .../Coverage/CoverageMappingWriter.cpp| 23 -- .../ProfileData/CoverageMappingTest.cpp | 8 +- 6 files changed, 149 insertions(+), 98 deletions(-) diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 0c43317642bca4..da5d43cda91209 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -97,6 +97,8 @@ void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) { namespace { using MCDCConditionID = CounterMappingRegion::MCDCConditionID; using MCDCParameters = CounterMappingRegion::MCDCParameters; +using MCDCBranchParameters = CounterMappingRegion::MCDCBranchParameters; +using MCDCDecisionParameters = CounterMappingRegion::MCDCDecisionParameters; /// A region of source code that can be mapped to a counter. class SourceMappingRegion { @@ -185,7 +187,17 @@ class SourceMappingRegion { bool isBranch() const { return FalseCount.has_value(); } - bool isMCDCDecision() const { return MCDCParams.NumConditions != 0; } + bool isMCDCDecision() const { +const auto *DecisionParams = +std::get_if(&MCDCParams); +assert(!DecisionParams || DecisionParams->NumConditions > 0); +return DecisionParams; + } + + const auto &getMCDCDecisionParams() const { +return CounterMappingRegion::getParams( +MCDCParams); + } const MCDCParameters &getMCDCParams() const { return MCDCParams; } }; @@ -483,13 +495,13 @@ class CoverageMappingBuilder { SR.ColumnEnd)); } else if (Region.isBranch()) { MappingRegions.push_back(CounterMappingRegion::makeBranchRegion( -Region.getCounter(), Region.getFalseCounter(), -Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart, -SR.LineEnd, SR.ColumnEnd)); +Region.getCounter(), Region.getFalseCounter(), *CovFileID, +SR.LineStart, SR.ColumnStart, SR.LineEnd, SR.ColumnEnd, +Region.getMCDCParams())); } else if (Region.isMCDCDecision()) { MappingRegions.push_back(CounterMappingRegion::makeDecisionRegion( -Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart, -SR.LineEnd, SR.ColumnEnd)); +Region.getMCDCDecisionParams(), *CovFileID, SR.LineStart, +SR.ColumnStart, SR.LineEnd, SR.ColumnEnd)); } else { MappingRegions.push_back(CounterMappingRegion::makeRegion( Region.getCounter(), *CovFileID, SR.LineStart, SR.ColumnStart, @@ -865,8 +877,7 @@ struct CounterCoverageMappingBuilder std::optional StartLoc = std::nullopt, std::optional EndLoc = std::nullopt, std::optional FalseCount = std::nullopt, -MCDCConditionID ID = 0, MCDCConditionID TrueID = 0, -MCDCConditionID FalseID = 0) { +const MCDCParameters &BranchParams = std::monostate()) { if (StartLoc && !FalseCount) { MostRecentLocation = *StartLoc; @@ -885,9 +896,7 @@ struct CounterCoverageMappingBuilder StartLoc = std::nullopt; if (EndLoc && EndLoc->isInvalid()) EndLoc = std::nullopt; -RegionStack.emplace_back(Count, FalseCount, - MCDCParameters{0, 0, ID, TrueID, FalseID}, - StartLoc, EndLoc); +RegionStack.emplace_back(Count, FalseCount, BranchParams, StartLoc, EndLoc); return RegionStack.size() - 1; } @@ -896,8 +905,8 @@ struct CounterCoverageMappingBuilder std::optional StartLoc = std::nullopt, std::optional EndLoc = std::nullopt) { -RegionStack.emplace_back(MCDCParameters{BitmapIdx, Conditions}, StartLoc, - EndLoc); +RegionStack.emplace_back(MCDCDecisionParameters{BitmapIdx, Conditions}, + StartLoc, EndLoc); return RegionStack.size() - 1; } @@ -1042,9 +1051,10 @@ struct CounterCoverageMappingBuilder // function's SourceRegions) because it doesn't apply to any other source // code other than the Condition. if (CodeGenFunction::isInstrumentedCondition(C)) { + MCDCParameters BranchParams; MCD
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
@@ -250,18 +251,27 @@ struct CounterMappingRegion { }; using MCDCConditionID = unsigned int; - struct MCDCParameters { + struct MCDCDecisionParameters { /// Byte Index of Bitmap Coverage Object for a Decision Region. -unsigned BitmapIdx = 0; +unsigned BitmapIdx; /// Number of Conditions used for a Decision Region. -unsigned NumConditions = 0; +unsigned NumConditions; +MCDCDecisionParameters() = delete; + }; + + struct MCDCBranchParameters { /// IDs used to represent a branch region and other branch regions /// evaluated based on True and False branches. -MCDCConditionID ID = 0, TrueID = 0, FalseID = 0; +MCDCConditionID ID, TrueID, FalseID; + +MCDCBranchParameters() = delete; }; + using MCDCParameters = std::variant; chapuni wrote: FYI, the size of `MCDCParameters` will be `12` (gnu) or `8` (libc++) finally, with shrinking a few members to `int16_t`. (#81257) https://github.com/llvm/llvm-project/pull/81227 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
https://github.com/chapuni updated https://github.com/llvm/llvm-project/pull/81227 >From c2b49a5317bf5b8af419cba814f95cc9305bec21 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Thu, 8 Feb 2024 23:12:54 +0900 Subject: [PATCH] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` Introduce `MCDCDecisionParameters` and `MCDCBranchParameters` and make sure them not initialized as zero. FIXME: Could we make `CoverageMappingRegion` as a smart tagged union? --- clang/lib/CodeGen/CoverageMappingGen.cpp | 69 + .../ProfileData/Coverage/CoverageMapping.h| 77 --- .../ProfileData/Coverage/CoverageMapping.cpp | 53 +++-- .../Coverage/CoverageMappingReader.cpp| 17 ++-- .../Coverage/CoverageMappingWriter.cpp| 23 -- .../ProfileData/CoverageMappingTest.cpp | 8 +- 6 files changed, 149 insertions(+), 98 deletions(-) diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 0c43317642bca..da5d43cda9120 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -97,6 +97,8 @@ void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) { namespace { using MCDCConditionID = CounterMappingRegion::MCDCConditionID; using MCDCParameters = CounterMappingRegion::MCDCParameters; +using MCDCBranchParameters = CounterMappingRegion::MCDCBranchParameters; +using MCDCDecisionParameters = CounterMappingRegion::MCDCDecisionParameters; /// A region of source code that can be mapped to a counter. class SourceMappingRegion { @@ -185,7 +187,17 @@ class SourceMappingRegion { bool isBranch() const { return FalseCount.has_value(); } - bool isMCDCDecision() const { return MCDCParams.NumConditions != 0; } + bool isMCDCDecision() const { +const auto *DecisionParams = +std::get_if(&MCDCParams); +assert(!DecisionParams || DecisionParams->NumConditions > 0); +return DecisionParams; + } + + const auto &getMCDCDecisionParams() const { +return CounterMappingRegion::getParams( +MCDCParams); + } const MCDCParameters &getMCDCParams() const { return MCDCParams; } }; @@ -483,13 +495,13 @@ class CoverageMappingBuilder { SR.ColumnEnd)); } else if (Region.isBranch()) { MappingRegions.push_back(CounterMappingRegion::makeBranchRegion( -Region.getCounter(), Region.getFalseCounter(), -Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart, -SR.LineEnd, SR.ColumnEnd)); +Region.getCounter(), Region.getFalseCounter(), *CovFileID, +SR.LineStart, SR.ColumnStart, SR.LineEnd, SR.ColumnEnd, +Region.getMCDCParams())); } else if (Region.isMCDCDecision()) { MappingRegions.push_back(CounterMappingRegion::makeDecisionRegion( -Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart, -SR.LineEnd, SR.ColumnEnd)); +Region.getMCDCDecisionParams(), *CovFileID, SR.LineStart, +SR.ColumnStart, SR.LineEnd, SR.ColumnEnd)); } else { MappingRegions.push_back(CounterMappingRegion::makeRegion( Region.getCounter(), *CovFileID, SR.LineStart, SR.ColumnStart, @@ -865,8 +877,7 @@ struct CounterCoverageMappingBuilder std::optional StartLoc = std::nullopt, std::optional EndLoc = std::nullopt, std::optional FalseCount = std::nullopt, -MCDCConditionID ID = 0, MCDCConditionID TrueID = 0, -MCDCConditionID FalseID = 0) { +const MCDCParameters &BranchParams = std::monostate()) { if (StartLoc && !FalseCount) { MostRecentLocation = *StartLoc; @@ -885,9 +896,7 @@ struct CounterCoverageMappingBuilder StartLoc = std::nullopt; if (EndLoc && EndLoc->isInvalid()) EndLoc = std::nullopt; -RegionStack.emplace_back(Count, FalseCount, - MCDCParameters{0, 0, ID, TrueID, FalseID}, - StartLoc, EndLoc); +RegionStack.emplace_back(Count, FalseCount, BranchParams, StartLoc, EndLoc); return RegionStack.size() - 1; } @@ -896,8 +905,8 @@ struct CounterCoverageMappingBuilder std::optional StartLoc = std::nullopt, std::optional EndLoc = std::nullopt) { -RegionStack.emplace_back(MCDCParameters{BitmapIdx, Conditions}, StartLoc, - EndLoc); +RegionStack.emplace_back(MCDCDecisionParameters{BitmapIdx, Conditions}, + StartLoc, EndLoc); return RegionStack.size() - 1; } @@ -1042,9 +1051,10 @@ struct CounterCoverageMappingBuilder // function's SourceRegions) because it doesn't apply to any other source // code other than the Condition. if (CodeGenFunction::isInstrumentedCondition(C)) { + MCDCParameters BranchParams; MCDCCondi
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
@@ -264,9 +266,10 @@ class MCDCRecordProcessor { MCDCRecordProcessor(const BitVector &Bitmap, const CounterMappingRegion &Region, ArrayRef Branches) - : Bitmap(Bitmap), Region(Region), Branches(Branches), -NumConditions(Region.MCDCParams.NumConditions), -BitmapIdx(Region.MCDCParams.BitmapIdx * CHAR_BIT), + : Bitmap(Bitmap), Region(Region), +DecisionParams(Region.getDecisionParams()), Branches(Branches), +NumConditions(DecisionParams.NumConditions), +BitmapIdx(DecisionParams.BitmapIdx * CHAR_BIT), Folded(NumConditions, false), IndependencePairs(NumConditions), TestVectors((size_t)1 << NumConditions) {} chapuni wrote: I'll make this mergeable later, possibly tonight. https://github.com/llvm/llvm-project/pull/81227 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
llvmbot wrote: @llvm/pr-subscribers-pgo Author: NAKAMURA Takumi (chapuni) Changes Introduce `MCDCDecisionParameters` and `MCDCBranchParameters` and make sure them not initialized as zero. FIXME: Could we make `CoverageMappingRegion` as a smart tagged union? --- Patch is 25.91 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/81227.diff 6 Files Affected: - (modified) clang/lib/CodeGen/CoverageMappingGen.cpp (+39-30) - (modified) llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h (+49-28) - (modified) llvm/lib/ProfileData/Coverage/CoverageMapping.cpp (+30-23) - (modified) llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp (+9-8) - (modified) llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp (+18-5) - (modified) llvm/unittests/ProfileData/CoverageMappingTest.cpp (+4-4) ``diff diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 0c43317642bca4..da5d43cda91209 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -97,6 +97,8 @@ void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) { namespace { using MCDCConditionID = CounterMappingRegion::MCDCConditionID; using MCDCParameters = CounterMappingRegion::MCDCParameters; +using MCDCBranchParameters = CounterMappingRegion::MCDCBranchParameters; +using MCDCDecisionParameters = CounterMappingRegion::MCDCDecisionParameters; /// A region of source code that can be mapped to a counter. class SourceMappingRegion { @@ -185,7 +187,17 @@ class SourceMappingRegion { bool isBranch() const { return FalseCount.has_value(); } - bool isMCDCDecision() const { return MCDCParams.NumConditions != 0; } + bool isMCDCDecision() const { +const auto *DecisionParams = +std::get_if(&MCDCParams); +assert(!DecisionParams || DecisionParams->NumConditions > 0); +return DecisionParams; + } + + const auto &getMCDCDecisionParams() const { +return CounterMappingRegion::getParams( +MCDCParams); + } const MCDCParameters &getMCDCParams() const { return MCDCParams; } }; @@ -483,13 +495,13 @@ class CoverageMappingBuilder { SR.ColumnEnd)); } else if (Region.isBranch()) { MappingRegions.push_back(CounterMappingRegion::makeBranchRegion( -Region.getCounter(), Region.getFalseCounter(), -Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart, -SR.LineEnd, SR.ColumnEnd)); +Region.getCounter(), Region.getFalseCounter(), *CovFileID, +SR.LineStart, SR.ColumnStart, SR.LineEnd, SR.ColumnEnd, +Region.getMCDCParams())); } else if (Region.isMCDCDecision()) { MappingRegions.push_back(CounterMappingRegion::makeDecisionRegion( -Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart, -SR.LineEnd, SR.ColumnEnd)); +Region.getMCDCDecisionParams(), *CovFileID, SR.LineStart, +SR.ColumnStart, SR.LineEnd, SR.ColumnEnd)); } else { MappingRegions.push_back(CounterMappingRegion::makeRegion( Region.getCounter(), *CovFileID, SR.LineStart, SR.ColumnStart, @@ -865,8 +877,7 @@ struct CounterCoverageMappingBuilder std::optional StartLoc = std::nullopt, std::optional EndLoc = std::nullopt, std::optional FalseCount = std::nullopt, -MCDCConditionID ID = 0, MCDCConditionID TrueID = 0, -MCDCConditionID FalseID = 0) { +const MCDCParameters &BranchParams = std::monostate()) { if (StartLoc && !FalseCount) { MostRecentLocation = *StartLoc; @@ -885,9 +896,7 @@ struct CounterCoverageMappingBuilder StartLoc = std::nullopt; if (EndLoc && EndLoc->isInvalid()) EndLoc = std::nullopt; -RegionStack.emplace_back(Count, FalseCount, - MCDCParameters{0, 0, ID, TrueID, FalseID}, - StartLoc, EndLoc); +RegionStack.emplace_back(Count, FalseCount, BranchParams, StartLoc, EndLoc); return RegionStack.size() - 1; } @@ -896,8 +905,8 @@ struct CounterCoverageMappingBuilder std::optional StartLoc = std::nullopt, std::optional EndLoc = std::nullopt) { -RegionStack.emplace_back(MCDCParameters{BitmapIdx, Conditions}, StartLoc, - EndLoc); +RegionStack.emplace_back(MCDCDecisionParameters{BitmapIdx, Conditions}, + StartLoc, EndLoc); return RegionStack.size() - 1; } @@ -1042,9 +1051,10 @@ struct CounterCoverageMappingBuilder // function's SourceRegions) because it doesn't apply to any other source // code other than the Condition. if (CodeGenFunction::isInstrumentedCondition(C)) { + MCDCParameters BranchParams; MCDCConditionID ID = MCDCBuilder.get
[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)
https://github.com/chapuni created https://github.com/llvm/llvm-project/pull/81227 Introduce `MCDCDecisionParameters` and `MCDCBranchParameters` and make sure them not initialized as zero. FIXME: Could we make `CoverageMappingRegion` as a smart tagged union? >From c2b49a5317bf5b8af419cba814f95cc9305bec21 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Thu, 8 Feb 2024 23:12:54 +0900 Subject: [PATCH] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` Introduce `MCDCDecisionParameters` and `MCDCBranchParameters` and make sure them not initialized as zero. FIXME: Could we make `CoverageMappingRegion` as a smart tagged union? --- clang/lib/CodeGen/CoverageMappingGen.cpp | 69 + .../ProfileData/Coverage/CoverageMapping.h| 77 --- .../ProfileData/Coverage/CoverageMapping.cpp | 53 +++-- .../Coverage/CoverageMappingReader.cpp| 17 ++-- .../Coverage/CoverageMappingWriter.cpp| 23 -- .../ProfileData/CoverageMappingTest.cpp | 8 +- 6 files changed, 149 insertions(+), 98 deletions(-) diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 0c43317642bca4..da5d43cda91209 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -97,6 +97,8 @@ void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) { namespace { using MCDCConditionID = CounterMappingRegion::MCDCConditionID; using MCDCParameters = CounterMappingRegion::MCDCParameters; +using MCDCBranchParameters = CounterMappingRegion::MCDCBranchParameters; +using MCDCDecisionParameters = CounterMappingRegion::MCDCDecisionParameters; /// A region of source code that can be mapped to a counter. class SourceMappingRegion { @@ -185,7 +187,17 @@ class SourceMappingRegion { bool isBranch() const { return FalseCount.has_value(); } - bool isMCDCDecision() const { return MCDCParams.NumConditions != 0; } + bool isMCDCDecision() const { +const auto *DecisionParams = +std::get_if(&MCDCParams); +assert(!DecisionParams || DecisionParams->NumConditions > 0); +return DecisionParams; + } + + const auto &getMCDCDecisionParams() const { +return CounterMappingRegion::getParams( +MCDCParams); + } const MCDCParameters &getMCDCParams() const { return MCDCParams; } }; @@ -483,13 +495,13 @@ class CoverageMappingBuilder { SR.ColumnEnd)); } else if (Region.isBranch()) { MappingRegions.push_back(CounterMappingRegion::makeBranchRegion( -Region.getCounter(), Region.getFalseCounter(), -Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart, -SR.LineEnd, SR.ColumnEnd)); +Region.getCounter(), Region.getFalseCounter(), *CovFileID, +SR.LineStart, SR.ColumnStart, SR.LineEnd, SR.ColumnEnd, +Region.getMCDCParams())); } else if (Region.isMCDCDecision()) { MappingRegions.push_back(CounterMappingRegion::makeDecisionRegion( -Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart, -SR.LineEnd, SR.ColumnEnd)); +Region.getMCDCDecisionParams(), *CovFileID, SR.LineStart, +SR.ColumnStart, SR.LineEnd, SR.ColumnEnd)); } else { MappingRegions.push_back(CounterMappingRegion::makeRegion( Region.getCounter(), *CovFileID, SR.LineStart, SR.ColumnStart, @@ -865,8 +877,7 @@ struct CounterCoverageMappingBuilder std::optional StartLoc = std::nullopt, std::optional EndLoc = std::nullopt, std::optional FalseCount = std::nullopt, -MCDCConditionID ID = 0, MCDCConditionID TrueID = 0, -MCDCConditionID FalseID = 0) { +const MCDCParameters &BranchParams = std::monostate()) { if (StartLoc && !FalseCount) { MostRecentLocation = *StartLoc; @@ -885,9 +896,7 @@ struct CounterCoverageMappingBuilder StartLoc = std::nullopt; if (EndLoc && EndLoc->isInvalid()) EndLoc = std::nullopt; -RegionStack.emplace_back(Count, FalseCount, - MCDCParameters{0, 0, ID, TrueID, FalseID}, - StartLoc, EndLoc); +RegionStack.emplace_back(Count, FalseCount, BranchParams, StartLoc, EndLoc); return RegionStack.size() - 1; } @@ -896,8 +905,8 @@ struct CounterCoverageMappingBuilder std::optional StartLoc = std::nullopt, std::optional EndLoc = std::nullopt) { -RegionStack.emplace_back(MCDCParameters{BitmapIdx, Conditions}, StartLoc, - EndLoc); +RegionStack.emplace_back(MCDCDecisionParameters{BitmapIdx, Conditions}, + StartLoc, EndLoc); return RegionStack.size() - 1; } @@ -1042,9 +1051,10 @@ struct CounterCoverageMappingBuilder // function's SourceRegions) because it