[llvm] XCOFF associated metadata (PR #159096)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 30 12:21:47 PDT 2025


================
@@ -766,6 +766,28 @@ void Verifier::visitGlobalValue(const GlobalValue &GV) {
                               DL.getIntPtrType(GO->getType()),
                               RangeLikeMetadataKind::AbsoluteSymbol);
     }
+
+    if (GO->hasMetadata(LLVMContext::MD_ref)) {
+      SmallVector<MDNode *> MDs;
+      GO->getMetadata(LLVMContext::MD_ref, MDs);
+      for (const MDNode *MD : MDs) {
+        Check(MD->getNumOperands() == 1, "ref metadata must have one operand",
+              &GV, MD);
+        const Metadata *Op = MD->getOperand(0).get();
+        const auto *VM = dyn_cast_or_null<ValueAsMetadata>(Op);
+        Check(VM, "ref metadata must be ValueAsMetadata", GO, MD);
+        if (VM) {
+          Check(isa<PointerType>(VM->getValue()->getType()),
+                "ref value must be pointer typed", GV, MD);
+
+          const Value *Stripped = VM->getValue()->stripPointerCastsAndAliases();
+          Check(isa<GlobalObject>(Stripped) || isa<Constant>(Stripped),
+                "ref metadata must point to a GlobalObject", GO, Stripped);
+          Check(Stripped != GO, "values should not reference themselves", GO,
+                MD);
+        }
+      }
+    }
----------------
nikic wrote:

LangRef says the metadata can only be applied to a definition. If that's correct, the verifier should be enforcing it as well.

https://github.com/llvm/llvm-project/pull/159096


More information about the llvm-commits mailing list