Skip to content

Commit 03774a3

Browse files
committed
Use enum for range like metadata kinds
1 parent a1c8872 commit 03774a3

File tree

1 file changed

+22
-11
lines changed

1 file changed

+22
-11
lines changed

llvm/lib/IR/Verifier.cpp

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,14 @@ class Verifier : public InstVisitor<Verifier>, VerifierSupport {
491491
/// Whether a metadata node is allowed to be, or contain, a DILocation.
492492
enum class AreDebugLocsAllowed { No, Yes };
493493

494+
/// Metadata that should be treated as a range, with slightly different
495+
/// requirements.
496+
enum class RangeLikeMetadataKind {
497+
Range, // MD_range
498+
AbsoluteSymbol, // MD_absolute_symbol
499+
NoaliasAddrspace // MD_noalias_addrspace
500+
};
501+
494502
// Verification methods...
495503
void visitGlobalValue(const GlobalValue &GV);
496504
void visitGlobalVariable(const GlobalVariable &GV);
@@ -514,8 +522,8 @@ class Verifier : public InstVisitor<Verifier>, VerifierSupport {
514522
void visitModuleFlagCGProfileEntry(const MDOperand &MDO);
515523
void visitFunction(const Function &F);
516524
void visitBasicBlock(BasicBlock &BB);
517-
void verifyRangeMetadata(const Value &V, const MDNode *Range, Type *Ty,
518-
bool IsAbsoluteSymbol, bool IsAddrSpaceRange);
525+
void verifyRangeLikeMetadata(const Value &V, const MDNode *Range, Type *Ty,
526+
RangeLikeMetadataKind Kind);
519527
void visitRangeMetadata(Instruction &I, MDNode *Range, Type *Ty);
520528
void visitNoaliasAddrspaceMetadata(Instruction &I, MDNode *Range, Type *Ty);
521529
void visitDereferenceableMetadata(Instruction &I, MDNode *MD);
@@ -760,8 +768,9 @@ void Verifier::visitGlobalValue(const GlobalValue &GV) {
760768
// FIXME: Why is getMetadata on GlobalValue protected?
761769
if (const MDNode *AbsoluteSymbol =
762770
GO->getMetadata(LLVMContext::MD_absolute_symbol)) {
763-
verifyRangeMetadata(*GO, AbsoluteSymbol, DL.getIntPtrType(GO->getType()),
764-
true, false);
771+
verifyRangeLikeMetadata(*GO, AbsoluteSymbol,
772+
DL.getIntPtrType(GO->getType()),
773+
RangeLikeMetadataKind::AbsoluteSymbol);
765774
}
766775
}
767776

@@ -4126,9 +4135,8 @@ static bool isContiguous(const ConstantRange &A, const ConstantRange &B) {
41264135

41274136
/// Verify !range and !absolute_symbol metadata. These have the same
41284137
/// restrictions, except !absolute_symbol allows the full set.
4129-
void Verifier::verifyRangeMetadata(const Value &I, const MDNode *Range,
4130-
Type *Ty, bool IsAbsoluteSymbol,
4131-
bool IsAddrSpaceRange) {
4138+
void Verifier::verifyRangeLikeMetadata(const Value &I, const MDNode *Range,
4139+
Type *Ty, RangeLikeMetadataKind Kind) {
41324140
unsigned NumOperands = Range->getNumOperands();
41334141
Check(NumOperands % 2 == 0, "Unfinished range!", Range);
41344142
unsigned NumRanges = NumOperands / 2;
@@ -4146,7 +4154,7 @@ void Verifier::verifyRangeMetadata(const Value &I, const MDNode *Range,
41464154
Check(High->getType() == Low->getType(), "Range pair types must match!",
41474155
&I);
41484156

4149-
if (IsAddrSpaceRange) {
4157+
if (Kind == RangeLikeMetadataKind::NoaliasAddrspace) {
41504158
Check(High->getType()->isIntegerTy(32),
41514159
"noalias.addrspace type must be i32!", &I);
41524160
} else {
@@ -4163,7 +4171,9 @@ void Verifier::verifyRangeMetadata(const Value &I, const MDNode *Range,
41634171
"The upper and lower limits cannot be the same value", &I);
41644172

41654173
ConstantRange CurRange(LowV, HighV);
4166-
Check(!CurRange.isEmptySet() && (IsAbsoluteSymbol || !CurRange.isFullSet()),
4174+
Check(!CurRange.isEmptySet() &&
4175+
(Kind == RangeLikeMetadataKind::AbsoluteSymbol ||
4176+
!CurRange.isFullSet()),
41674177
"Range must not be empty!", Range);
41684178
if (i != 0) {
41694179
Check(CurRange.intersectWith(LastRange).isEmptySet(),
@@ -4191,14 +4201,15 @@ void Verifier::verifyRangeMetadata(const Value &I, const MDNode *Range,
41914201
void Verifier::visitRangeMetadata(Instruction &I, MDNode *Range, Type *Ty) {
41924202
assert(Range && Range == I.getMetadata(LLVMContext::MD_range) &&
41934203
"precondition violation");
4194-
verifyRangeMetadata(I, Range, Ty, false, false);
4204+
verifyRangeLikeMetadata(I, Range, Ty, RangeLikeMetadataKind::Range);
41954205
}
41964206

41974207
void Verifier::visitNoaliasAddrspaceMetadata(Instruction &I, MDNode *Range,
41984208
Type *Ty) {
41994209
assert(Range && Range == I.getMetadata(LLVMContext::MD_noalias_addrspace) &&
42004210
"precondition violation");
4201-
verifyRangeMetadata(I, Range, Ty, false, true);
4211+
verifyRangeLikeMetadata(I, Range, Ty,
4212+
RangeLikeMetadataKind::NoaliasAddrspace);
42024213
}
42034214

42044215
void Verifier::checkAtomicMemAccessSize(Type *Ty, const Instruction *I) {

0 commit comments

Comments
 (0)