Index: llvm/trunk/include/llvm/CodeGen/CommandFlags.h =================================================================== --- llvm/trunk/include/llvm/CodeGen/CommandFlags.h +++ llvm/trunk/include/llvm/CodeGen/CommandFlags.h @@ -404,7 +404,8 @@ if (F->getIntrinsicID() == Intrinsic::debugtrap || F->getIntrinsicID() == Intrinsic::trap) Call->addAttribute(llvm::AttributeSet::FunctionIndex, - "trap-func-name", TrapFuncName); + Attribute::get(Ctx, "trap-func-name", + TrapFuncName)); // Let NewAttrs override Attrs. NewAttrs = Attrs.addAttributes(Ctx, AttributeSet::FunctionIndex, NewAttrs); Index: llvm/trunk/include/llvm/IR/Attributes.h =================================================================== --- llvm/trunk/include/llvm/IR/Attributes.h +++ llvm/trunk/include/llvm/IR/Attributes.h @@ -338,6 +338,10 @@ /// may be faster. bool hasFnAttribute(Attribute::AttrKind Kind) const; + /// \brief Equivalent to hasAttribute(AttributeSet::FunctionIndex, Kind) but + /// may be faster. + bool hasFnAttribute(StringRef Kind) const; + /// \brief Return true if the specified attribute is set for at least one /// parameter or for the return value. If Index is not nullptr, the index /// of a parameter with the specified attribute is provided. Index: llvm/trunk/include/llvm/IR/CallSite.h =================================================================== --- llvm/trunk/include/llvm/IR/CallSite.h +++ llvm/trunk/include/llvm/IR/CallSite.h @@ -313,10 +313,10 @@ /// getAttributes/setAttributes - get or set the parameter attributes of /// the call. - const AttributeSet &getAttributes() const { + AttributeSet getAttributes() const { CALLSITE_DELEGATE_GETTER(getAttributes()); } - void setAttributes(const AttributeSet &PAL) { + void setAttributes(AttributeSet PAL) { CALLSITE_DELEGATE_SETTER(setAttributes(PAL)); } @@ -324,10 +324,6 @@ CALLSITE_DELEGATE_SETTER(addAttribute(i, Kind)); } - void addAttribute(unsigned i, StringRef Kind, StringRef Value) { - CALLSITE_DELEGATE_SETTER(addAttribute(i, Kind, Value)); - } - void addAttribute(unsigned i, Attribute Attr) { CALLSITE_DELEGATE_SETTER(addAttribute(i, Attr)); } @@ -340,10 +336,6 @@ CALLSITE_DELEGATE_SETTER(removeAttribute(i, Kind)); } - void removeAttribute(unsigned i, Attribute Attr) { - CALLSITE_DELEGATE_SETTER(removeAttribute(i, Attr)); - } - /// \brief Return true if this function has the given attribute. bool hasFnAttr(Attribute::AttrKind Kind) const { CALLSITE_DELEGATE_GETTER(hasFnAttr(Kind)); Index: llvm/trunk/include/llvm/IR/Function.h =================================================================== --- llvm/trunk/include/llvm/IR/Function.h +++ llvm/trunk/include/llvm/IR/Function.h @@ -164,27 +164,23 @@ void setAttributes(AttributeSet Attrs) { AttributeSets = Attrs; } /// @brief Add function attributes to this function. - void addFnAttr(Attribute::AttrKind N) { - setAttributes(AttributeSets.addAttribute(getContext(), - AttributeSet::FunctionIndex, N)); + void addFnAttr(Attribute::AttrKind Kind) { + addAttribute(AttributeSet::FunctionIndex, Kind); } - /// @brief Remove function attributes from this function. - void removeFnAttr(Attribute::AttrKind Kind) { - setAttributes(AttributeSets.removeAttribute( - getContext(), AttributeSet::FunctionIndex, Kind)); + /// @brief Add function attributes to this function. + void addFnAttr(StringRef Kind, StringRef Val = StringRef()) { + addAttribute(AttributeSet::FunctionIndex, + Attribute::get(getContext(), Kind, Val)); } - /// @brief Add function attributes to this function. - void addFnAttr(StringRef Kind) { - setAttributes( - AttributeSets.addAttribute(getContext(), - AttributeSet::FunctionIndex, Kind)); - } - void addFnAttr(StringRef Kind, StringRef Value) { - setAttributes( - AttributeSets.addAttribute(getContext(), - AttributeSet::FunctionIndex, Kind, Value)); + void addFnAttr(Attribute Attr) { + addAttribute(AttributeSet::FunctionIndex, Attr); + } + + /// @brief Remove function attributes from this function. + void removeFnAttr(Attribute::AttrKind Kind) { + removeAttribute(AttributeSet::FunctionIndex, Kind); } /// @brief Remove function attribute from this function. @@ -204,7 +200,7 @@ return AttributeSets.hasFnAttribute(Kind); } bool hasFnAttribute(StringRef Kind) const { - return AttributeSets.hasAttribute(AttributeSet::FunctionIndex, Kind); + return AttributeSets.hasFnAttribute(Kind); } /// @brief Return the attribute for the given attribute kind. Index: llvm/trunk/include/llvm/IR/Instructions.h =================================================================== --- llvm/trunk/include/llvm/IR/Instructions.h +++ llvm/trunk/include/llvm/IR/Instructions.h @@ -1594,19 +1594,16 @@ /// Return the parameter attributes for this call. /// - const AttributeSet &getAttributes() const { return AttributeList; } + AttributeSet getAttributes() const { return AttributeList; } /// Set the parameter attributes for this call. /// - void setAttributes(const AttributeSet &Attrs) { AttributeList = Attrs; } + void setAttributes(AttributeSet Attrs) { AttributeList = Attrs; } /// adds the attribute to the list of attributes. void addAttribute(unsigned i, Attribute::AttrKind Kind); /// adds the attribute to the list of attributes. - void addAttribute(unsigned i, StringRef Kind, StringRef Value); - - /// adds the attribute to the list of attributes. void addAttribute(unsigned i, Attribute Attr); /// removes the attribute from the list of attributes. @@ -1615,9 +1612,6 @@ /// removes the attribute from the list of attributes. void removeAttribute(unsigned i, StringRef Kind); - /// removes the attribute from the list of attributes. - void removeAttribute(unsigned i, Attribute Attr); - /// adds the dereferenceable attribute to the list of attributes. void addDereferenceableAttr(unsigned i, uint64_t Bytes); @@ -1641,10 +1635,14 @@ bool paramHasAttr(unsigned i, Attribute::AttrKind Kind) const; /// Get the attribute of a given kind at a position. - Attribute getAttribute(unsigned i, Attribute::AttrKind Kind) const; + Attribute getAttribute(unsigned i, Attribute::AttrKind Kind) const { + return getAttributes().getAttribute(i, Kind); + } /// Get the attribute of a given kind at a position. - Attribute getAttribute(unsigned i, StringRef Kind) const; + Attribute getAttribute(unsigned i, StringRef Kind) const { + return getAttributes().getAttribute(i, Kind); + } /// Return true if the data operand at index \p i has the attribute \p /// A. @@ -1763,8 +1761,7 @@ addAttribute(AttributeSet::FunctionIndex, Attribute::Convergent); } void setNotConvergent() { - removeAttribute(AttributeSet::FunctionIndex, - Attribute::get(getContext(), Attribute::Convergent)); + removeAttribute(AttributeSet::FunctionIndex, Attribute::Convergent); } /// Determine if the call returns a structure through first @@ -1821,17 +1818,17 @@ } private: - template bool hasFnAttrImpl(AttrKind A) const { - if (AttributeList.hasAttribute(AttributeSet::FunctionIndex, A)) + template bool hasFnAttrImpl(AttrKind Kind) const { + if (AttributeList.hasAttribute(AttributeSet::FunctionIndex, Kind)) return true; // Operand bundles override attributes on the called function, but don't // override attributes directly present on the call instruction. - if (isFnAttrDisallowedByOpBundle(A)) + if (isFnAttrDisallowedByOpBundle(Kind)) return false; if (const Function *F = getCalledFunction()) - return F->getAttributes().hasAttribute(AttributeSet::FunctionIndex, A); + return F->getAttributes().hasAttribute(AttributeSet::FunctionIndex, Kind); return false; } @@ -3567,11 +3564,11 @@ /// Return the parameter attributes for this invoke. /// - const AttributeSet &getAttributes() const { return AttributeList; } + AttributeSet getAttributes() const { return AttributeList; } /// Set the parameter attributes for this invoke. /// - void setAttributes(const AttributeSet &Attrs) { AttributeList = Attrs; } + void setAttributes(AttributeSet Attrs) { AttributeList = Attrs; } /// adds the attribute to the list of attributes. void addAttribute(unsigned i, Attribute::AttrKind Kind); @@ -3585,9 +3582,6 @@ /// removes the attribute from the list of attributes. void removeAttribute(unsigned i, StringRef Kind); - /// removes the attribute from the list of attributes. - void removeAttribute(unsigned i, Attribute Attr); - /// adds the dereferenceable attribute to the list of attributes. void addDereferenceableAttr(unsigned i, uint64_t Bytes); @@ -3611,10 +3605,14 @@ bool paramHasAttr(unsigned i, Attribute::AttrKind Kind) const; /// Get the attribute of a given kind at a position. - Attribute getAttribute(unsigned i, Attribute::AttrKind Kind) const; + Attribute getAttribute(unsigned i, Attribute::AttrKind Kind) const { + return getAttributes().getAttribute(i, Kind); + } /// Get the attribute of a given kind at a position. - Attribute getAttribute(unsigned i, StringRef Kind) const; + Attribute getAttribute(unsigned i, StringRef Kind) const { + return getAttributes().getAttribute(i, Kind); + } /// Return true if the data operand at index \p i has the attribute \p /// A. @@ -3728,8 +3726,7 @@ addAttribute(AttributeSet::FunctionIndex, Attribute::Convergent); } void setNotConvergent() { - removeAttribute(AttributeSet::FunctionIndex, - Attribute::get(getContext(), Attribute::Convergent)); + removeAttribute(AttributeSet::FunctionIndex, Attribute::Convergent); } /// Determine if the call returns a structure through first @@ -3815,17 +3812,17 @@ unsigned getNumSuccessorsV() const override; void setSuccessorV(unsigned idx, BasicBlock *B) override; - template bool hasFnAttrImpl(AttrKind A) const { - if (AttributeList.hasAttribute(AttributeSet::FunctionIndex, A)) + template bool hasFnAttrImpl(AttrKind Kind) const { + if (AttributeList.hasAttribute(AttributeSet::FunctionIndex, Kind)) return true; // Operand bundles override attributes on the called function, but don't // override attributes directly present on the invoke instruction. - if (isFnAttrDisallowedByOpBundle(A)) + if (isFnAttrDisallowedByOpBundle(Kind)) return false; if (const Function *F = getCalledFunction()) - return F->getAttributes().hasAttribute(AttributeSet::FunctionIndex, A); + return F->getAttributes().hasAttribute(AttributeSet::FunctionIndex, Kind); return false; } Index: llvm/trunk/lib/IR/Attributes.cpp =================================================================== --- llvm/trunk/lib/IR/Attributes.cpp +++ llvm/trunk/lib/IR/Attributes.cpp @@ -1115,6 +1115,10 @@ return pImpl && pImpl->hasFnAttribute(Kind); } +bool AttributeSet::hasFnAttribute(StringRef Kind) const { + return hasAttribute(AttributeSet::FunctionIndex, Kind); +} + bool AttributeSet::hasAttrSomewhere(Attribute::AttrKind Attr, unsigned *Index) const { if (!pImpl) return false; Index: llvm/trunk/lib/IR/Instructions.cpp =================================================================== --- llvm/trunk/lib/IR/Instructions.cpp +++ llvm/trunk/lib/IR/Instructions.cpp @@ -350,12 +350,6 @@ setAttributes(PAL); } -void CallInst::addAttribute(unsigned i, StringRef Kind, StringRef Value) { - AttributeSet PAL = getAttributes(); - PAL = PAL.addAttribute(getContext(), i, Kind, Value); - setAttributes(PAL); -} - void CallInst::addAttribute(unsigned i, Attribute Attr) { AttributeSet PAL = getAttributes(); PAL = PAL.addAttribute(getContext(), i, Attr); @@ -374,15 +368,6 @@ setAttributes(PAL); } -void CallInst::removeAttribute(unsigned i, Attribute Attr) { - AttributeSet PAL = getAttributes(); - AttrBuilder B(Attr); - LLVMContext &Context = getContext(); - PAL = PAL.removeAttributes(Context, i, - AttributeSet::get(Context, i, B)); - setAttributes(PAL); -} - void CallInst::addDereferenceableAttr(unsigned i, uint64_t Bytes) { AttributeSet PAL = getAttributes(); PAL = PAL.addDereferenceableAttr(getContext(), i, Bytes); @@ -405,14 +390,6 @@ return false; } -Attribute CallInst::getAttribute(unsigned i, Attribute::AttrKind Kind) const { - return getAttributes().getAttribute(i, Kind); -} - -Attribute CallInst::getAttribute(unsigned i, StringRef Kind) const { - return getAttributes().getAttribute(i, Kind); -} - bool CallInst::dataOperandHasImpliedAttr(unsigned i, Attribute::AttrKind Kind) const { // There are getNumOperands() - 1 data operands. The last operand is the @@ -766,23 +743,6 @@ setAttributes(PAL); } -void InvokeInst::removeAttribute(unsigned i, Attribute Attr) { - AttributeSet PAL = getAttributes(); - AttrBuilder B(Attr); - PAL = PAL.removeAttributes(getContext(), i, - AttributeSet::get(getContext(), i, B)); - setAttributes(PAL); -} - -Attribute InvokeInst::getAttribute(unsigned i, - Attribute::AttrKind Kind) const { - return getAttributes().getAttribute(i, Kind); -} - -Attribute InvokeInst::getAttribute(unsigned i, StringRef Kind) const { - return getAttributes().getAttribute(i, Kind); -} - void InvokeInst::addDereferenceableAttr(unsigned i, uint64_t Bytes) { AttributeSet PAL = getAttributes(); PAL = PAL.addDereferenceableAttr(getContext(), i, Bytes);