From bb9cef7628ecda692081e5690dbb890dcececd15 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Thu, 10 Dec 2020 16:58:16 +0000 Subject: [PATCH] [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 --- llvm/include/llvm/IR/InstrTypes.h | 18 +++++++++++++++++- llvm/lib/IR/Instructions.cpp | 10 ---------- llvm/unittests/IR/InstructionsTest.cpp | 5 +++++ 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/llvm/include/llvm/IR/InstrTypes.h b/llvm/include/llvm/IR/InstrTypes.h index 8af18e1..8a702e3c 100644 --- a/llvm/include/llvm/IR/InstrTypes.h +++ b/llvm/include/llvm/IR/InstrTypes.h @@ -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 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 74a95da..47bf396 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 419cddc..c9d6d84 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) { -- 2.7.4