diff options
author | Prabhu Rajasekaran <prabhukr@google.com> | 2025-07-18 14:40:54 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-18 14:40:54 -0700 |
commit | 921c6dbecaf49e3ed24b94802f094cd7f61f1873 (patch) | |
tree | d25e45eb05da07ef36276a4fbc4d524285762253 /llvm/lib/IR/Verifier.cpp | |
parent | 6d8e53d4afe46608f47bcb014387c053829cdcf1 (diff) | |
download | llvm-921c6dbecaf49e3ed24b94802f094cd7f61f1873.zip llvm-921c6dbecaf49e3ed24b94802f094cd7f61f1873.tar.gz llvm-921c6dbecaf49e3ed24b94802f094cd7f61f1873.tar.bz2 |
[llvm] Introduce callee_type metadata
Introduce `callee_type` metadata which will be attached to the indirect
call instructions.
The `callee_type` metadata will be used to generate `.callgraph` section
described in this RFC:
https://lists.llvm.org/pipermail/llvm-dev/2021-July/151739.html
Reviewers: morehouse, petrhosek, nikic, ilovepi
Reviewed By: nikic, ilovepi
Pull Request: https://github.com/llvm/llvm-project/pull/87573
Diffstat (limited to 'llvm/lib/IR/Verifier.cpp')
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 8c8ed3c..9bd573e 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -531,6 +531,7 @@ private: void visitCallStackMetadata(MDNode *MD); void visitMemProfMetadata(Instruction &I, MDNode *MD); void visitCallsiteMetadata(Instruction &I, MDNode *MD); + void visitCalleeTypeMetadata(Instruction &I, MDNode *MD); void visitDIAssignIDMetadata(Instruction &I, MDNode *MD); void visitMMRAMetadata(Instruction &I, MDNode *MD); void visitAnnotationMetadata(MDNode *Annotation); @@ -5193,6 +5194,33 @@ void Verifier::visitCallsiteMetadata(Instruction &I, MDNode *MD) { visitCallStackMetadata(MD); } +static inline bool isConstantIntMetadataOperand(const Metadata *MD) { + if (auto *VAL = dyn_cast<ValueAsMetadata>(MD)) + return isa<ConstantInt>(VAL->getValue()); + return false; +} + +void Verifier::visitCalleeTypeMetadata(Instruction &I, MDNode *MD) { + Check(isa<CallBase>(I), "!callee_type metadata should only exist on calls", + &I); + for (Metadata *Op : MD->operands()) { + Check(isa<MDNode>(Op), + "The callee_type metadata must be a list of type metadata nodes", Op); + auto *TypeMD = cast<MDNode>(Op); + Check(TypeMD->getNumOperands() == 2, + "Well-formed generalized type metadata must contain exactly two " + "operands", + Op); + Check(isConstantIntMetadataOperand(TypeMD->getOperand(0)) && + mdconst::extract<ConstantInt>(TypeMD->getOperand(0))->isZero(), + "The first operand of type metadata for functions must be zero", Op); + Check(TypeMD->hasGeneralizedMDString(), + "Only generalized type metadata can be part of the callee_type " + "metadata list", + Op); + } +} + void Verifier::visitAnnotationMetadata(MDNode *Annotation) { Check(isa<MDTuple>(Annotation), "annotation must be a tuple"); Check(Annotation->getNumOperands() >= 1, @@ -5470,6 +5498,9 @@ void Verifier::visitInstruction(Instruction &I) { if (MDNode *MD = I.getMetadata(LLVMContext::MD_callsite)) visitCallsiteMetadata(I, MD); + if (MDNode *MD = I.getMetadata(LLVMContext::MD_callee_type)) + visitCalleeTypeMetadata(I, MD); + if (MDNode *MD = I.getMetadata(LLVMContext::MD_DIAssignID)) visitDIAssignIDMetadata(I, MD); |