Skip to content

Commit 1e084c6

Browse files
committed
Use enum for range like metadata kinds
1 parent e51102b commit 1e084c6

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

@@ -4128,9 +4137,8 @@ static bool isContiguous(const ConstantRange &A, const ConstantRange &B) {
41284137

41294138
/// Verify !range and !absolute_symbol metadata. These have the same
41304139
/// restrictions, except !absolute_symbol allows the full set.
4131-
void Verifier::verifyRangeMetadata(const Value &I, const MDNode *Range,
4132-
Type *Ty, bool IsAbsoluteSymbol,
4133-
bool IsAddrSpaceRange) {
4140+
void Verifier::verifyRangeLikeMetadata(const Value &I, const MDNode *Range,
4141+
Type *Ty, RangeLikeMetadataKind Kind) {
41344142
unsigned NumOperands = Range->getNumOperands();
41354143
Check(NumOperands % 2 == 0, "Unfinished range!", Range);
41364144
unsigned NumRanges = NumOperands / 2;
@@ -4148,7 +4156,7 @@ void Verifier::verifyRangeMetadata(const Value &I, const MDNode *Range,
41484156
Check(High->getType() == Low->getType(), "Range pair types must match!",
41494157
&I);
41504158

4151-
if (IsAddrSpaceRange) {
4159+
if (Kind == RangeLikeMetadataKind::NoaliasAddrspace) {
41524160
Check(High->getType()->isIntegerTy(32),
41534161
"noalias.addrspace type must be i32!", &I);
41544162
} else {
@@ -4165,7 +4173,9 @@ void Verifier::verifyRangeMetadata(const Value &I, const MDNode *Range,
41654173
"The upper and lower limits cannot be the same value", &I);
41664174

41674175
ConstantRange CurRange(LowV, HighV);
4168-
Check(!CurRange.isEmptySet() && (IsAbsoluteSymbol || !CurRange.isFullSet()),
4176+
Check(!CurRange.isEmptySet() &&
4177+
(Kind == RangeLikeMetadataKind::AbsoluteSymbol ||
4178+
!CurRange.isFullSet()),
41694179
"Range must not be empty!", Range);
41704180
if (i != 0) {
41714181
Check(CurRange.intersectWith(LastRange).isEmptySet(),
@@ -4193,14 +4203,15 @@ void Verifier::verifyRangeMetadata(const Value &I, const MDNode *Range,
41934203
void Verifier::visitRangeMetadata(Instruction &I, MDNode *Range, Type *Ty) {
41944204
assert(Range && Range == I.getMetadata(LLVMContext::MD_range) &&
41954205
"precondition violation");
4196-
verifyRangeMetadata(I, Range, Ty, false, false);
4206+
verifyRangeLikeMetadata(I, Range, Ty, RangeLikeMetadataKind::Range);
41974207
}
41984208

41994209
void Verifier::visitNoaliasAddrspaceMetadata(Instruction &I, MDNode *Range,
42004210
Type *Ty) {
42014211
assert(Range && Range == I.getMetadata(LLVMContext::MD_noalias_addrspace) &&
42024212
"precondition violation");
4203-
verifyRangeMetadata(I, Range, Ty, false, true);
4213+
verifyRangeLikeMetadata(I, Range, Ty,
4214+
RangeLikeMetadataKind::NoaliasAddrspace);
42044215
}
42054216

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

0 commit comments

Comments
 (0)