From 8246df61f6de716acf1f8c64fac3c19970a2c174 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Wed, 23 Jan 2013 00:45:55 +0000 Subject: [PATCH] Use the AttributeSet when removing multiple attributes. Use Attribute::AttrKind when removing one attribute. This further encapsulates the use of the attributes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173214 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/Attributes.h | 16 ++++++++++++++-- include/llvm/IR/Function.h | 2 +- lib/IR/Attributes.cpp | 10 ++++++++++ lib/IR/Core.cpp | 12 +++++++----- lib/IR/Function.cpp | 9 ++++++--- lib/IR/Instructions.cpp | 14 ++++++++++---- lib/Transforms/IPO/FunctionAttrs.cpp | 5 +++-- lib/Transforms/IPO/GlobalOpt.cpp | 3 +-- .../Instrumentation/MemorySanitizer.cpp | 11 +++++++---- 9 files changed, 59 insertions(+), 23 deletions(-) diff --git a/include/llvm/IR/Attributes.h b/include/llvm/IR/Attributes.h index 072b9cf43a3..ab989106295 100644 --- a/include/llvm/IR/Attributes.h +++ b/include/llvm/IR/Attributes.h @@ -217,6 +217,11 @@ private: /// list. AttributeSet addAttr(LLVMContext &C, unsigned Idx, Attribute Attrs) const; + /// \brief Remove the specified attribute at the specified index from this + /// attribute list. Since attribute lists are immutable, this returns the new + /// list. + AttributeSet removeAttr(LLVMContext &C, unsigned Idx, Attribute Attrs) const; + explicit AttributeSet(AttributeSetImpl *LI) : AttrList(LI) {} public: AttributeSet() : AttrList(0) {} @@ -254,9 +259,16 @@ public: } /// \brief Remove the specified attribute at the specified index from this - /// attribute list. Since attribute lists are immutable, this returns the new + /// attribute list. Since attribute lists are immutable, this returns the new /// list. - AttributeSet removeAttr(LLVMContext &C, unsigned Idx, Attribute Attrs) const; + AttributeSet removeAttribute(LLVMContext &C, unsigned Idx, + Attribute::AttrKind Attr) const; + + /// \brief Remove the specified attributes at the specified index from this + /// attribute list. Since attribute lists are immutable, this returns the new + /// list. + AttributeSet removeAttributes(LLVMContext &C, unsigned Idx, + AttributeSet Attrs) const; //===--------------------------------------------------------------------===// // Attribute List Accessors diff --git a/include/llvm/IR/Function.h b/include/llvm/IR/Function.h index 46feb8ba282..fe27d9b75d4 100644 --- a/include/llvm/IR/Function.h +++ b/include/llvm/IR/Function.h @@ -189,7 +189,7 @@ public: void addAttributes(unsigned i, AttributeSet attrs); /// @brief removes the attributes from the list of attributes. - void removeAttribute(unsigned i, Attribute attr); + void removeAttributes(unsigned i, AttributeSet attr); /// @brief Extract the alignment for a call or parameter (0=unknown). unsigned getParamAlignment(unsigned i) const { diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp index c67b1f3eee6..a3abd36fc0d 100644 --- a/lib/IR/Attributes.cpp +++ b/lib/IR/Attributes.cpp @@ -730,6 +730,16 @@ AttributeSet AttributeSet::addAttr(LLVMContext &C, unsigned Idx, return get(C, NewAttrList); } +AttributeSet AttributeSet::removeAttribute(LLVMContext &C, unsigned Idx, + Attribute::AttrKind Attr) const { + return removeAttr(C, Idx, Attribute::get(C, Attr)); +} + +AttributeSet AttributeSet::removeAttributes(LLVMContext &C, unsigned Idx, + AttributeSet Attrs) const { + return removeAttr(C, Idx, Attrs.getAttributes(Idx)); +} + AttributeSet AttributeSet::removeAttr(LLVMContext &C, unsigned Idx, Attribute Attrs) const { #ifndef NDEBUG diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp index e72eb699824..0e425367897 100644 --- a/lib/IR/Core.cpp +++ b/lib/IR/Core.cpp @@ -1394,8 +1394,9 @@ void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) { const AttributeSet PAL = Func->getAttributes(); AttrBuilder B(PA); const AttributeSet PALnew = - PAL.removeAttr(Func->getContext(), AttributeSet::FunctionIndex, - Attribute::get(Func->getContext(), B)); + PAL.removeAttributes(Func->getContext(), AttributeSet::FunctionIndex, + AttributeSet::get(Func->getContext(), + AttributeSet::FunctionIndex, B)); Func->setAttributes(PALnew); } @@ -1686,9 +1687,10 @@ void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute PA) { CallSite Call = CallSite(unwrap(Instr)); AttrBuilder B(PA); - Call.setAttributes( - Call.getAttributes().removeAttr(Call->getContext(), index, - Attribute::get(Call->getContext(), B))); + Call.setAttributes(Call.getAttributes() + .removeAttributes(Call->getContext(), index, + AttributeSet::get(Call->getContext(), + index, B))); } void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index, diff --git a/lib/IR/Function.cpp b/lib/IR/Function.cpp index 4d047f6443c..f2f3ec9aab4 100644 --- a/lib/IR/Function.cpp +++ b/lib/IR/Function.cpp @@ -133,7 +133,10 @@ void Argument::addAttr(Attribute attr) { /// removeAttr - Remove a Attribute from an argument void Argument::removeAttr(Attribute attr) { - getParent()->removeAttribute(getArgNo() + 1, attr); + AttrBuilder B(attr); + getParent()->removeAttributes(getArgNo() + 1, + AttributeSet::get(getParent()->getContext(), + getArgNo() + 1, B)); } @@ -263,9 +266,9 @@ void Function::addAttributes(unsigned i, AttributeSet attrs) { setAttributes(PAL); } -void Function::removeAttribute(unsigned i, Attribute attrs) { +void Function::removeAttributes(unsigned i, AttributeSet attrs) { AttributeSet PAL = getAttributes(); - PAL = PAL.removeAttr(getContext(), i, attrs); + PAL = PAL.removeAttributes(getContext(), i, attrs); setAttributes(PAL); } diff --git a/lib/IR/Instructions.cpp b/lib/IR/Instructions.cpp index 8597d5c4524..8a0a465a96b 100644 --- a/lib/IR/Instructions.cpp +++ b/lib/IR/Instructions.cpp @@ -334,14 +334,18 @@ CallInst::CallInst(const CallInst &CI) void CallInst::addAttribute(unsigned i, Attribute attr) { AttributeSet PAL = getAttributes(); AttrBuilder B(attr); - PAL = PAL.addAttributes(getContext(), i, - AttributeSet::get(getContext(), i, B)); + LLVMContext &Context = getContext(); + PAL = PAL.addAttributes(Context, i, + AttributeSet::get(Context, i, B)); setAttributes(PAL); } void CallInst::removeAttribute(unsigned i, Attribute attr) { AttributeSet PAL = getAttributes(); - PAL = PAL.removeAttr(getContext(), i, attr); + AttrBuilder B(attr); + LLVMContext &Context = getContext(); + PAL = PAL.removeAttributes(Context, i, + AttributeSet::get(Context, i, B)); setAttributes(PAL); } @@ -599,7 +603,9 @@ void InvokeInst::addAttribute(unsigned i, Attribute attr) { void InvokeInst::removeAttribute(unsigned i, Attribute attr) { AttributeSet PAL = getAttributes(); - PAL = PAL.removeAttr(getContext(), i, attr); + AttrBuilder B(attr); + PAL = PAL.removeAttributes(getContext(), i, + AttributeSet::get(getContext(), i, B)); setAttributes(PAL); } diff --git a/lib/Transforms/IPO/FunctionAttrs.cpp b/lib/Transforms/IPO/FunctionAttrs.cpp index c267097c4a5..7e46dcb4296 100644 --- a/lib/Transforms/IPO/FunctionAttrs.cpp +++ b/lib/Transforms/IPO/FunctionAttrs.cpp @@ -215,8 +215,9 @@ bool FunctionAttrs::AddReadAttrs(const CallGraphSCC &SCC) { AttrBuilder B; B.addAttribute(Attribute::ReadOnly) .addAttribute(Attribute::ReadNone); - F->removeAttribute(AttributeSet::FunctionIndex, - Attribute::get(F->getContext(), B)); + F->removeAttributes(AttributeSet::FunctionIndex, + AttributeSet::get(F->getContext(), + AttributeSet::FunctionIndex, B)); // Add in the new attribute. F->addAttribute(AttributeSet::FunctionIndex, diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index efec788162b..6fe4316d3bb 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -2072,8 +2072,7 @@ static AttributeSet StripNest(LLVMContext &C, const AttributeSet &Attrs) { continue; // There can be only one. - return Attrs.removeAttr(C, Attrs.getSlot(i).Index, - Attribute::get(C, Attribute::Nest)); + return Attrs.removeAttribute(C, Attrs.getSlot(i).Index, Attribute::Nest); } return Attrs; diff --git a/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/lib/Transforms/Instrumentation/MemorySanitizer.cpp index 20b6de2506d..40f0ebb8cf3 100644 --- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -1461,8 +1461,10 @@ struct MemorySanitizerVisitor : public InstVisitor { AttrBuilder B; B.addAttribute(Attribute::ReadOnly) .addAttribute(Attribute::ReadNone); - Func->removeAttribute(AttributeSet::FunctionIndex, - Attribute::get(Func->getContext(), B)); + Func->removeAttributes(AttributeSet::FunctionIndex, + AttributeSet::get(Func->getContext(), + AttributeSet::FunctionIndex, + B)); } } IRBuilder<> IRB(&I); @@ -1853,8 +1855,9 @@ bool MemorySanitizer::runOnFunction(Function &F) { AttrBuilder B; B.addAttribute(Attribute::ReadOnly) .addAttribute(Attribute::ReadNone); - F.removeAttribute(AttributeSet::FunctionIndex, - Attribute::get(F.getContext(), B)); + F.removeAttributes(AttributeSet::FunctionIndex, + AttributeSet::get(F.getContext(), + AttributeSet::FunctionIndex, B)); return Visitor.runOnFunction(); } -- 2.34.1