mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 23:51:56 +00:00
[CallBase] Add hasRetAttr version that takes StringRef.
This makes it slightly easier to deal with custom attributes and CallBase already provides hasFnAttr versions that support both AttrKind and StringRef arguments in a similar fashion. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D92567
This commit is contained in:
parent
9c4cddb53a
commit
bb9cef7628
@ -1553,7 +1553,11 @@ public:
|
||||
}
|
||||
|
||||
/// Determine whether the return value has the given attribute.
|
||||
bool hasRetAttr(Attribute::AttrKind Kind) const;
|
||||
bool hasRetAttr(Attribute::AttrKind Kind) const {
|
||||
return hasRetAttrImpl(Kind);
|
||||
}
|
||||
/// Determine whether the return value has the given attribute.
|
||||
bool hasRetAttr(StringRef Kind) const { return hasRetAttrImpl(Kind); }
|
||||
|
||||
/// Determine whether the argument or parameter has the given attribute.
|
||||
bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const;
|
||||
@ -2232,6 +2236,18 @@ private:
|
||||
|
||||
return hasFnAttrOnCalledFunction(Kind);
|
||||
}
|
||||
|
||||
/// Determine whether the return value has the given attribute. Supports
|
||||
/// Attribute::AttrKind and StringRef as \p AttrKind types.
|
||||
template <typename AttrKind> bool hasRetAttrImpl(AttrKind Kind) const {
|
||||
if (Attrs.hasAttribute(AttributeList::ReturnIndex, Kind))
|
||||
return true;
|
||||
|
||||
// Look at the callee, if available.
|
||||
if (const Function *F = getCalledFunction())
|
||||
return F->getAttributes().hasAttribute(AttributeList::ReturnIndex, Kind);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
|
@ -322,16 +322,6 @@ Value *CallBase::getReturnedArgOperand() const {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool CallBase::hasRetAttr(Attribute::AttrKind Kind) const {
|
||||
if (Attrs.hasAttribute(AttributeList::ReturnIndex, Kind))
|
||||
return true;
|
||||
|
||||
// Look at the callee, if available.
|
||||
if (const Function *F = getCalledFunction())
|
||||
return F->getAttributes().hasAttribute(AttributeList::ReturnIndex, Kind);
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Determine whether the argument or parameter has the given attribute.
|
||||
bool CallBase::paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
|
||||
assert(ArgNo < getNumArgOperands() && "Param index out of bounds!");
|
||||
|
@ -94,6 +94,11 @@ TEST_F(ModuleWithFunctionTest, CallInst) {
|
||||
EXPECT_EQ(Call->getArgOperand(Idx)->getType(), Arg->getType());
|
||||
Idx++;
|
||||
}
|
||||
|
||||
Call->addAttribute(llvm::AttributeList::ReturnIndex,
|
||||
Attribute::get(Call->getContext(), "test-str-attr"));
|
||||
EXPECT_TRUE(Call->hasRetAttr("test-str-attr"));
|
||||
EXPECT_FALSE(Call->hasRetAttr("not-on-call"));
|
||||
}
|
||||
|
||||
TEST_F(ModuleWithFunctionTest, InvokeInst) {
|
||||
|
Loading…
Reference in New Issue
Block a user