@@ -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,
41914201void 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
41974207void 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
42044215void Verifier::checkAtomicMemAccessSize (Type *Ty, const Instruction *I) {
0 commit comments