diff options
author | Bill Wendling <isanbard@gmail.com> | 2013-01-21 22:44:49 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2013-01-21 22:44:49 +0000 |
commit | 3fc4b96b503fa202411317684a2ba02e41e43072 (patch) | |
tree | 232625bd4381c5b6dd7c7bbec178598e7fd131ac | |
parent | c5f1bc88a2eb7ad9ff924ca90cf88494e5f947b9 (diff) | |
download | external_llvm-3fc4b96b503fa202411317684a2ba02e41e43072.zip external_llvm-3fc4b96b503fa202411317684a2ba02e41e43072.tar.gz external_llvm-3fc4b96b503fa202411317684a2ba02e41e43072.tar.bz2 |
Have AttributeSet::getRetAttributes() return an AttributeSet instead of Attribute.
This further restricts the use of the Attribute class to the Attribute family of
classes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173098 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/IR/Attributes.h | 4 | ||||
-rw-r--r-- | lib/IR/Attributes.cpp | 35 | ||||
-rw-r--r-- | lib/Transforms/IPO/ArgumentPromotion.cpp | 6 | ||||
-rw-r--r-- | lib/Transforms/IPO/DeadArgumentElimination.cpp | 28 | ||||
-rw-r--r-- | lib/Transforms/InstCombine/InstCombineCalls.cpp | 8 |
5 files changed, 48 insertions, 33 deletions
diff --git a/include/llvm/IR/Attributes.h b/include/llvm/IR/Attributes.h index 121eae2..ef80b4d 100644 --- a/include/llvm/IR/Attributes.h +++ b/include/llvm/IR/Attributes.h @@ -254,9 +254,7 @@ public: } /// \brief The attributes for the ret value are returned. - Attribute getRetAttributes() const { - return getAttributes(ReturnIndex); - } + AttributeSet getRetAttributes() const; /// \brief The function attributes are returned. AttributeSet getFnAttributes() const; diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp index d3f284a..5c95d4a 100644 --- a/lib/IR/Attributes.cpp +++ b/lib/IR/Attributes.cpp @@ -544,9 +544,18 @@ AttributeWithIndex AttributeWithIndex::get(LLVMContext &C, unsigned Idx, // AttributeSetImpl Definition //===----------------------------------------------------------------------===// +AttributeSet AttributeSet::getRetAttributes() const { + // FIXME: Remove. + return AttrList && hasAttributes(ReturnIndex) ? + AttributeSet::get(AttrList->getContext(), + AttributeWithIndex::get(ReturnIndex, + getAttributes(ReturnIndex))) : + AttributeSet(); +} + AttributeSet AttributeSet::getFnAttributes() const { // FIXME: Remove. - return AttrList ? + return AttrList && hasAttributes(FunctionIndex) ? AttributeSet::get(AttrList->getContext(), AttributeWithIndex::get(FunctionIndex, getAttributes(FunctionIndex))) : @@ -588,20 +597,22 @@ AttributeSet AttributeSet::get(LLVMContext &C, } AttributeSet AttributeSet::get(LLVMContext &C, unsigned Idx, AttrBuilder &B) { - SmallVector<AttributeWithIndex, 8> Attrs; - for (AttrBuilder::iterator I = B.begin(), E = B.end(); I != E; ++I) { - Attribute::AttrKind Kind = *I; - Attribute A = Attribute::get(C, Kind); + // FIXME: This should be implemented as a loop that creates the + // AttributeWithIndexes that then are used to create the AttributeSet. + if (!B.hasAttributes()) + return AttributeSet(); - if (Kind == Attribute::Alignment) - A.setAlignment(B.getAlignment()); - else if (Kind == Attribute::StackAlignment) - A.setStackAlignment(B.getStackAlignment()); + uint64_t Mask = 0; - Attrs.push_back(AttributeWithIndex::get(Idx, A)); - } + for (AttrBuilder::iterator I = B.begin(), E = B.end(); I != E; ++I) + Mask |= AttributeImpl::getAttrMask(*I); - return get(C, Attrs); + Attribute A = Attribute::decodeLLVMAttributesForBitcode(C, Mask); + if (B.getAlignment()) + A.setAlignment(B.getAlignment()); + if (B.getStackAlignment()) + A.setStackAlignment(B.getStackAlignment()); + return get(C, AttributeWithIndex::get(Idx, A)); } //===----------------------------------------------------------------------===// diff --git a/lib/Transforms/IPO/ArgumentPromotion.cpp b/lib/Transforms/IPO/ArgumentPromotion.cpp index c5b17db..39062e6 100644 --- a/lib/Transforms/IPO/ArgumentPromotion.cpp +++ b/lib/Transforms/IPO/ArgumentPromotion.cpp @@ -519,7 +519,8 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F, // Add any return attributes. if (PAL.hasAttributes(AttributeSet::ReturnIndex)) - AttributesVec.push_back(AttributeWithIndex::get(AttributeSet::ReturnIndex, + AttributesVec.push_back(AttributeWithIndex::get(F->getContext(), + AttributeSet::ReturnIndex, PAL.getRetAttributes())); // First, determine the new argument list @@ -639,7 +640,8 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F, // Add any return attributes. if (CallPAL.hasAttributes(AttributeSet::ReturnIndex)) - AttributesVec.push_back(AttributeWithIndex::get(AttributeSet::ReturnIndex, + AttributesVec.push_back(AttributeWithIndex::get(F->getContext(), + AttributeSet::ReturnIndex, CallPAL.getRetAttributes())); // Loop over the operands, inserting GEP and loads in the caller as diff --git a/lib/Transforms/IPO/DeadArgumentElimination.cpp b/lib/Transforms/IPO/DeadArgumentElimination.cpp index f6486e1..5204248 100644 --- a/lib/Transforms/IPO/DeadArgumentElimination.cpp +++ b/lib/Transforms/IPO/DeadArgumentElimination.cpp @@ -700,9 +700,6 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) { SmallVector<AttributeWithIndex, 8> AttributesVec; const AttributeSet &PAL = F->getAttributes(); - // The existing function return attributes. - Attribute RAttrs = PAL.getRetAttributes(); - // Find out the new return value. Type *RetTy = FTy->getReturnType(); Type *NRetTy = NULL; @@ -757,21 +754,26 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) { assert(NRetTy && "No new return type found?"); + // The existing function return attributes. + AttributeSet RAttrs = PAL.getRetAttributes(); + // Remove any incompatible attributes, but only if we removed all return // values. Otherwise, ensure that we don't have any conflicting attributes // here. Currently, this should not be possible, but special handling might be // required when new return value attributes are added. if (NRetTy->isVoidTy()) RAttrs = - Attribute::get(NRetTy->getContext(), AttrBuilder(RAttrs). - removeAttributes(Attribute::typeIncompatible(NRetTy))); + AttributeSet::get(NRetTy->getContext(), AttributeSet::ReturnIndex, + AttrBuilder(RAttrs, AttributeSet::ReturnIndex). + removeAttributes(Attribute::typeIncompatible(NRetTy))); else - assert(!AttrBuilder(RAttrs). + assert(!AttrBuilder(RAttrs, AttributeSet::ReturnIndex). hasAttributes(Attribute::typeIncompatible(NRetTy)) && "Return attributes no longer compatible?"); - if (RAttrs.hasAttributes()) - AttributesVec.push_back(AttributeWithIndex::get(AttributeSet::ReturnIndex, + if (RAttrs.hasAttributes(AttributeSet::ReturnIndex)) + AttributesVec.push_back(AttributeWithIndex::get(NRetTy->getContext(), + AttributeSet::ReturnIndex, RAttrs)); // Remember which arguments are still alive. @@ -835,14 +837,16 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) { const AttributeSet &CallPAL = CS.getAttributes(); // The call return attributes. - Attribute RAttrs = CallPAL.getRetAttributes(); + AttributeSet RAttrs = CallPAL.getRetAttributes(); // Adjust in case the function was changed to return void. RAttrs = - Attribute::get(NF->getContext(), AttrBuilder(RAttrs). + AttributeSet::get(NF->getContext(), AttributeSet::ReturnIndex, + AttrBuilder(RAttrs, AttributeSet::ReturnIndex). removeAttributes(Attribute::typeIncompatible(NF->getReturnType()))); - if (RAttrs.hasAttributes()) - AttributesVec.push_back(AttributeWithIndex::get(AttributeSet::ReturnIndex, + if (RAttrs.hasAttributes(AttributeSet::ReturnIndex)) + AttributesVec.push_back(AttributeWithIndex::get(NF->getContext(), + AttributeSet::ReturnIndex, RAttrs)); // Declare these outside of the loops, so we can reuse them for the second diff --git a/lib/Transforms/InstCombine/InstCombineCalls.cpp b/lib/Transforms/InstCombine/InstCombineCalls.cpp index f3036d8..6d4f188 100644 --- a/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -1287,10 +1287,10 @@ InstCombiner::transformCallThroughTrampoline(CallSite CS, // mean appending it. Likewise for attributes. // Add any result attributes. - Attribute Attr = Attrs.getRetAttributes(); if (Attrs.hasAttributes(AttributeSet::ReturnIndex)) - NewAttrs.push_back(AttributeWithIndex::get(AttributeSet::ReturnIndex, - Attr)); + NewAttrs.push_back(AttributeWithIndex::get(Caller->getContext(), + AttributeSet::ReturnIndex, + Attrs.getRetAttributes())); { unsigned Idx = 1; @@ -1310,7 +1310,7 @@ InstCombiner::transformCallThroughTrampoline(CallSite CS, // Add the original argument and attributes. NewArgs.push_back(*I); - Attr = Attrs.getParamAttributes(Idx); + Attribute Attr = Attrs.getParamAttributes(Idx); if (Attr.hasAttributes()) NewAttrs.push_back (AttributeWithIndex::get(Idx + (Idx >= NestIdx), Attr)); |