@@ -491,6 +491,14 @@ class Verifier : public InstVisitor<Verifier>, VerifierSupport {
491
491
// / Whether a metadata node is allowed to be, or contain, a DILocation.
492
492
enum class AreDebugLocsAllowed { No, Yes };
493
493
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
+
494
502
// Verification methods...
495
503
void visitGlobalValue (const GlobalValue &GV);
496
504
void visitGlobalVariable (const GlobalVariable &GV);
@@ -514,8 +522,8 @@ class Verifier : public InstVisitor<Verifier>, VerifierSupport {
514
522
void visitModuleFlagCGProfileEntry (const MDOperand &MDO);
515
523
void visitFunction (const Function &F);
516
524
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 );
519
527
void visitRangeMetadata (Instruction &I, MDNode *Range, Type *Ty);
520
528
void visitNoaliasAddrspaceMetadata (Instruction &I, MDNode *Range, Type *Ty);
521
529
void visitDereferenceableMetadata (Instruction &I, MDNode *MD);
@@ -760,8 +768,9 @@ void Verifier::visitGlobalValue(const GlobalValue &GV) {
760
768
// FIXME: Why is getMetadata on GlobalValue protected?
761
769
if (const MDNode *AbsoluteSymbol =
762
770
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);
765
774
}
766
775
}
767
776
@@ -4126,9 +4135,8 @@ static bool isContiguous(const ConstantRange &A, const ConstantRange &B) {
4126
4135
4127
4136
// / Verify !range and !absolute_symbol metadata. These have the same
4128
4137
// / 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) {
4132
4140
unsigned NumOperands = Range->getNumOperands ();
4133
4141
Check (NumOperands % 2 == 0 , " Unfinished range!" , Range);
4134
4142
unsigned NumRanges = NumOperands / 2 ;
@@ -4146,7 +4154,7 @@ void Verifier::verifyRangeMetadata(const Value &I, const MDNode *Range,
4146
4154
Check (High->getType () == Low->getType (), " Range pair types must match!" ,
4147
4155
&I);
4148
4156
4149
- if (IsAddrSpaceRange ) {
4157
+ if (Kind == RangeLikeMetadataKind::NoaliasAddrspace ) {
4150
4158
Check (High->getType ()->isIntegerTy (32 ),
4151
4159
" noalias.addrspace type must be i32!" , &I);
4152
4160
} else {
@@ -4163,7 +4171,9 @@ void Verifier::verifyRangeMetadata(const Value &I, const MDNode *Range,
4163
4171
" The upper and lower limits cannot be the same value" , &I);
4164
4172
4165
4173
ConstantRange CurRange (LowV, HighV);
4166
- Check (!CurRange.isEmptySet () && (IsAbsoluteSymbol || !CurRange.isFullSet ()),
4174
+ Check (!CurRange.isEmptySet () &&
4175
+ (Kind == RangeLikeMetadataKind::AbsoluteSymbol ||
4176
+ !CurRange.isFullSet ()),
4167
4177
" Range must not be empty!" , Range);
4168
4178
if (i != 0 ) {
4169
4179
Check (CurRange.intersectWith (LastRange).isEmptySet (),
@@ -4191,14 +4201,15 @@ void Verifier::verifyRangeMetadata(const Value &I, const MDNode *Range,
4191
4201
void Verifier::visitRangeMetadata (Instruction &I, MDNode *Range, Type *Ty) {
4192
4202
assert (Range && Range == I.getMetadata (LLVMContext::MD_range) &&
4193
4203
" precondition violation" );
4194
- verifyRangeMetadata (I, Range, Ty, false , false );
4204
+ verifyRangeLikeMetadata (I, Range, Ty, RangeLikeMetadataKind::Range );
4195
4205
}
4196
4206
4197
4207
void Verifier::visitNoaliasAddrspaceMetadata (Instruction &I, MDNode *Range,
4198
4208
Type *Ty) {
4199
4209
assert (Range && Range == I.getMetadata (LLVMContext::MD_noalias_addrspace) &&
4200
4210
" precondition violation" );
4201
- verifyRangeMetadata (I, Range, Ty, false , true );
4211
+ verifyRangeLikeMetadata (I, Range, Ty,
4212
+ RangeLikeMetadataKind::NoaliasAddrspace);
4202
4213
}
4203
4214
4204
4215
void Verifier::checkAtomicMemAccessSize (Type *Ty, const Instruction *I) {
0 commit comments