Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MC/DC] Refactor: Make MCDCParams as std::variant #81227

Merged
merged 5 commits into from
Feb 13, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 39 additions & 30 deletions clang/lib/CodeGen/CoverageMappingGen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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<MCDCDecisionParameters>(&MCDCParams);
assert(!DecisionParams || DecisionParams->NumConditions > 0);
return DecisionParams;
}

const auto &getMCDCDecisionParams() const {
return CounterMappingRegion::getParams<const MCDCDecisionParameters>(
MCDCParams);
}

const MCDCParameters &getMCDCParams() const { return MCDCParams; }
};
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -865,8 +877,7 @@ struct CounterCoverageMappingBuilder
std::optional<SourceLocation> StartLoc = std::nullopt,
std::optional<SourceLocation> EndLoc = std::nullopt,
std::optional<Counter> FalseCount = std::nullopt,
MCDCConditionID ID = 0, MCDCConditionID TrueID = 0,
MCDCConditionID FalseID = 0) {
const MCDCParameters &BranchParams = std::monostate()) {

if (StartLoc && !FalseCount) {
MostRecentLocation = *StartLoc;
Expand All @@ -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;
}
Expand All @@ -896,8 +905,8 @@ struct CounterCoverageMappingBuilder
std::optional<SourceLocation> StartLoc = std::nullopt,
std::optional<SourceLocation> EndLoc = std::nullopt) {

RegionStack.emplace_back(MCDCParameters{BitmapIdx, Conditions}, StartLoc,
EndLoc);
RegionStack.emplace_back(MCDCDecisionParameters{BitmapIdx, Conditions},
StartLoc, EndLoc);

return RegionStack.size() - 1;
}
Expand Down Expand Up @@ -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.getCondID(C);
MCDCConditionID TrueID = IDPair.TrueID;
MCDCConditionID FalseID = IDPair.FalseID;
if (ID > 0)
BranchParams = MCDCBranchParameters{ID, IDPair.TrueID, IDPair.FalseID};

// If a condition can fold to true or false, the corresponding branch
// will be removed. Create a region with both counters hard-coded to
Expand All @@ -1054,11 +1064,11 @@ struct CounterCoverageMappingBuilder
// CodeGenFunction.c always returns false, but that is very heavy-handed.
if (ConditionFoldsToBool(C))
popRegions(pushRegion(Counter::getZero(), getStart(C), getEnd(C),
Counter::getZero(), ID, TrueID, FalseID));
Counter::getZero(), BranchParams));
else
// Otherwise, create a region with the True counter and False counter.
popRegions(pushRegion(TrueCnt, getStart(C), getEnd(C), FalseCnt, ID,
TrueID, FalseID));
popRegions(pushRegion(TrueCnt, getStart(C), getEnd(C), FalseCnt,
BranchParams));
}
}

Expand Down Expand Up @@ -1149,12 +1159,9 @@ struct CounterCoverageMappingBuilder
// we've seen this region.
if (StartLocs.insert(Loc).second) {
if (I.isBranch())
SourceRegions.emplace_back(
I.getCounter(), I.getFalseCounter(),
MCDCParameters{0, 0, I.getMCDCParams().ID,
I.getMCDCParams().TrueID,
I.getMCDCParams().FalseID},
Loc, getEndOfFileOrMacro(Loc), I.isBranch());
SourceRegions.emplace_back(I.getCounter(), I.getFalseCounter(),
I.getMCDCParams(), Loc,
getEndOfFileOrMacro(Loc), I.isBranch());
else
SourceRegions.emplace_back(I.getCounter(), Loc,
getEndOfFileOrMacro(Loc));
Expand Down Expand Up @@ -2120,9 +2127,10 @@ static void dump(llvm::raw_ostream &OS, StringRef FunctionName,
OS << "File " << R.FileID << ", " << R.LineStart << ":" << R.ColumnStart
<< " -> " << R.LineEnd << ":" << R.ColumnEnd << " = ";

if (R.Kind == CounterMappingRegion::MCDCDecisionRegion) {
OS << "M:" << R.MCDCParams.BitmapIdx;
OS << ", C:" << R.MCDCParams.NumConditions;
if (const auto *DecisionParams =
std::get_if<MCDCDecisionParameters>(&R.MCDCParams)) {
OS << "M:" << DecisionParams->BitmapIdx;
OS << ", C:" << DecisionParams->NumConditions;
} else {
Ctx.dump(R.Count, OS);

Expand All @@ -2133,9 +2141,10 @@ static void dump(llvm::raw_ostream &OS, StringRef FunctionName,
}
}

if (R.Kind == CounterMappingRegion::MCDCBranchRegion) {
OS << " [" << R.MCDCParams.ID << "," << R.MCDCParams.TrueID;
OS << "," << R.MCDCParams.FalseID << "] ";
if (const auto *BranchParams =
std::get_if<MCDCBranchParameters>(&R.MCDCParams)) {
OS << " [" << BranchParams->ID << "," << BranchParams->TrueID;
OS << "," << BranchParams->FalseID << "] ";
}

if (R.Kind == CounterMappingRegion::ExpansionRegion)
Expand Down
77 changes: 49 additions & 28 deletions llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#include <system_error>
#include <tuple>
#include <utility>
#include <variant>
#include <vector>

namespace llvm {
Expand Down Expand Up @@ -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<std::monostate, MCDCDecisionParameters,
MCDCBranchParameters>;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI, the size of MCDCParameters will be 12 (gnu) or 8 (libc++) finally, with shrinking a few members to int16_t. (#81257)


/// Primary Counter that is also used for Branch Regions (TrueCount).
Counter Count;

Expand All @@ -271,6 +281,24 @@ struct CounterMappingRegion {
/// Parameters used for Modified Condition/Decision Coverage
MCDCParameters MCDCParams;

template <class MaybeConstInnerParameters, class MaybeConstMCDCParameters>
static auto &getParams(MaybeConstMCDCParameters &MCDCParams) {
using InnerParameters =
typename std::remove_const<MaybeConstInnerParameters>::type;
MaybeConstInnerParameters *Params =
std::get_if<InnerParameters>(&MCDCParams);
assert(Params && "InnerParameters unavailable");
return *Params;
}

const auto &getDecisionParams() const {
return getParams<const MCDCDecisionParameters>(MCDCParams);
}

const auto &getBranchParams() const {
return getParams<const MCDCBranchParameters>(MCDCParams);
}

unsigned FileID = 0;
unsigned ExpandedFileID = 0;
unsigned LineStart, ColumnStart, LineEnd, ColumnEnd;
Expand All @@ -284,19 +312,20 @@ struct CounterMappingRegion {
LineStart(LineStart), ColumnStart(ColumnStart), LineEnd(LineEnd),
ColumnEnd(ColumnEnd), Kind(Kind) {}

CounterMappingRegion(Counter Count, Counter FalseCount,
MCDCParameters MCDCParams, unsigned FileID,
CounterMappingRegion(Counter Count, Counter FalseCount, unsigned FileID,
unsigned ExpandedFileID, unsigned LineStart,
unsigned ColumnStart, unsigned LineEnd,
unsigned ColumnEnd, RegionKind Kind)
unsigned ColumnEnd, RegionKind Kind,
const MCDCParameters &MCDCParams = std::monostate())
: Count(Count), FalseCount(FalseCount), MCDCParams(MCDCParams),
FileID(FileID), ExpandedFileID(ExpandedFileID), LineStart(LineStart),
ColumnStart(ColumnStart), LineEnd(LineEnd), ColumnEnd(ColumnEnd),
Kind(Kind) {}

CounterMappingRegion(MCDCParameters MCDCParams, unsigned FileID,
unsigned LineStart, unsigned ColumnStart,
unsigned LineEnd, unsigned ColumnEnd, RegionKind Kind)
CounterMappingRegion(const MCDCDecisionParameters &MCDCParams,
unsigned FileID, unsigned LineStart,
unsigned ColumnStart, unsigned LineEnd,
unsigned ColumnEnd, RegionKind Kind)
: MCDCParams(MCDCParams), FileID(FileID), LineStart(LineStart),
ColumnStart(ColumnStart), LineEnd(LineEnd), ColumnEnd(ColumnEnd),
Kind(Kind) {}
Expand Down Expand Up @@ -333,24 +362,18 @@ struct CounterMappingRegion {
static CounterMappingRegion
makeBranchRegion(Counter Count, Counter FalseCount, unsigned FileID,
unsigned LineStart, unsigned ColumnStart, unsigned LineEnd,
unsigned ColumnEnd) {
return CounterMappingRegion(Count, FalseCount, MCDCParameters(), FileID, 0,
LineStart, ColumnStart, LineEnd, ColumnEnd,
BranchRegion);
}

static CounterMappingRegion
makeBranchRegion(Counter Count, Counter FalseCount, MCDCParameters MCDCParams,
unsigned FileID, unsigned LineStart, unsigned ColumnStart,
unsigned LineEnd, unsigned ColumnEnd) {
return CounterMappingRegion(Count, FalseCount, MCDCParams, FileID, 0,
LineStart, ColumnStart, LineEnd, ColumnEnd,
MCDCParams.ID == 0 ? BranchRegion
: MCDCBranchRegion);
unsigned ColumnEnd,
const MCDCParameters &MCDCParams = std::monostate()) {
return CounterMappingRegion(Count, FalseCount, FileID, 0, LineStart,
ColumnStart, LineEnd, ColumnEnd,
(std::get_if<MCDCBranchParameters>(&MCDCParams)
? MCDCBranchRegion
: BranchRegion),
MCDCParams);
}

static CounterMappingRegion
makeDecisionRegion(MCDCParameters MCDCParams, unsigned FileID,
makeDecisionRegion(const MCDCDecisionParameters &MCDCParams, unsigned FileID,
unsigned LineStart, unsigned ColumnStart, unsigned LineEnd,
unsigned ColumnEnd) {
return CounterMappingRegion(MCDCParams, FileID, LineStart, ColumnStart,
Expand Down Expand Up @@ -415,9 +438,7 @@ struct MCDCRecord {

CounterMappingRegion getDecisionRegion() const { return Region; }
unsigned getNumConditions() const {
assert(Region.MCDCParams.NumConditions != 0 &&
"In MC/DC, NumConditions should never be zero!");
return Region.MCDCParams.NumConditions;
return Region.getDecisionParams().NumConditions;
}
unsigned getNumTestVectors() const { return TV.size(); }
bool isCondFolded(unsigned Condition) const { return Folded[Condition]; }
Expand Down
Loading
Loading