Author: Florian Hahn Date: 2020-12-10T17:00:16Z New Revision: bb9cef7628ecda692081e5690dbb890dcececd15
URL: https://github.com/llvm/llvm-project/commit/bb9cef7628ecda692081e5690dbb890dcececd15 DIFF: https://github.com/llvm/llvm-project/commit/bb9cef7628ecda692081e5690dbb890dcececd15.diff LOG: [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 Added: Modified: llvm/include/llvm/IR/InstrTypes.h llvm/lib/IR/Instructions.cpp llvm/unittests/IR/InstructionsTest.cpp Removed: ################################################################################ diff --git a/llvm/include/llvm/IR/InstrTypes.h b/llvm/include/llvm/IR/InstrTypes.h index 8af18e14c474..8a702e3c9c5c 100644 --- a/llvm/include/llvm/IR/InstrTypes.h +++ b/llvm/include/llvm/IR/InstrTypes.h @@ -1553,7 +1553,11 @@ class CallBase : public Instruction { } /// 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 @@ class CallBase : public Instruction { 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 <> diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index 74a95da79932..47bf3966bc27 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -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!"); diff --git a/llvm/unittests/IR/InstructionsTest.cpp b/llvm/unittests/IR/InstructionsTest.cpp index 419cddc0c370..c9d6d846cbab 100644 --- a/llvm/unittests/IR/InstructionsTest.cpp +++ b/llvm/unittests/IR/InstructionsTest.cpp @@ -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) { _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits